OSDN Git Service

Search for RRO in Java both in SKU subdir and in vendor/overlay
authorJakub Adamek <jakuba@google.com>
Mon, 17 Oct 2016 13:55:36 +0000 (14:55 +0100)
committerJakub Adamek <jakuba@google.com>
Mon, 17 Oct 2016 14:52:47 +0000 (15:52 +0100)
Currently, if the "ro.boot.vendor.overlay.subdir" property is set, we
only search in the subdir. It seems more powerful to search both in
there and in the standard /vendor/overlay directory.

Also, RRO packages have the "priority" attribute in the <overlay>
attribute in AndroidManifest.xml which serves for disambiguation.

Bug: 32202741
Change-Id: I9ef44b8ca4ac0e92ba02e25b3672c6b274fe4639

services/core/java/com/android/server/pm/PackageManagerService.java

index 8419b98..986bae9 100644 (file)
@@ -464,8 +464,8 @@ public class PackageManagerService extends IPackageManager.Stub {
 
     private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay";
     /**
-     * If VENDOR_OVERLAY_SKU_PROPERTY is set, search for runtime resource overlay APKs in
-     * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_SKU_PROPERTY> rather than in
+     * If VENDOR_OVERLAY_SKU_PROPERTY is set, search for runtime resource overlay APKs also in
+     * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_SKU_PROPERTY> in addition to
      * VENDOR_OVERLAY_DIR.
      */
     private static final String VENDOR_OVERLAY_SKU_PROPERTY = "ro.boot.vendor.overlay.sku";
@@ -2271,18 +2271,17 @@ public class PackageManagerService extends IPackageManager.Stub {
                 }
             }
 
-            // Collect vendor overlay packages.
-            // (Do this before scanning any apps.)
+            // Collect vendor overlay packages. (Do this before scanning any apps.)
             // For security and version matching reason, only consider
             // overlay packages if they reside in the right directory.
-            File vendorOverlayDir;
             String overlaySkuDir = SystemProperties.get(VENDOR_OVERLAY_SKU_PROPERTY);
             if (!overlaySkuDir.isEmpty()) {
-                vendorOverlayDir = new File(VENDOR_OVERLAY_DIR, overlaySkuDir);
-            } else {
-                vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
+                scanDirTracedLI(new File(VENDOR_OVERLAY_DIR, overlaySkuDir), mDefParseFlags
+                        | PackageParser.PARSE_IS_SYSTEM
+                        | PackageParser.PARSE_IS_SYSTEM_DIR
+                        | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);
             }
-            scanDirTracedLI(vendorOverlayDir, mDefParseFlags
+            scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags
                     | PackageParser.PARSE_IS_SYSTEM
                     | PackageParser.PARSE_IS_SYSTEM_DIR
                     | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);