Restore app uninstall on cable disconnect during ADB streaming.
This is a redo of ag/10717946 to keep feature parity with R.
Bug: 182214420
Test: install an app via USB2, disconnect the cable, observe the app
being uninstalled.
Change-Id: I79f34268730ea783c9d64a534417b8460c639c21
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 6b7e729..bf114d8 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 @@
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 @@
"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 @@
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 @@
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 @@
}
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 @@
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;
}