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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user