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

Commit 0335f091 authored by Shigeki Yokomichi's avatar Shigeki Yokomichi Committed by Hiroaki Kuriyama
Browse files

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
parent df5cd391
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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;