Merge "[pm] fix NPE in deletePackageX"
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index 641f24f..e8922eb 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 @@
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 509702f..dfa6c66 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 @@
return null;
}
- public OverlayConfig setUpSystemPackages(
+ public OverlayConfig initPackages(
WatchedArrayMap<String, PackageSetting> 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 @@
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 d2087ee..80c2a7e 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 @@
}
@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 fe5bce13..0c78ab8 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 @@
mIsEngBuild, mIsUserDebugBuild, mIncrementalVersion);
final int[] userIds = mUserManager.getUserIds();
- mOverlayConfig = mInitAndSystemPackageHelper.setUpSystemPackages(packageSettings,
+ mOverlayConfig = mInitAndSystemPackageHelper.initPackages(packageSettings,
userIds, startTime);
// Resolve the storage manager.