diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a4d74f0d7fc34..f288f1fd9e791 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2072,8 +2072,18 @@ public class PackageManagerService extends IPackageManager.Stub int autoRevokePermissionsMode, boolean launchedForRestore, String installerPackage, IPackageInstallObserver2 installObserver, int dataLoaderType) { - final boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; + boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; + final String packageName = res.name; + final PackageSetting pkgSetting = succeeded ? getPackageSetting(packageName) : null; + if (succeeded && pkgSetting == null) { + Slog.e(TAG, packageName + " was removed before handlePackagePostInstall " + + "could be executed"); + res.returnCode = INSTALL_FAILED_PACKAGE_CHANGED; + res.returnMsg = "Package was removed before install could complete."; + notifyInstallObserver(res, installObserver); + return; + } if (succeeded) { // Send the removed broadcasts @@ -2117,8 +2127,6 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry.onPackageInstalledLPw(res.pkg, res.newUsers); } - final String packageName = res.pkg.getPackageName(); - // Determine the set of users who are adding this package for // the first time vs. those who are seeing an update. int[] firstUserIds = EMPTY_INT_ARRAY; @@ -2126,7 +2134,7 @@ public class PackageManagerService extends IPackageManager.Stub int[] updateUserIds = EMPTY_INT_ARRAY; int[] instantUserIds = EMPTY_INT_ARRAY; final boolean allNewUsers = res.origUsers == null || res.origUsers.length == 0; - final PackageSetting ps = getPackageSetting(res.pkg.getPackageName()); + final PackageSetting ps = pkgSetting; for (int newUser : res.newUsers) { final boolean isInstantApp = ps.getInstantApp(newUser); if (allNewUsers) { @@ -2263,7 +2271,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageExternalStorageType != StorageEnums.UNKNOWN) { FrameworkStatsLog.write( FrameworkStatsLog.APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED, - packageExternalStorageType, res.pkg.getPackageName()); + packageExternalStorageType, packageName); } } if (DEBUG_INSTALL) { @@ -2295,12 +2303,9 @@ public class PackageManagerService extends IPackageManager.Stub if (packageIsBrowser(packageName, userId)) { // If this browser is restored from user's backup, do not clear // default-browser state for this user - synchronized (mLock) { - final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); - if (pkgSetting.getInstallReason(userId) - != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - mPermissionManager.setDefaultBrowser(null, true, true, userId); - } + if (pkgSetting.getInstallReason(userId) + != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { + mPermissionManager.setDefaultBrowser(null, true, true, userId); } }