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

Commit f13eea0e authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov Committed by Android (Google) Code Review
Browse files

Merge "Skip restore of apps that have been launched or restored." into main

parents 33d5e657 f361f210
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