diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 641f24f711c13..e8922ebbfd13a 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -251,20 +251,29 @@ final class DeletePackageHelper { if (priorUserStates != null) { synchronized (mPm.mLock) { - for (int i = 0; i < allUsers.length; i++) { - TempUserState priorUserState = priorUserStates.get(allUsers[i]); - int enabledState = priorUserState.enabledState; - PackageSetting pkgSetting = mPm.getPackageSettingForMutation(packageName); - pkgSetting.setEnabled(enabledState, allUsers[i], - priorUserState.lastDisableAppCaller); - + PackageSetting pkgSetting = mPm.getPackageSettingForMutation(packageName); + if (pkgSetting != null) { AndroidPackage aPkg = pkgSetting.getPkg(); boolean pkgEnabled = aPkg != null && aPkg.isEnabled(); - if (!reEnableStub && priorUserState.installed - && ((enabledState == COMPONENT_ENABLED_STATE_DEFAULT && pkgEnabled) - || enabledState == COMPONENT_ENABLED_STATE_ENABLED)) { - reEnableStub = true; + for (int i = 0; i < allUsers.length; i++) { + TempUserState priorUserState = priorUserStates.get(allUsers[i]); + int enabledState = priorUserState.enabledState; + pkgSetting.setEnabled(enabledState, allUsers[i], + priorUserState.lastDisableAppCaller); + if (!reEnableStub && priorUserState.installed + && ( + (enabledState == COMPONENT_ENABLED_STATE_DEFAULT && pkgEnabled) + || enabledState == COMPONENT_ENABLED_STATE_ENABLED)) { + reEnableStub = true; + } } + } else { + // This should not happen. If priorUserStates != null, we are uninstalling + // an update of a system app. In that case, mPm.mSettings.getPackageLpr() + // should return a non-null value for the target packageName because + // restoreDisabledSystemPackageLIF() is called during deletePackageLIF(). + Slog.w(TAG, "Missing PackageSetting after uninstalling the update for" + + " system app: " + packageName + ". This should not happen."); } mPm.mSettings.writeAllUsersPackageRestrictionsLPr(); } diff --git a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java index 509702f0702b0..dfa6c6655c45d 100644 --- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java +++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java @@ -126,13 +126,13 @@ final class InitAndSystemPackageHelper { return null; } - public OverlayConfig setUpSystemPackages( + public OverlayConfig initPackages( WatchedArrayMap packageSettings, int[] userIds, long startTime) { PackageParser2 packageParser = mPm.mInjector.getScanningCachingPackageParser(); ExecutorService executorService = ParallelPackageParser.makeExecutorService(); - // Prepare apex package info before scanning APKs, these information are needed when + // Prepare apex package info before scanning APKs, this information is needed when // scanning apk in apex. mPm.mApexManager.scanApexPackagesTraced(packageParser, executorService); @@ -289,7 +289,7 @@ final class InitAndSystemPackageHelper { long currentTime, PackageParser2 packageParser, ExecutorService executorService) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanDir [" + scanDir.getAbsolutePath() + "]"); try { - mInstallPackageHelper.installSystemPackagesFromDir(scanDir, parseFlags, scanFlags, + mInstallPackageHelper.installPackagesFromDir(scanDir, parseFlags, scanFlags, currentTime, packageParser, executorService); } finally { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index d2087ee6125a1..80c2a7e97719c 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -3720,7 +3720,7 @@ final class InstallPackageHelper { } @GuardedBy({"mPm.mInstallLock", "mPm.mLock"}) - public void installSystemPackagesFromDir(File scanDir, int parseFlags, int scanFlags, + public void installPackagesFromDir(File scanDir, int parseFlags, int scanFlags, long currentTime, PackageParser2 packageParser, ExecutorService executorService) { final File[] files = scanDir.listFiles(); if (ArrayUtils.isEmpty(files)) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index fe5bce1306f87..0c78ab8942b53 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1975,7 +1975,7 @@ public class PackageManagerService extends IPackageManager.Stub mIsEngBuild, mIsUserDebugBuild, mIncrementalVersion); final int[] userIds = mUserManager.getUserIds(); - mOverlayConfig = mInitAndSystemPackageHelper.setUpSystemPackages(packageSettings, + mOverlayConfig = mInitAndSystemPackageHelper.initPackages(packageSettings, userIds, startTime); // Resolve the storage manager.