Loading services/core/java/com/android/server/pm/PackageInstallerSession.java +42 −9 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 " Loading Loading @@ -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. Loading Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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; } Loading Loading
services/core/java/com/android/server/pm/PackageInstallerSession.java +42 −9 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 " Loading Loading @@ -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. Loading Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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; } Loading