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

Commit 61542bed authored by Sumedh Sen's avatar Sumedh Sen
Browse files

Allowlist for exempting packages from being marked as stopped by default

An allowlist for packages that should not be scanned in a "stopped" state.

Bug: 249514169
Test: Manual. Added a system package in the allowlist, performed factory
reset and checked the stopped state of the same package after 1st boot.

Change-Id: Iec603243d7c95d4cdf207f7873373a851698b243
parent a1f2c686
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -35,6 +35,12 @@ prebuilt_etc {
    src: "preinstalled-packages-platform.xml",
}

prebuilt_etc {
    name: "initial-package-stopped-states.xml",
    sub_dir: "sysconfig",
    src: "initial-package-stopped-states.xml",
}

prebuilt_etc {
    name: "preinstalled-packages-platform-overlays.xml",
    product_specific: true,
+38 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2023 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
 -->

<!--
This XML defines an allowlist for packages that should not be scanned in a "stopped" state.
When this feature is turned on (indicated by the config config_stopSystemPackagesByDefault in
core/res/res/values/config.xml) packages on the system partition that are encountered by
the PackageManagerService for the first time are scanned in the "stopped" state. This allowlist
is also considered while creating new users on the device. Stopped state is not set during
subsequent reboots.

Example usage
    1. <initial-package-state package="com.example.app" stopped="false"/>
        Indicates that a system package - com.example.app's initial stopped state should not be set
        by the Package Manager. By default, system apps are marked as stopped.
    2. <initial-package-state package="com.example.app" stopped="true"/>
        Indicates that a system package - com.example.app's initial state should be set by the
        Package Manager to "stopped=true". It will have the same effect on the
        package's stopped state even if this package was not included in the allow list.
    3. <initial-package-state package="com.example.app"/>
        Invalid usage.
-->

<config></config>
+22 −0
Original line number Diff line number Diff line
@@ -333,6 +333,11 @@ public class SystemConfig {
    // Update ownership for system applications and the installers eligible to update them.
    private final ArrayMap<String, String> mUpdateOwnersForSystemApps = new ArrayMap<>();

    // Set of package names that should not be marked as "stopped" during initial device boot
    // or when adding a new user. A new package not contained in this set will be
    // marked as stopped by the system
    @NonNull private final Set<String> mInitialNonStoppedSystemPackages = new ArraySet<>();

    /**
     * Map of system pre-defined, uniquely named actors; keys are namespace,
     * value maps actor name to package name.
@@ -527,6 +532,10 @@ public class SystemConfig {
                ? null : mOverlayConfigSignaturePackage;
    }

    public Set<String> getInitialNonStoppedSystemPackages() {
        return mInitialNonStoppedSystemPackages;
    }

    /**
     * Only use for testing. Do NOT use in production code.
     * @param readPermissions false to create an empty SystemConfig; true to read the permissions.
@@ -1445,6 +1454,19 @@ public class SystemConfig {
                        }
                        XmlUtils.skipCurrentTag(parser);
                    } break;
                    case "initial-package-state": {
                        String pkgName = parser.getAttributeValue(null, "package");
                        String stopped = parser.getAttributeValue(null, "stopped");
                        if (TextUtils.isEmpty(pkgName)) {
                            Slog.w(TAG, "<" + name + "> without package in " + permFile
                                    + " at " + parser.getPositionDescription());
                        } else if (TextUtils.isEmpty(stopped)) {
                            Slog.w(TAG, "<" + name + "> without stopped in " + permFile
                                    + " at " + parser.getPositionDescription());
                        } else if (!Boolean.parseBoolean(stopped)) {
                            mInitialNonStoppedSystemPackages.add(pkgName);
                        }
                    }
                    default: {
                        Slog.w(TAG, "Tag " + name + " is unknown in "
                                + permFile + " at " + parser.getPositionDescription());