Loading core/java/android/app/backup/BackupAgent.java +8 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,14 @@ public abstract class BackupAgent extends ContextWrapper { */ public static final int FLAG_DEVICE_TO_DEVICE_TRANSFER = 2; /** * Flag for {@link RestoreSet#backupTransportFlags} to indicate if restore should be skipped * for apps that have already been launched. * * @hide */ public static final int FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS = 1 << 2; /** * Flag for {@link BackupDataOutput#getTransportFlags()} and * {@link FullBackupDataOutput#getTransportFlags()} only. Loading services/backup/Android.bp +12 −1 Original line number Diff line number Diff line Loading @@ -19,5 +19,16 @@ java_library_static { defaults: ["platform_service_defaults"], srcs: [":services.backup-sources"], libs: ["services.core"], static_libs: ["app-compat-annotations"], static_libs: ["app-compat-annotations", "backup_flags_lib"], } aconfig_declarations { name: "backup_flags", package: "com.android.server.backup", srcs: ["flags.aconfig"], } java_aconfig_library { name: "backup_flags_lib", aconfig_declarations: "backup_flags", } services/backup/flags.aconfig 0 → 100644 +10 −0 Original line number Diff line number Diff line package: "com.android.server.backup" flag { name: "enable_skipping_restore_launched_apps" namespace: "onboarding" description: "Enforce behavior determined by BackupTransport implementation on whether to skip " "restore for apps that have been launched." bug: "308401499" is_fixed_read_only: true } No newline at end of file services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +21 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_RUN_RESTORE; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.backup.BackupAgent; import android.app.backup.BackupAnnotations.BackupDestination; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IRestoreObserver; Loading @@ -32,11 +33,15 @@ import android.app.backup.RestoreSet; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Handler; import android.os.Message; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.backup.Flags; import com.android.server.backup.TransportManager; import com.android.server.backup.UserBackupManagerService; import com.android.server.backup.internal.OnTaskFinishedListener; Loading Loading @@ -296,14 +301,28 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { return -1; } private BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { @VisibleForTesting BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { // TODO(b/182986784): Remove device name comparison once a designated field for operation // type is added to RestoreSet object. int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; if (!Flags.enableSkippingRestoreLaunchedApps()) { return mBackupManagerService.getEligibilityRulesForOperation(backupDestination); } boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; return new BackupEligibilityRules(mBackupManagerService.getPackageManager(), LocalServices.getService(PackageManagerInternal.class), mUserId, mBackupManagerService.getContext(), backupDestination, skipRestoreForLaunchedApps); } public synchronized int restorePackage(String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { if (DEBUG) { Loading services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +9 −1 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import com.android.server.backup.BackupAgentTimeoutParameters; import com.android.server.backup.BackupAndRestoreFeatureFlags; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.BackupUtils; import com.android.server.backup.Flags; import com.android.server.backup.OperationStorage; import com.android.server.backup.OperationStorage.OpType; import com.android.server.backup.PackageManagerBackupAgent; Loading Loading @@ -263,7 +264,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { continue; } if (backupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) { ApplicationInfo applicationInfo = info.applicationInfo; if (backupEligibilityRules.appIsEligibleForBackup(applicationInfo)) { if (Flags.enableSkippingRestoreLaunchedApps() && !backupEligibilityRules.isAppEligibleForRestore(applicationInfo)) { continue; } mAcceptSet.add(info); } } catch (NameNotFoundException e) { Loading Loading
core/java/android/app/backup/BackupAgent.java +8 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,14 @@ public abstract class BackupAgent extends ContextWrapper { */ public static final int FLAG_DEVICE_TO_DEVICE_TRANSFER = 2; /** * Flag for {@link RestoreSet#backupTransportFlags} to indicate if restore should be skipped * for apps that have already been launched. * * @hide */ public static final int FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS = 1 << 2; /** * Flag for {@link BackupDataOutput#getTransportFlags()} and * {@link FullBackupDataOutput#getTransportFlags()} only. Loading
services/backup/Android.bp +12 −1 Original line number Diff line number Diff line Loading @@ -19,5 +19,16 @@ java_library_static { defaults: ["platform_service_defaults"], srcs: [":services.backup-sources"], libs: ["services.core"], static_libs: ["app-compat-annotations"], static_libs: ["app-compat-annotations", "backup_flags_lib"], } aconfig_declarations { name: "backup_flags", package: "com.android.server.backup", srcs: ["flags.aconfig"], } java_aconfig_library { name: "backup_flags_lib", aconfig_declarations: "backup_flags", }
services/backup/flags.aconfig 0 → 100644 +10 −0 Original line number Diff line number Diff line package: "com.android.server.backup" flag { name: "enable_skipping_restore_launched_apps" namespace: "onboarding" description: "Enforce behavior determined by BackupTransport implementation on whether to skip " "restore for apps that have been launched." bug: "308401499" is_fixed_read_only: true } No newline at end of file
services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +21 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_RUN_RESTORE; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.backup.BackupAgent; import android.app.backup.BackupAnnotations.BackupDestination; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IRestoreObserver; Loading @@ -32,11 +33,15 @@ import android.app.backup.RestoreSet; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Handler; import android.os.Message; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.backup.Flags; import com.android.server.backup.TransportManager; import com.android.server.backup.UserBackupManagerService; import com.android.server.backup.internal.OnTaskFinishedListener; Loading Loading @@ -296,14 +301,28 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { return -1; } private BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { @VisibleForTesting BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { // TODO(b/182986784): Remove device name comparison once a designated field for operation // type is added to RestoreSet object. int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; if (!Flags.enableSkippingRestoreLaunchedApps()) { return mBackupManagerService.getEligibilityRulesForOperation(backupDestination); } boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; return new BackupEligibilityRules(mBackupManagerService.getPackageManager(), LocalServices.getService(PackageManagerInternal.class), mUserId, mBackupManagerService.getContext(), backupDestination, skipRestoreForLaunchedApps); } public synchronized int restorePackage(String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { if (DEBUG) { Loading
services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +9 −1 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import com.android.server.backup.BackupAgentTimeoutParameters; import com.android.server.backup.BackupAndRestoreFeatureFlags; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.BackupUtils; import com.android.server.backup.Flags; import com.android.server.backup.OperationStorage; import com.android.server.backup.OperationStorage.OpType; import com.android.server.backup.PackageManagerBackupAgent; Loading Loading @@ -263,7 +264,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { continue; } if (backupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) { ApplicationInfo applicationInfo = info.applicationInfo; if (backupEligibilityRules.appIsEligibleForBackup(applicationInfo)) { if (Flags.enableSkippingRestoreLaunchedApps() && !backupEligibilityRules.isAppEligibleForRestore(applicationInfo)) { continue; } mAcceptSet.add(info); } } catch (NameNotFoundException e) { Loading