From 6afabce549f5725988b9c03de932c34e9d22f10e Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Fri, 23 Aug 2019 13:50:23 -0700 Subject: [PATCH 1/3] Handles null outInfo in deleteSystemPackageLI This change adds null checks before accessing outInfo in deleteSystemPackageLI. Bug: 142083996 Bug: 141413692 Test: manual; remove static dependency on eng build and reboot Change-Id: If0fd48343e89cbb77ccd25826656194195d5b0cd (cherry picked from commit 17471016508bb9c9ffb8c3946dda0b4897d722f1) Merged-In: If0fd48343e89cbb77ccd25826656194195d5b0cd --- .../server/pm/PackageManagerService.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ab6c956c69241..9edd0462055e8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19283,7 +19283,8 @@ public class PackageManagerService extends IPackageManager.Stub * Tries to delete system package. */ private boolean deleteSystemPackageLIF(PackageParser.Package deletedPkg, - PackageSetting deletedPs, int[] allUserHandles, int flags, PackageRemovedInfo outInfo, + PackageSetting deletedPs, int[] allUserHandles, int flags, + @Nullable PackageRemovedInfo outInfo, boolean writeSettings) { if (deletedPs.parentPackageName != null) { Slog.w(TAG, "Attempt to delete child system package " + deletedPkg.packageName); @@ -19291,7 +19292,7 @@ public class PackageManagerService extends IPackageManager.Stub } final boolean applyUserRestrictions - = (allUserHandles != null) && (outInfo.origUsers != null); + = (allUserHandles != null) && outInfo != null && (outInfo.origUsers != null); final PackageSetting disabledPs; // Confirm if the system package has been updated // An updated system app can be deleted. This will also have to restore @@ -19321,19 +19322,21 @@ public class PackageManagerService extends IPackageManager.Stub } } - // Delete the updated package - outInfo.isRemovedPackageSystemUpdate = true; - if (outInfo.removedChildPackages != null) { - final int childCount = (deletedPs.childPackageNames != null) - ? deletedPs.childPackageNames.size() : 0; - for (int i = 0; i < childCount; i++) { - String childPackageName = deletedPs.childPackageNames.get(i); - if (disabledPs.childPackageNames != null && disabledPs.childPackageNames - .contains(childPackageName)) { - PackageRemovedInfo childInfo = outInfo.removedChildPackages.get( - childPackageName); - if (childInfo != null) { - childInfo.isRemovedPackageSystemUpdate = true; + if (outInfo != null) { + // Delete the updated package + outInfo.isRemovedPackageSystemUpdate = true; + if (outInfo.removedChildPackages != null) { + final int childCount = (deletedPs.childPackageNames != null) + ? deletedPs.childPackageNames.size() : 0; + for (int i = 0; i < childCount; i++) { + String childPackageName = deletedPs.childPackageNames.get(i); + if (disabledPs.childPackageNames != null && disabledPs.childPackageNames + .contains(childPackageName)) { + PackageRemovedInfo childInfo = outInfo.removedChildPackages.get( + childPackageName); + if (childInfo != null) { + childInfo.isRemovedPackageSystemUpdate = true; + } } } } From 08315953bc42fb392c32293418dfb2a3e4ffbe53 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Thu, 10 Oct 2019 15:50:28 -0700 Subject: [PATCH 2/3] Use KNOWN_PACKAGES when shared lib consumers This change ensures we find ALL known packages that could be consuming a shared library, not only currently installed ones. Without this check, the system may get into a state in which we have currently uninstalled but on-device apps that depend on a shared library that does not exist on device. This change also leaves static shared library packages on device even if it's not installed for any of the remaining users as it could still be used, but marked uninstalled for users in which it is consumed. Bug: 141413692 Bug: 142083996 Test: Manual; attempt to remove shared lib after marking its consumer uninstalled. Test: atest StaticSharedLibsHostTests Change-Id: Id4e37c3e4d3ea3ad5fddae5d2c7305e56f50eeea Merged-In: Id4e37c3e4d3ea3ad5fddae5d2c7305e56f50eeea --- .../java/com/android/server/pm/PackageManagerService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9edd0462055e8..e7235b900a873 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -18951,7 +18951,7 @@ public class PackageManagerService extends IPackageManager.Stub continue; } List libClientPackages = getPackagesUsingSharedLibraryLPr( - libEntry.info, 0, currUserId); + libEntry.info, MATCH_KNOWN_PACKAGES, currUserId); if (!ArrayUtils.isEmpty(libClientPackages)) { Slog.w(TAG, "Not removing package " + pkg.manifestPackageName + " hosting lib " + libEntry.info.getName() + " version " @@ -24065,8 +24065,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); continue; } final String packageName = ps.pkg.packageName; - // Skip over if system app - if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) { + // Skip over if system app or static shared library + if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0 + || !TextUtils.isEmpty(ps.pkg.staticSharedLibName)) { continue; } if (DEBUG_CLEAN_APKS) { From 5d3fc339b57950fd8621cb410865e8800ccb6873 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Wed, 6 Nov 2019 10:36:39 -0800 Subject: [PATCH 3/3] Fixes NPE when preparing app data during init When deleting an unused static shared library on Q, the user manager was fetched via mContext.getSystemService. At this time during boot, the service wasn't registered and so null was returned. This has already been addressed in R with a move to injecting dependencies in the PackageManagerService constructor. Bug: 142083996 Bug: 141413692 Test: manual; remove static dependency on eng Q build and reboot Change-Id: I8ae4e331d09b4734c54cdc6887b273705dce88b1 Merged-In: I8ae4e331d09b4734c54cdc6887b273705dce88b1 --- .../java/com/android/server/pm/PackageManagerService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e7235b900a873..a3f3cedf1e2c4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23436,9 +23436,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); mSettings.writeKernelMappingLPr(ps); } - final UserManager um = mContext.getSystemService(UserManager.class); + final UserManagerService um = sUserManager; UserManagerInternal umInternal = getUserManagerInternal(); - for (UserInfo user : um.getUsers()) { + for (UserInfo user : um.getUsers(false /* excludeDying */)) { final int flags; if (umInternal.isUserUnlockingOrUnlocked(user.id)) { flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;