Search for RRO both in SKU subdir and in vendor/overlay
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: I7acff1b7f0e153830924047349f003295648a53b
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index da9415d..52b7ef4 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -187,18 +187,17 @@
argv[argc++] = AssetManager::IDMAP_DIR;
// Directories to scan for overlays: if OVERLAY_SKU_DIR_PROPERTY is defined,
- // use OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> if exists, otherwise
- // use OVERLAY_DIR if exists.
+ // use OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> in addition to OVERLAY_DIR.
char subdir[PROP_VALUE_MAX];
int len = __system_property_get(AssetManager::OVERLAY_SKU_DIR_PROPERTY, subdir);
- String8 overlayPath;
if (len > 0) {
- overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir;
- } else {
- overlayPath = String8(AssetManager::OVERLAY_DIR);
+ String8 overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir;
+ if (stat(overlayPath.string(), &st) == 0) {
+ argv[argc++] = overlayPath.string();
+ }
}
- if (stat(overlayPath.string(), &st) == 0) {
- argv[argc++] = overlayPath.string();
+ if (stat(AssetManager::OVERLAY_DIR, &st) == 0) {
+ argv[argc++] = AssetManager::OVERLAY_DIR;
}
// Finally, invoke idmap (if any overlay directory exists)
diff --git a/include/androidfw/AssetManager.h b/include/androidfw/AssetManager.h
index 099d82e..31b692d 100644
--- a/include/androidfw/AssetManager.h
+++ b/include/androidfw/AssetManager.h
@@ -74,7 +74,7 @@
static const char* OVERLAY_DIR;
/*
* If OVERLAY_SKU_DIR_PROPERTY is set, search for runtime resource overlay
- * APKs in OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> rather than in
+ * APKs in OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> in addition to
* OVERLAY_DIR.
*/
static const char* OVERLAY_SKU_DIR_PROPERTY;