diff options
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); } |