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

Commit 735cbd5a authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov
Browse files

Update eligibility rules for adb backup

1. Adb backup is enabled by default for "android" package that corresponds to SystemBackupAgent (no change from current behavior)
2. System and privileged apps can use android.backup.ALLOW_ADB_BACKUP manifest property to enable / disable adb backup. Disabled by default.
3. Other apps can only use adb backup when running in debuggable mode.

Bug: 171032338
Test: 1. atest BackupEligibilityRulesTest
      2.1. Run adb backup / restore for SystemBackupAgent and verify
           success (running in system_server)
      2.2. Run adb backup / restore for NexusLauncher with
           "allowAdbBackup=true" and verify success (privileged app)
      2.3. Run adb backup / restore for a non-privileged debuggable app
           and verify success.
Change-Id: Ifefe6d888377d3ac9482928b27c86b2e562ad8fa
parent 1447bab5
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -205,13 +205,16 @@ public class BackupManager {
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
    @IntDef({
        OperationType.BACKUP,
        OperationType.BACKUP,
        OperationType.MIGRATION
        OperationType.MIGRATION,
        OperationType.ADB_BACKUP,
    })
    })
    public @interface OperationType {
    public @interface OperationType {
        // A regular backup / restore operation.
        // A backup / restore to / from an off-device location, e.g. cloud.
        int BACKUP = 0;
        int BACKUP = 0;
        // A full migration: all app data for non-system apps is eligible.
        // A direct transfer to another device.
        int MIGRATION = 1;
        int MIGRATION = 1;
        // Backup via adb, data saved on the host machine.
        int ADB_BACKUP = 3;
    }
    }


    private Context mContext;
    private Context mContext;
+8 −0
Original line number Original line Diff line number Diff line
@@ -4131,6 +4131,14 @@ public abstract class PackageManager {
     */
     */
    public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2;
    public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2;


    /**
     * A manifest property to control app's participation in {@code adb backup}. Should only
     * be used by system / privileged apps.
     *
     * @hide
     */
    public static final String PROPERTY_ALLOW_ADB_BACKUP = "android.backup.ALLOW_ADB_BACKUP";

    /** {@hide} */
    /** {@hide} */
    public int getUserId() {
    public int getUserId() {
        return UserHandle.myUserId();
        return UserHandle.myUserId();
+1 −1
Original line number Original line Diff line number Diff line
@@ -10,5 +10,5 @@ java_library_static {
    defaults: ["platform_service_defaults"],
    defaults: ["platform_service_defaults"],
    srcs: [":services.backup-sources"],
    srcs: [":services.backup-sources"],
    libs: ["services.core"],
    libs: ["services.core"],
    static_libs: ["backuplib"],
    static_libs: ["backuplib", "app-compat-annotations"],
}
}
+3 −1
Original line number Original line Diff line number Diff line
@@ -3030,9 +3030,11 @@ public class UserBackupManagerService {
            }
            }
            Slog.i(TAG, addUserIdToLogMessage(mUserId, "Beginning adb backup..."));
            Slog.i(TAG, addUserIdToLogMessage(mUserId, "Beginning adb backup..."));


            BackupEligibilityRules eligibilityRules = getEligibilityRulesForOperation(
                    OperationType.ADB_BACKUP);
            AdbBackupParams params = new AdbBackupParams(fd, includeApks, includeObbs,
            AdbBackupParams params = new AdbBackupParams(fd, includeApks, includeObbs,
                    includeShared, doWidgets, doAllApps, includeSystem, compress, doKeyValue,
                    includeShared, doWidgets, doAllApps, includeSystem, compress, doKeyValue,
                    pkgList, mScheduledBackupEligibility);
                    pkgList, eligibilityRules);
            final int token = generateRandomIntegerToken();
            final int token = generateRandomIntegerToken();
            synchronized (mAdbBackupRestoreConfirmations) {
            synchronized (mAdbBackupRestoreConfirmations) {
                mAdbBackupRestoreConfirmations.put(token, params);
                mAdbBackupRestoreConfirmations.put(token, params);
+6 −3
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_VERSION;


import android.app.backup.BackupManager;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IFullBackupRestoreObserver;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
@@ -104,11 +105,13 @@ public class PerformAdbRestoreTask implements Runnable {
                return;
                return;
            }
            }


            BackupEligibilityRules eligibilityRules = new BackupEligibilityRules(
                    mBackupManagerService.getPackageManager(),
                    LocalServices.getService(PackageManagerInternal.class),
                    mBackupManagerService.getUserId(), BackupManager.OperationType.ADB_BACKUP);
            FullRestoreEngine mEngine = new FullRestoreEngine(mBackupManagerService, null,
            FullRestoreEngine mEngine = new FullRestoreEngine(mBackupManagerService, null,
                    mObserver, null, null, true, 0 /*unused*/, true,
                    mObserver, null, null, true, 0 /*unused*/, true,
                    BackupEligibilityRules.forBackup(mBackupManagerService.getPackageManager(),
                    eligibilityRules);
                                    LocalServices.getService(PackageManagerInternal.class),
                                    mBackupManagerService.getUserId()));
            FullRestoreEngineThread mEngineThread = new FullRestoreEngineThread(mEngine,
            FullRestoreEngineThread mEngineThread = new FullRestoreEngineThread(mEngine,
                    tarInputStream);
                    tarInputStream);
            mEngineThread.run();
            mEngineThread.run();
Loading