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

Commit f9a03e81 authored by Sumedh Sen's avatar Sumedh Sen
Browse files

Set system packages as stopped

Apps preloaded on the system partition will be scanned with
an initial state of "stopped=true".

Packages can be added to an allowlist to skip setting them initially as
stopped.

Bug: 249514169
Test: atest PackageManagerServiceServerTests:PackageManagerSettingsTest CtsContentTestCases:SystemPackageDefaultStoppedStateTest

Change-Id: I4d89dab65c01a21c4a74e61a1bfe35141b2fe954
parent 61542bed
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -70,6 +70,7 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_ODM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_STOPPED_SYSTEM_APP;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR;
@@ -4215,6 +4216,18 @@ final class InstallPackageHelper {
            }
            }
        }
        }


        // A new application appeared on /system, and we are seeing it for the first time.
        // Its also not updated as we don't have a copy of it on /data. So, scan it in a
        // STOPPED state. Ignore if it's an APEX package since stopped state does not affect them.
        final boolean isApexPkg = (scanFlags & SCAN_AS_APEX) != 0;
        if (mPm.mShouldStopSystemPackagesByDefault && scanSystemPartition
                && !pkgAlreadyExists && !isApexPkg) {
            String packageName = parsedPackage.getPackageName();
            if (!mPm.mInitialNonStoppedSystemPackages.contains(packageName)) {
                scanFlags |= SCAN_AS_STOPPED_SYSTEM_APP;
            }
        }

        final ScanResult scanResult = scanPackageNewLI(parsedPackage, parseFlags,
        final ScanResult scanResult = scanPackageNewLI(parsedPackage, parseFlags,
                scanFlags | SCAN_UPDATE_SIGNATURE, 0 /* currentTime */, user, null);
                scanFlags | SCAN_UPDATE_SIGNATURE, 0 /* currentTime */, user, null);
        return new Pair<>(scanResult, shouldHideSystemApp);
        return new Pair<>(scanResult, shouldHideSystemApp);
+11 −0
Original line number Original line Diff line number Diff line
@@ -386,6 +386,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
    static final int SCAN_DROP_CACHE = 1 << 24;
    static final int SCAN_DROP_CACHE = 1 << 24;
    static final int SCAN_AS_FACTORY = 1 << 25;
    static final int SCAN_AS_FACTORY = 1 << 25;
    static final int SCAN_AS_APEX = 1 << 26;
    static final int SCAN_AS_APEX = 1 << 26;
    static final int SCAN_AS_STOPPED_SYSTEM_APP = 1 << 27;


    @IntDef(flag = true, prefix = { "SCAN_" }, value = {
    @IntDef(flag = true, prefix = { "SCAN_" }, value = {
            SCAN_NO_DEX,
            SCAN_NO_DEX,
@@ -402,6 +403,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            SCAN_AS_INSTANT_APP,
            SCAN_AS_INSTANT_APP,
            SCAN_AS_FULL_APP,
            SCAN_AS_FULL_APP,
            SCAN_AS_VIRTUAL_PRELOAD,
            SCAN_AS_VIRTUAL_PRELOAD,
            SCAN_AS_STOPPED_SYSTEM_APP,
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface ScanFlags {}
    public @interface ScanFlags {}
@@ -963,6 +965,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
    final @Nullable String mRecentsPackage;
    final @Nullable String mRecentsPackage;
    final @Nullable String mAmbientContextDetectionPackage;
    final @Nullable String mAmbientContextDetectionPackage;
    final @Nullable String mWearableSensingPackage;
    final @Nullable String mWearableSensingPackage;
    final @NonNull Set<String> mInitialNonStoppedSystemPackages;
    final boolean mShouldStopSystemPackagesByDefault;
    private final @NonNull String mRequiredSdkSandboxPackage;
    private final @NonNull String mRequiredSdkSandboxPackage;


    @GuardedBy("mLock")
    @GuardedBy("mLock")
@@ -1770,6 +1774,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        mOverlayConfigSignaturePackage = testParams.overlayConfigSignaturePackage;
        mOverlayConfigSignaturePackage = testParams.overlayConfigSignaturePackage;
        mResolveComponentName = testParams.resolveComponentName;
        mResolveComponentName = testParams.resolveComponentName;
        mRequiredSdkSandboxPackage = testParams.requiredSdkSandboxPackage;
        mRequiredSdkSandboxPackage = testParams.requiredSdkSandboxPackage;
        mInitialNonStoppedSystemPackages = testParams.initialNonStoppedSystemPackages;
        mShouldStopSystemPackagesByDefault = testParams.shouldStopSystemPackagesByDefault;


        mLiveComputer = createLiveComputer();
        mLiveComputer = createLiveComputer();
        mSnapshotStatistics = null;
        mSnapshotStatistics = null;
@@ -2096,6 +2102,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            mCacheDir = PackageManagerServiceUtils.preparePackageParserCache(
            mCacheDir = PackageManagerServiceUtils.preparePackageParserCache(
                    mIsEngBuild, mIsUserDebugBuild, mIncrementalVersion);
                    mIsEngBuild, mIsUserDebugBuild, mIncrementalVersion);


            mInitialNonStoppedSystemPackages = mInjector.getSystemConfig()
                    .getInitialNonStoppedSystemPackages();
            mShouldStopSystemPackagesByDefault = mContext.getResources()
                    .getBoolean(R.bool.config_stopSystemPackagesByDefault);

            final int[] userIds = mUserManager.getUserIds();
            final int[] userIds = mUserManager.getUserIds();
            PackageParser2 packageParser = mInjector.getScanningCachingPackageParser();
            PackageParser2 packageParser = mInjector.getScanningCachingPackageParser();
            mOverlayConfig = mInitAppsHelper.initSystemApps(packageParser, packageSettings, userIds,
            mOverlayConfig = mInitAppsHelper.initSystemApps(packageParser, packageSettings, userIds,
+4 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import android.os.Build;
import android.os.Handler;
import android.os.Handler;
import android.os.incremental.IncrementalManager;
import android.os.incremental.IncrementalManager;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.DisplayMetrics;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
@@ -40,6 +41,7 @@ import com.android.server.pm.pkg.AndroidPackage;


import java.io.File;
import java.io.File;
import java.util.List;
import java.util.List;
import java.util.Set;


@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public final class PackageManagerServiceTestParams {
public final class PackageManagerServiceTestParams {
@@ -119,4 +121,6 @@ public final class PackageManagerServiceTestParams {
    public SuspendPackageHelper suspendPackageHelper;
    public SuspendPackageHelper suspendPackageHelper;
    public DistractingPackageHelper distractingPackageHelper;
    public DistractingPackageHelper distractingPackageHelper;
    public StorageEventHelper storageEventHelper;
    public StorageEventHelper storageEventHelper;
    public Set<String> initialNonStoppedSystemPackages = new ArraySet<>();
    public boolean shouldStopSystemPackagesByDefault;
}
}
+3 −1
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_ODM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_STOPPED_SYSTEM_APP;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR;
@@ -198,6 +199,7 @@ final class ScanPackageUtils {
        if (createNewPackage) {
        if (createNewPackage) {
            final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
            final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
            final boolean virtualPreload = (scanFlags & SCAN_AS_VIRTUAL_PRELOAD) != 0;
            final boolean virtualPreload = (scanFlags & SCAN_AS_VIRTUAL_PRELOAD) != 0;
            final boolean isStoppedSystemApp = (scanFlags & SCAN_AS_STOPPED_SYSTEM_APP) != 0;


            // Flags contain system values stored in the server variant of AndroidPackage,
            // Flags contain system values stored in the server variant of AndroidPackage,
            // and so the server-side PackageInfoUtils is still called, even without a
            // and so the server-side PackageInfoUtils is still called, even without a
@@ -212,7 +214,7 @@ final class ScanPackageUtils {
                    AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage),
                    AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage),
                    AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage),
                    AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage),
                    parsedPackage.getLongVersionCode(), pkgFlags, pkgPrivateFlags, user,
                    parsedPackage.getLongVersionCode(), pkgFlags, pkgPrivateFlags, user,
                    true /*allowInstall*/, instantApp, virtualPreload,
                    true /*allowInstall*/, instantApp, virtualPreload, isStoppedSystemApp,
                    UserManagerService.getInstance(), usesSdkLibraries,
                    UserManagerService.getInstance(), usesSdkLibraries,
                    parsedPackage.getUsesSdkLibrariesVersionsMajor(), usesStaticLibraries,
                    parsedPackage.getUsesSdkLibrariesVersionsMajor(), usesStaticLibraries,
                    parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(),
                    parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(),
+11 −3
Original line number Original line Diff line number Diff line
@@ -1041,7 +1041,7 @@ public final class Settings implements Watchable, Snappable {
            File codePath, String legacyNativeLibraryPath, String primaryCpuAbi,
            File codePath, String legacyNativeLibraryPath, String primaryCpuAbi,
            String secondaryCpuAbi, long versionCode, int pkgFlags, int pkgPrivateFlags,
            String secondaryCpuAbi, long versionCode, int pkgFlags, int pkgPrivateFlags,
            UserHandle installUser, boolean allowInstall, boolean instantApp,
            UserHandle installUser, boolean allowInstall, boolean instantApp,
            boolean virtualPreload, UserManagerService userManager,
            boolean virtualPreload, boolean isStoppedSystemApp, UserManagerService userManager,
            String[] usesSdkLibraries, long[] usesSdkLibrariesVersions,
            String[] usesSdkLibraries, long[] usesSdkLibrariesVersions,
            String[] usesStaticLibraries, long[] usesStaticLibrariesVersions,
            String[] usesStaticLibraries, long[] usesStaticLibrariesVersions,
            Set<String> mimeGroupNames, @NonNull UUID domainSetId) {
            Set<String> mimeGroupNames, @NonNull UUID domainSetId) {
@@ -1068,6 +1068,9 @@ public final class Settings implements Watchable, Snappable {
            pkgSetting.setFlags(pkgFlags)
            pkgSetting.setFlags(pkgFlags)
                    .setPrivateFlags(pkgPrivateFlags);
                    .setPrivateFlags(pkgPrivateFlags);
        } else {
        } else {
            int installUserId = installUser != null ? installUser.getIdentifier()
                    : UserHandle.USER_SYSTEM;

            pkgSetting = new PackageSetting(pkgName, realPkgName, codePath,
            pkgSetting = new PackageSetting(pkgName, realPkgName, codePath,
                    legacyNativeLibraryPath, primaryCpuAbi, secondaryCpuAbi,
                    legacyNativeLibraryPath, primaryCpuAbi, secondaryCpuAbi,
                    null /*cpuAbiOverrideString*/, versionCode, pkgFlags, pkgPrivateFlags,
                    null /*cpuAbiOverrideString*/, versionCode, pkgFlags, pkgPrivateFlags,
@@ -1086,8 +1089,6 @@ public final class Settings implements Watchable, Snappable {
                    Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
                    Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
                }
                }
                List<UserInfo> users = getAllUsers(userManager);
                List<UserInfo> users = getAllUsers(userManager);
                int installUserId = installUser != null ? installUser.getIdentifier()
                        : UserHandle.USER_SYSTEM;
                if (users != null && allowInstall) {
                if (users != null && allowInstall) {
                    for (UserInfo user : users) {
                    for (UserInfo user : users) {
                        // By default we consider this app to be installed
                        // By default we consider this app to be installed
@@ -1126,6 +1127,13 @@ public final class Settings implements Watchable, Snappable {
                        );
                        );
                    }
                    }
                }
                }
            } else if (isStoppedSystemApp) {
                if (DEBUG_STOPPED) {
                    RuntimeException e = new RuntimeException("here");
                    e.fillInStackTrace();
                    Slog.i(PackageManagerService.TAG, "Stopping system package " + pkgName, e);
                }
                pkgSetting.setStopped(true, installUserId);
            }
            }
            if (sharedUser != null) {
            if (sharedUser != null) {
                pkgSetting.setAppId(sharedUser.mAppId);
                pkgSetting.setAppId(sharedUser.mAppId);
Loading