Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f361f210 authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov
Browse files

Skip restore of apps that have been launched or restored.

This is to ensure we don't overwrite existing state. The behavior will
be controlled by the BackupTransport implementation that provides the
restore data.

Bug: 308401499
Test: atest BackupEligibilityRulesTest
      atest ActiveRestoreSessionTest
      Manual: perform initial restore, verify all apps restore, rerun
      restore for already restored / launched apps, verify no restore
Change-Id: I6ee1a2aca49224f0228f7ad340d3424fbe50e7bb
parent 3d04517e
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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.
+12 −1
Original line number Diff line number Diff line
@@ -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",
}
+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
+21 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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) {
+9 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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