diff options
| author | 2023-08-29 14:25:25 +0000 | |
|---|---|---|
| committer | 2023-08-29 14:25:25 +0000 | |
| commit | 709e6435b4f97f1674b827995c0e8860bf99cd9e (patch) | |
| tree | 0b7a5a9f34ee0ddb8095b902cd16123c3c1cede5 | |
| parent | 977b0cb1ba8c619a6c36a110cd9e0e2b9d8db804 (diff) | |
Adds intent extra to package data clear broadcast during restore operation.
During full restore of a package, Backup service asks AM service to clear app data for the package (to ensure clean state for restore). AM broadcasts ACTION_PACKAGE_DATA_CLEARED intent, which Blockstore receives and it clears associated Blockstore data. This results in Blockstore data not being restored.
Adding an intent extra to the broadcast enabled Blockstore to know that it happened because of a restore, and won't clear it's data. See go/br-blockstore-framework-fix for details.
Note: This change adds intent extra as @hide. b/298012653 tracks the work to add it as a system api for V.
Bug: 243464090
Test: Verified through BroadcastReceiver
Change-Id: I3e90279a3dd2e6753b76527cbdb3f70ecce4db0f
4 files changed, 37 insertions, 6 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 021f932c562c..32c40df32585 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -35,6 +35,7 @@ import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.ActivityPresentationInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageDataObserver; import android.content.pm.UserInfo; import android.net.Uri; import android.os.Bundle; @@ -1224,4 +1225,13 @@ public abstract class ActivityManagerInternal { */ @NonNull public abstract StatsEvent getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull); + + /** + * Internal method for clearing app data, with the extra param that is used to indicate restore. + * Used by Backup service during restore operation. + * + * @hide + */ + public abstract boolean clearApplicationUserData(String packageName, boolean keepState, + boolean isRestore, IPackageDataObserver observer, int userId); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 307f30619be2..f3cd43bf3ed8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6685,6 +6685,15 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_VISIBILITY_ALLOW_LIST = "android.intent.extra.VISIBILITY_ALLOW_LIST"; + /** + * A boolean extra used with {@link #ACTION_PACKAGE_DATA_CLEARED} which indicates if the intent + * is broadcast as part of a restore operation. + * + * @hide + */ + public static final String EXTRA_IS_RESTORE = + "android.intent.extra.IS_RESTORE"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Intent flags (see mFlags variable). diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 7261709d7b8d..400980948a62 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -1742,12 +1742,8 @@ public class UserBackupManagerService { synchronized (mClearDataLock) { mClearingData = true; - try { - mActivityManager.clearApplicationUserData(packageName, keepSystemState, observer, - mUserId); - } catch (RemoteException e) { - // can't happen because the activity manager is in this process - } + mActivityManagerInternal.clearApplicationUserData(packageName, keepSystemState, + /*isRestore=*/ true, observer, mUserId); // Only wait 30 seconds for the clear data to happen. long timeoutMark = System.currentTimeMillis() + CLEAR_DATA_TIMEOUT_INTERVAL; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index df5b83a4c1b3..e83d4b954aa9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3449,6 +3449,12 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean clearApplicationUserData(final String packageName, boolean keepState, final IPackageDataObserver observer, int userId) { + return clearApplicationUserData(packageName, keepState, /*isRestore=*/ false, observer, + userId); + } + + private boolean clearApplicationUserData(final String packageName, boolean keepState, + boolean isRestore, final IPackageDataObserver observer, int userId) { enforceNotIsolatedCaller("clearApplicationUserData"); int uid = Binder.getCallingUid(); int pid = Binder.getCallingPid(); @@ -3543,6 +3549,9 @@ public class ActivityManagerService extends IActivityManager.Stub intent.putExtra(Intent.EXTRA_UID, (appInfo != null) ? appInfo.uid : INVALID_UID); intent.putExtra(Intent.EXTRA_USER_HANDLE, resolvedUserId); + if (isRestore) { + intent.putExtra(Intent.EXTRA_IS_RESTORE, true); + } if (isInstantApp) { intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); } @@ -18758,6 +18767,13 @@ public class ActivityManagerService extends IActivityManager.Stub return mAppProfiler.mCachedAppsWatermarkData.getCachedAppsHighWatermarkStats( atomTag, resetAfterPull); } + + @Override + public boolean clearApplicationUserData(final String packageName, boolean keepState, + boolean isRestore, final IPackageDataObserver observer, int userId) { + return ActivityManagerService.this.clearApplicationUserData(packageName, keepState, + isRestore, observer, userId); + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, TimeoutRecord timeoutRecord) { |