Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 040471fb authored by Dennis Song's avatar Dennis Song
Browse files

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
parent a6971bc9
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -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
+55 −35
Original line number Diff line number Diff line
@@ -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