Skip post install if package was deleted

This change skips the majority of handlePackagePostInstall if the
package being handled is no longer in settings. This can happen if an
uninstall is issued post commit, but before the post install steps are
posted to the package handler. This will be addressed more completely in
a later change.

Fixes: 153131678
Bug: 153456530
Test: Device boots, installs complete without issue; this is a difficult to reproduce race condition.
Change-Id: I448a6ac11f6dd6f1f30859e05ab971bae0b5d5e9
This commit is contained in:
Patrick Baumann
2020-04-07 11:31:19 -07:00
parent 71f6afb212
commit 2c87a3f2bb

View File

@@ -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);
}
}