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

Commit 0c3ad80f authored by Edward Savage-Jones's avatar Edward Savage-Jones Committed by Yurii Zubrytskyi
Browse files

Allow packages to be enabled depending on sku value

This change allows packages to be enabled on boot depending
on the sku of the device.  This enables the same product image
to be used on different skus.

Example:
Packages are listed here in a disabled state:
/product/etc/sysconfig/disabled-in-sku.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
    <disabled-in-sku package="com.sony.product1.app"/>
    <disabled-in-sku package="com.sony.product2.app"/>
</config>

Then enabled depending on the sku values read from
"ro.boot.hardware.sku"

e.g. an sku of '00001':
/product/etc/sysconfig/sku_00001/enabled-in-sku-override.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
    <enabled-in-sku-override package="com.sony.product2.app"/>
</config>

Status of apps after customisation:
product2 app - enabled
product1 app - disabled and not visible to PackageManager

Bug: 376275452
Test: atest FrameworksServicesTests:com.android.server.systemconfig.SystemConfigTest
Change-Id: Id1418beda7e264cab90086836c32785341fb5aac
parent 238801c3
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -1319,6 +1319,7 @@ public class SystemConfig {
                        }
                        XmlUtils.skipCurrentTag(parser);
                    } break;
                    case "disabled-in-sku":
                    case "disabled-until-used-preinstalled-carrier-app": {
                        if (allowAppConfigs) {
                            String pkgname = parser.getAttributeValue(null, "package");
@@ -1335,6 +1336,24 @@ public class SystemConfig {
                        }
                        XmlUtils.skipCurrentTag(parser);
                    } break;
                    case "enabled-in-sku-override": {
                        if (allowAppConfigs) {
                            String pkgname = parser.getAttributeValue(null, "package");
                            if (pkgname == null) {
                                Slog.w(TAG,
                                        "<" + name + "> without "
                                                + "package in " + permFile + " at "
                                                + parser.getPositionDescription());
                            } else if (!mDisabledUntilUsedPreinstalledCarrierApps.remove(pkgname)) {
                                Slog.w(TAG,
                                        "<" + name + "> packagename:" + pkgname + " not included"
                                                + "in disabled-in-sku");
                            }
                        } else {
                            logNotAllowedInPartition(name, permFile, parser);
                        }
                        XmlUtils.skipCurrentTag(parser);
                    } break;
                    case "privapp-permissions": {
                        if (allowPrivappPermissions) {
                            // privapp permissions from system, apex, vendor, product and
+34 −0
Original line number Diff line number Diff line
@@ -691,6 +691,40 @@ public class SystemConfigTest {
        assertThat(actual).isEqualTo(expected);
    }

    /**
     * Tests that readPermissions works correctly for the tags:
     * disabled-in-sku, enabled-in-sku-override.
     * I.e. that disabled-in-sku add package to block list and
     * enabled-in-sku-override removes package from the list.
     */
    @Test
    public void testDisablePackageInSku() throws Exception {
        final String disable_in_sku =
                "<config>\n"
                        + "    <disabled-in-sku package=\"com.sony.product1.app\"/>\n"
                        + "    <disabled-in-sku package=\"com.sony.product2.app\"/>\n"
                        + "</config>\n";

        final String enable_in_sku_override =
                "<config>\n"
                        + "    <enabled-in-sku-override package=\"com.sony.product2.app\"/>\n"
                        + "</config>\n";

        final File folder1 = createTempSubfolder("folder1");
        createTempFile(folder1, "permissionFile1.xml", disable_in_sku);

        final File folder2 = createTempSubfolder("folder2");
        createTempFile(folder2, "permissionFile2.xml", enable_in_sku_override);

        readPermissions(folder1, /* Grant all permission flags */ ~0);
        readPermissions(folder2, /* Grant all permission flags */ ~0);

        final ArraySet<String> blocklist = mSysConfig.getDisabledUntilUsedPreinstalledCarrierApps();

        assertThat(blocklist).contains("com.sony.product1.app");
        assertThat(blocklist).doesNotContain("com.sony.product2.app");
    }

    private void parseSharedLibraries(String contents) throws IOException {
        File folder = createTempSubfolder("permissions_folder");
        createTempFile(folder, "permissions.xml", contents);