summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shigeki Yokomichi <Shigeki.XA.Yokomichi@sony.com> 2019-10-15 17:18:51 +0900
committer Hiroaki Kuriyama <hiroaki.kuriyama@sony.com> 2019-10-28 23:19:33 +0900
commit0335f0916dd3473737a30904e2dfc86cbd4b7080 (patch)
tree278137ffb2007827f779d2933ba496d2e8310952
parentdf5cd391988b1def6a127725a1c4ee4a39cad8b0 (diff)
Fix crash loop due to broken packages.xml around updated-package
Symptom: Device cannot boot up due to NPE during package scan. Root Cause: /data/system/packages.xml is broken with an unexpected <updated-package> element even though there's no corresponding <package> element. When a system apk is installed, the system apk is registered as a <package> element in the packages.xml. When updated with a newer apk in /data, the data apk is registered as a <package> and the system apk is moved to <updated-package>. If a user triggers "Uninstall updates" but the device cannot complete uninstallation processing due to any critical problem like system freeze, the package.xml can be broken because the <package> for the data apk is removed once but the <updated-package> for the system apk remains wrongly. Solution: In this case, this change ignores the inconsistent <updated-package> and installs the system apk as non-updated system app. Test: forcibly stop "Uninstall updates" processing with JDB as described in b/143251299 and check system restart behavior Bug: 143251299 Change-Id: I48b6957d19f5d60d08d2e5ba48fa1d7bf42fdcfe
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java10
1 files changed, 10 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 0460a80b1dc0..461743e9ba53 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -9334,6 +9334,16 @@ public class PackageManagerService extends IPackageManager.Stub
pkgSetting = originalPkgSetting == null ? installedPkgSetting : originalPkgSetting;
pkgAlreadyExists = pkgSetting != null;
final String disabledPkgName = pkgAlreadyExists ? pkgSetting.name : pkg.packageName;
+ if (scanSystemPartition && !pkgAlreadyExists
+ && mSettings.getDisabledSystemPkgLPr(disabledPkgName) != null) {
+ // The updated-package data for /system apk remains inconsistently
+ // after the package data for /data apk is lost accidentally.
+ // To recover it, enable /system apk and install it as non-updated system app.
+ Slog.w(TAG, "Inconsistent package setting of updated system app for "
+ + disabledPkgName + ". To recover it, enable the system app"
+ + "and install it as non-updated system app.");
+ mSettings.removeDisabledSystemPackageLPw(disabledPkgName);
+ }
disabledPkgSetting = mSettings.getDisabledSystemPkgLPr(disabledPkgName);
isSystemPkgUpdated = disabledPkgSetting != null;