diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageInstallerSession.java | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 6b7e729671c5..bf114d8f7f34 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -883,6 +883,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return isDataLoaderInstallation() && params.dataLoaderParams.getType() == INCREMENTAL; } + private boolean isSystemDataLoaderInstallation() { + if (!isDataLoaderInstallation()) { + return false; + } + return SYSTEM_DATA_LOADER_PACKAGE.equals( + this.params.dataLoaderParams.getComponentName().getPackageName()); + } + /** * @return {@code true} iff the installing is app an device owner or affiliated profile owner. */ @@ -1058,9 +1066,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { "DataLoader installation of APEX modules is not allowed."); } - boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals( - this.params.dataLoaderParams.getComponentName().getPackageName()); - if (systemDataLoader && mContext.checkCallingOrSelfPermission( + if (isSystemDataLoaderInstallation() && mContext.checkCallingOrSelfPermission( Manifest.permission.USE_SYSTEM_DATA_LOADERS) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("You need the " @@ -2107,6 +2113,23 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { dispatchSessionFinished(error, detailedMessage, null); } + private void onSystemDataLoaderUnrecoverable() { + final PackageManagerService packageManagerService = mPm; + final String packageName = mPackageName; + if (TextUtils.isEmpty(packageName)) { + // The package has not been installed. + return; + } + mHandler.post(() -> { + if (packageManagerService.deletePackageX(packageName, + PackageManager.VERSION_CODE_HIGHEST, UserHandle.USER_SYSTEM, + PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/) + != PackageManager.DELETE_SUCCEEDED) { + Slog.e(TAG, "Failed to uninstall package with failed dataloader: " + packageName); + } + }); + } + /** * If session should be sealed, then it's sealed to prevent further modification. * If the session can't be sealed then it's destroyed. @@ -3740,6 +3763,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final DataLoaderParams params = this.params.dataLoaderParams; final boolean manualStartAndDestroy = !isIncrementalInstallation(); + final boolean systemDataLoader = isSystemDataLoaderInstallation(); final IDataLoaderStatusListener statusListener = new IDataLoaderStatusListener.Stub() { @Override public void onStatusChanged(int dataLoaderId, int status) { @@ -3751,10 +3775,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } if (mDestroyed || mDataLoaderFinished) { - // No need to worry about post installation + switch (status) { + case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE: + if (systemDataLoader) { + onSystemDataLoaderUnrecoverable(); + } + return; + } return; } - try { IDataLoader dataLoader = dataLoaderManager.getDataLoader(dataLoaderId); if (dataLoader == null) { @@ -3848,14 +3877,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS; healthCheckParams.unhealthyMonitoringMs = INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS; - final boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals( - params.getComponentName().getPackageName()); - final IStorageHealthListener healthListener = new IStorageHealthListener.Stub() { @Override public void onHealthStatus(int storageId, int status) { if (mDestroyed || mDataLoaderFinished) { - // No need to worry about post installation + // App's installed. + switch (status) { + case IStorageHealthListener.HEALTH_STATUS_UNHEALTHY: + if (systemDataLoader) { + onSystemDataLoaderUnrecoverable(); + } + return; + } return; } |