diff options
| author | 2023-08-04 12:47:37 -0700 | |
|---|---|---|
| committer | 2023-08-07 14:39:19 -0700 | |
| commit | e91a54a954ecda79f63419f1cbe2c4dfa9192bbf (patch) | |
| tree | 7df9919978e74719061a7637c9e14b2f25aaef31 | |
| parent | 9f6b946735e41ff4b818e7cc380c26bded45bcad (diff) | |
[pm] properly nullify pkg when DELETE_KEEP_DATA
Previously the pkg is not nullified if the "--user" is not passed in. This
CL makes sure that the behavior is consistent between "uninstall -k" and
"uninstall -k --user 0" (when there is only user 0), as well as after
reboot.
Also making sure that signingInfo is in the PackageInfo query result
(for potential future usages like package-unarchive).
BUG: 288142708
Test: atest com.android.server.pm.PackageManagerTests
Test: manual and will add a cts
Change-Id: Iea14d834ab3b32e4e9f7bb100dacacd4badc17e2
4 files changed, 23 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 1b5272514b63..dd3604eb02a5 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -1519,6 +1519,7 @@ public class ComputerEngine implements Computer { ai.privateFlags = ps.getPrivateFlags(); pi.applicationInfo = PackageInfoUtils.generateDelegateApplicationInfo( ai, flags, state, userId); + pi.signingInfo = ps.getSigningInfo(); if (DEBUG_PACKAGE_INFO) { Log.v(TAG, "ps.pkg is n/a for [" diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index a5a4594ce6ac..b5ec1366fec6 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -470,7 +470,6 @@ final class DeletePackageHelper { // We need to set it back to 'installed' so the uninstall // broadcasts will be sent correctly. if (DEBUG_REMOVE) Slog.d(TAG, "Not installed by other users, full delete"); - ps.setPkg(null); ps.setInstalled(true, userId); mPm.mSettings.writeKernelMappingLPr(ps); clearPackageStateAndReturn = false; diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index 59314a26ab97..6d3b26cc2fd4 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -135,6 +135,7 @@ final class RemovePackageHelper { cacher.cleanCachedResult(codePath); } + // Used for system apps only public void removePackage(AndroidPackage pkg, boolean chatty) { synchronized (mPm.mInstallLock) { removePackageLI(pkg, chatty); @@ -284,6 +285,13 @@ final class RemovePackageHelper { } removePackageLI(deletedPs.getPackageName(), (flags & PackageManager.DELETE_CHATTY) != 0); + if (!deletedPs.isSystem()) { + // A non-system app's AndroidPackage object has been removed from the service. + // Explicitly nullify the corresponding app's PackageSetting's pkg object to + // prevent any future usage of it, in case the PackageSetting object will remain because + // of DELETE_KEEP_DATA. + deletedPs.setPkg(null); + } if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { final AndroidPackage resolvedPkg; diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java index dc92376263a6..74dc8532f163 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java @@ -966,9 +966,11 @@ public class PackageManagerTests extends AndroidTestCase { } private static void assertUninstalled(ApplicationInfo info) throws Exception { - File nativeLibraryFile = new File(info.nativeLibraryDir); - assertFalse("Native library directory " + info.nativeLibraryDir - + " should be erased", nativeLibraryFile.exists()); + if (info.nativeLibraryDir != null) { + File nativeLibraryFile = new File(info.nativeLibraryDir); + assertFalse("Native library directory " + info.nativeLibraryDir + + " should be erased", nativeLibraryFile.exists()); + } } public void deleteFromRawResource(int iFlags, int dFlags) throws Exception { @@ -2883,14 +2885,15 @@ public class PackageManagerTests extends AndroidTestCase { break; } } - assertNotNull("activities should not be null", packageInfo.activities); - assertNotNull("configPreferences should not be null", packageInfo.configPreferences); - assertNotNull("instrumentation should not be null", packageInfo.instrumentation); - assertNotNull("permissions should not be null", packageInfo.permissions); - assertNotNull("providers should not be null", packageInfo.providers); - assertNotNull("receivers should not be null", packageInfo.receivers); - assertNotNull("services should not be null", packageInfo.services); - assertNotNull("signatures should not be null", packageInfo.signatures); + assertNotNull("applicationInfo should not be null", packageInfo.applicationInfo); + assertNull("activities should be null", packageInfo.activities); + assertNull("configPreferences should be null", packageInfo.configPreferences); + assertNull("instrumentation should be null", packageInfo.instrumentation); + assertNull("permissions should be null", packageInfo.permissions); + assertNull("providers should be null", packageInfo.providers); + assertNull("receivers should be null", packageInfo.receivers); + assertNull("services should be null", packageInfo.services); + assertNotNull("signingInfo should not be null", packageInfo.signingInfo); } finally { cleanUpInstall(ip); } |