Respect partition precedence while deciding overlay priority

Strict partition precedence is enforced now, and the legacy
android:priority is no longer able to reorder overlays across
partition boundaries.

Should use OverlayConfig instead to do the custom configuration
if a cross partition reorder is needed.

Bug: 254407173
Test: atest OverlayConfigTest
Change-Id: I915957bee2ce00286c1bad853206e7e5cb1d140b
This commit is contained in:
Dennis Song
2022-11-21 13:48:05 +08:00
parent a6971bc969
commit 040471fb38
2 changed files with 55 additions and 43 deletions

View File

@@ -140,7 +140,6 @@ public class OverlayConfig {
ArrayMap<Integer, List<String>> activeApexesPerPartition = getActiveApexes(partitions);
boolean foundConfigFile = false;
final Map<String, ParsedOverlayInfo> packageManagerOverlayInfos =
packageProvider == null ? null : getOverlayPackageInfos(packageProvider);
@@ -154,7 +153,6 @@ public class OverlayConfig {
activeApexesPerPartition.getOrDefault(partition.type,
Collections.emptyList()));
if (partitionOverlays != null) {
foundConfigFile = true;
overlays.addAll(partitionOverlays);
continue;
}
@@ -191,12 +189,6 @@ public class OverlayConfig {
overlays.addAll(partitionConfigs);
}
if (!foundConfigFile) {
// If no overlay configuration files exist, disregard partition precedence and allow
// android:priority to reorder overlays across partition boundaries.
overlays.sort(sStaticOverlayComparator);
}
for (int i = 0, n = overlays.size(); i < n; i++) {
// Add the configurations to a map so definitions of an overlay in an earlier
// partition can be replaced by an overlay with the same package name in a later

View File

@@ -285,6 +285,39 @@ public class OverlayConfigTest {
assertConfig(overlayConfig, "five", true, true, 4);
}
@Test
public void testPartialConfigPartitionPrecedence() throws IOException {
createFile("/odm/overlay/config/config.xml",
"<config>"
+ " <overlay package=\"two\" enabled=\"true\" />"
+ "</config>");
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
1);
mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two");
mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
true, 0);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 0);
assertConfig(overlayConfig, "two", true, true, 1);
assertConfig(overlayConfig, "three", false, true, 2);
}
@Test
public void testNoConfigPartitionPrecedence() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
1);
mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two", "android", 0, true, 2);
mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
true, 0);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 0);
assertConfig(overlayConfig, "two", false, true, 1);
assertConfig(overlayConfig, "three", false, true, 2);
}
@Test
public void testImmutable() throws IOException {
createFile("/product/overlay/config/config.xml",
@@ -506,37 +539,6 @@ public class OverlayConfigTest {
assertConfig(overlayConfig, "two", false, true, 1);
}
@Test
public void testNoConfigsAllowPartitionReordering() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
1);
mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
0);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 1);
assertConfig(overlayConfig, "two", false, true, 0);
}
@Test
public void testConfigDisablesPartitionReordering() throws IOException {
createFile("/odm/overlay/config/config.xml",
"<config>"
+ " <overlay package=\"two\" enabled=\"true\" />"
+ "</config>");
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
1);
mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two");
mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
true, 0);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 0);
assertConfig(overlayConfig, "two", true, true, 1);
assertConfig(overlayConfig, "three", false, true, 2);
}
@Test
public void testStaticOverlayOutsideOverlayDir() throws IOException {
mScannerRule.addOverlay(createFile("/product/app/one.apk"), "one", "android", 0, true, 0);
@@ -550,7 +552,7 @@ public class OverlayConfigTest {
@Test
public void testSortStaticOverlaysDifferentTargets() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "other", 0, true, 0);
mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
0);
final OverlayConfig overlayConfig = createConfigImpl();
@@ -558,16 +560,34 @@ public class OverlayConfigTest {
assertConfig(overlayConfig, "two", false, true, 0);
}
@Test
public void testSortStaticOverlaysDifferentPartitions() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
2);
mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
3);
mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
true, 0);
mScannerRule.addOverlay(createFile("/product/overlay/four.apk"), "four", "android", 0,
true, 1);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 0);
assertConfig(overlayConfig, "two", false, true, 1);
assertConfig(overlayConfig, "three", false, true, 2);
assertConfig(overlayConfig, "four", false, true, 3);
}
@Test
public void testSortStaticOverlaysSamePriority() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
0);
mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
0);
final OverlayConfig overlayConfig = createConfigImpl();
assertConfig(overlayConfig, "one", false, true, 1);
assertConfig(overlayConfig, "two", false, true, 0);
assertConfig(overlayConfig, "one", false, true, 0);
assertConfig(overlayConfig, "two", false, true, 1);
}
@Test