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

Commit 6fbd65aa authored by Shreyas Basarge's avatar Shreyas Basarge Committed by Android (Google) Code Review
Browse files

Merge "Non incremental backup flag for requestBackup"

parents 1f9f1100 38e7486d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -6747,6 +6747,7 @@ package android.app.backup {
    method public boolean isBackupEnabled();
    method public java.lang.String[] listAllTransports();
    method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver);
    method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, int);
    method public int requestRestore(android.app.backup.RestoreObserver);
    method public java.lang.String selectBackupTransport(java.lang.String);
    method public void setAutoRestore(boolean);
@@ -6757,6 +6758,8 @@ package android.app.backup {
    field public static final int ERROR_TRANSPORT_ABORTED = -1000; // 0xfffffc18
    field public static final int ERROR_TRANSPORT_PACKAGE_REJECTED = -1002; // 0xfffffc16
    field public static final int ERROR_TRANSPORT_QUOTA_EXCEEDED = -1005; // 0xfffffc13
    field public static final int FLAG_NON_INCREMENTAL_BACKUP = 1; // 0x1
    field public static final java.lang.String PACKAGE_MANAGER_SENTINEL = "@pm@";
    field public static final int SUCCESS = 0; // 0x0
  }
+20 −8
Original line number Diff line number Diff line
@@ -270,7 +270,7 @@ public final class Bmgr {
        }
    }

    private void backupNowAllPackages() {
    private void backupNowAllPackages(boolean nonIncrementalBackup) {
        int userId = UserHandle.USER_SYSTEM;
        IPackageManager mPm =
                IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
@@ -297,14 +297,19 @@ public final class Bmgr {
                    System.err.println(BMGR_NOT_RUNNING_ERR);
                }
            }
            backupNowPackages(packages);
            backupNowPackages(packages, nonIncrementalBackup);
        }
    }

    private void backupNowPackages(List<String> packages) {
    private void backupNowPackages(List<String> packages, boolean nonIncrementalBackup) {
        int flags = 0;
        if (nonIncrementalBackup) {
            flags |= BackupManager.FLAG_NON_INCREMENTAL_BACKUP;
        }
        try {
            BackupObserver observer = new BackupObserver();
            int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer);
            int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer,
                    flags);
            if (err == 0) {
                // Off and running -- wait for the backup to complete
                observer.waitForCompletion();
@@ -320,24 +325,31 @@ public final class Bmgr {
    private void doBackupNow() {
        String pkg;
        boolean backupAll = false;
        boolean nonIncrementalBackup = false;
        ArrayList<String> allPkgs = new ArrayList<String>();
        while ((pkg = nextArg()) != null) {
            if (pkg.equals("--all")) {
                backupAll = true;
            } else if (pkg.equals("--non-incremental")) {
                nonIncrementalBackup = true;
            } else if (pkg.equals("--incremental")) {
                nonIncrementalBackup = false;
            } else {
                allPkgs.add(pkg);
            }
        }
        if (backupAll) {
            if (allPkgs.size() == 0) {
                System.out.println("Running backup for all packages.");
                backupNowAllPackages();
                System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
                        "incremental backup for all packages.");
                backupNowAllPackages(nonIncrementalBackup);
            } else {
                System.err.println("Provide only '--all' flag or list of packages.");
            }
        } else if (allPkgs.size() > 0) {
            System.out.println("Running backup for " + allPkgs.size() +" requested packages.");
            backupNowPackages(allPkgs);
            System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
                    "incremental backup for " + allPkgs.size() +" requested packages.");
            backupNowPackages(allPkgs, nonIncrementalBackup);
        } else {
            System.err.println("Provide '--all' flag or list of packages.");
        }
+43 −1
Original line number Diff line number Diff line
@@ -136,6 +136,27 @@ public class BackupManager {
     */
    public static final String EXTRA_BACKUP_SERVICES_AVAILABLE = "backup_services_available";

    /**
     * If this flag is passed to {@link #requestBackup(String[], BackupObserver, int)},
     * BackupManager will pass a blank old state to BackupAgents of requested packages.
     *
     * @hide
     */
    @SystemApi
    public static final int FLAG_NON_INCREMENTAL_BACKUP = 1;

    /**
     * Use with {@link #requestBackup} to force backup of
     * package meta data. Typically you do not need to explicitly request this be backed up as it is
     * handled internally by the BackupManager. If you are requesting backups with
     * FLAG_NON_INCREMENTAL, this package won't automatically be backed up and you have to
     * explicitly request for its backup.
     *
     * @hide
     */
    @SystemApi
    public static final String PACKAGE_MANAGER_SENTINEL = "@pm@";

    private Context mContext;
    private static IBackupManager sService;

@@ -484,13 +505,34 @@ public class BackupManager {
     */
    @SystemApi
    public int requestBackup(String[] packages, BackupObserver observer) {
        return requestBackup(packages, observer, 0);
    }

    /**
     * Request an immediate backup, providing an observer to which results of the backup operation
     * will be published. The Android backup system will decide for each package whether it will
     * be full app data backup or key/value-pair-based backup.
     *
     * <p>If this method returns {@link BackupManager#SUCCESS}, the OS will attempt to backup all
     * provided packages using the remote transport.
     *
     * @param packages List of package names to backup.
     * @param observer The {@link BackupObserver} to receive callbacks during the backup
     *                 operation. Could be {@code null}.
     * @param flags    {@link #FLAG_NON_INCREMENTAL_BACKUP}.
     * @return {@link BackupManager#SUCCESS} on success; nonzero on error.
     * @throws IllegalArgumentException on null or empty {@code packages} param.
     * @hide
     */
    @SystemApi
    public int requestBackup(String[] packages, BackupObserver observer, int flags) {
        checkServiceBinder();
        if (sService != null) {
            try {
                BackupObserverWrapper observerWrapper = observer == null
                        ? null
                        : new BackupObserverWrapper(mContext, observer);
                return sService.requestBackup(packages, observerWrapper);
                return sService.requestBackup(packages, observerWrapper, flags);
            } catch (RemoteException e) {
                Log.e(TAG, "requestBackup() couldn't connect");
            }
+3 −1
Original line number Diff line number Diff line
@@ -357,7 +357,9 @@ interface IBackupManager {
     * @param observer The {@link BackupObserver} to receive callbacks during the backup
     * operation.
     *
     * @param flags {@link BackupManager#FLAG_NON_INCREMENTAL_BACKUP}.
     *
     * @return Zero on success; nonzero on error.
     */
    int requestBackup(in String[] packages, IBackupObserver observer);
    int requestBackup(in String[] packages, IBackupObserver observer, int flags);
}
+55 −25
Original line number Diff line number Diff line
@@ -577,15 +577,18 @@ public class BackupManagerService {
        public ArrayList<String> fullPackages;
        public IBackupObserver observer;
        public boolean userInitiated;
        public boolean nonIncrementalBackup;

        BackupParams(IBackupTransport transport, String dirName, ArrayList<String> kvPackages,
                ArrayList<String> fullPackages, IBackupObserver observer, boolean userInitiated) {
                ArrayList<String> fullPackages, IBackupObserver observer, boolean userInitiated,
                boolean nonIncrementalBackup) {
            this.transport = transport;
            this.dirName = dirName;
            this.kvPackages = kvPackages;
            this.fullPackages = fullPackages;
            this.observer = observer;
            this.userInitiated = userInitiated;
            this.nonIncrementalBackup = nonIncrementalBackup;
        }
    }

@@ -794,7 +797,7 @@ public class BackupManagerService {
                    try {
                        String dirName = transport.transportDirName();
                        PerformBackupTask pbt = new PerformBackupTask(transport, dirName,
                                queue, oldJournal, null, null, false);
                                queue, oldJournal, null, null, false, false /* nonIncremental */);
                        Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
                        sendMessage(pbtMessage);
                    } catch (Exception e) {
@@ -1033,7 +1036,8 @@ public class BackupManagerService {
                mWakelock.acquire();

                PerformBackupTask pbt = new PerformBackupTask(params.transport, params.dirName,
                    kvQueue, null, params.observer, params.fullPackages, true);
                        kvQueue, null, params.observer, params.fullPackages, true,
                        params.nonIncrementalBackup);
                Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
                sendMessage(pbtMessage);
                break;
@@ -2492,7 +2496,7 @@ public class BackupManagerService {
        return token;
    }

    public int requestBackup(String[] packages, IBackupObserver observer) {
    public int requestBackup(String[] packages, IBackupObserver observer, int flags) {
        mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup");

        if (packages == null || packages.length < 1) {
@@ -2510,6 +2514,10 @@ public class BackupManagerService {
        ArrayList<String> fullBackupList = new ArrayList<>();
        ArrayList<String> kvBackupList = new ArrayList<>();
        for (String packageName : packages) {
            if (PACKAGE_MANAGER_SENTINEL.equals(packageName)) {
                kvBackupList.add(packageName);
                continue;
            }
            try {
                PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName,
                        PackageManager.GET_SIGNATURES);
@@ -2543,9 +2551,12 @@ public class BackupManagerService {
            sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
            return BackupManager.ERROR_TRANSPORT_ABORTED;
        }

        boolean nonIncrementalBackup = (flags & BackupManager.FLAG_NON_INCREMENTAL_BACKUP) != 0;

        Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP);
        msg.obj = new BackupParams(transport, dirName, kvBackupList, fullBackupList, observer,
                true);
                true, nonIncrementalBackup);
        mBackupHandler.sendMessage(msg);
        return BackupManager.SUCCESS;
    }
@@ -2673,17 +2684,20 @@ public class BackupManagerService {
        ParcelFileDescriptor mNewState;
        int mStatus;
        boolean mFinished;
        boolean mUserInitiated;
        final boolean mUserInitiated;
        final boolean mNonIncremental;

        public PerformBackupTask(IBackupTransport transport, String dirName,
                ArrayList<BackupRequest> queue, File journal, IBackupObserver observer,
                ArrayList<String> pendingFullBackups, boolean userInitiated) {
                ArrayList<String> pendingFullBackups, boolean userInitiated,
                boolean nonIncremental) {
            mTransport = transport;
            mOriginalQueue = queue;
            mJournal = journal;
            mObserver = observer;
            mPendingFullBackups = pendingFullBackups;
            mUserInitiated = userInitiated;
            mNonIncremental = nonIncremental;

            mStateDir = new File(mBaseStateDir, dirName);

@@ -2748,6 +2762,10 @@ public class BackupManagerService {
            // the way.
            mQueue = (ArrayList<BackupRequest>) mOriginalQueue.clone();

            // When the transport is forcing non-incremental key/value payloads, we send the
            // metadata only if it explicitly asks for it.
            boolean skipPm = mNonIncremental;

            // The app metadata pseudopackage might also be represented in the
            // backup queue if apps have been added/removed since the last time
            // we performed a backup.  Drop it from the working queue now that
@@ -2758,6 +2776,7 @@ public class BackupManagerService {
                        Slog.i(TAG, "Metadata in queue; eliding");
                    }
                    mQueue.remove(i);
                    skipPm = false;
                    break;
                }
            }
@@ -2785,6 +2804,10 @@ public class BackupManagerService {
                    }
                }

                if (skipPm) {
                    Slog.d(TAG, "Skipping backup of package metadata.");
                    executeNextState(BackupState.RUNNING_QUEUE);
                } else {
                    // The package manager doesn't have a proper <application> etc, but since
                    // it's running here in the system process we can just set up its agent
                    // directly and use a synthetic BackupRequest.  We always run this pass
@@ -2802,6 +2825,7 @@ public class BackupManagerService {
                        // pending timeout message for it.
                        mBackupHandler.removeMessages(MSG_TIMEOUT);
                    }
                }

                if (mStatus == BackupTransport.TRANSPORT_NOT_INITIALIZED) {
                    // The backend reports that our dataset has been wiped.  Note this in
@@ -3066,6 +3090,7 @@ public class BackupManagerService {
            if (DEBUG) Slog.d(TAG, "invokeAgentForBackup on " + packageName);
            addBackupTrace("invoking " + packageName);

            File blankStateName = new File(mStateDir, "blank_state");
            mSavedStateName = new File(mStateDir, packageName);
            mBackupDataName = new File(mDataDir, packageName + ".data");
            mNewStateName = new File(mStateDir, packageName + ".new");
@@ -3088,9 +3113,10 @@ public class BackupManagerService {
                }

                // In a full backup, we pass a null ParcelFileDescriptor as
                // the saved-state "file". This is by definition an incremental,
                // so we build a saved state file to pass.
                mSavedState = ParcelFileDescriptor.open(mSavedStateName,
                // the saved-state "file". For key/value backups we pass the old state if
                // an incremental backup is required, and a blank state otherwise.
                mSavedState = ParcelFileDescriptor.open(
                        mNonIncremental ? blankStateName : mSavedStateName,
                        ParcelFileDescriptor.MODE_READ_ONLY |
                        ParcelFileDescriptor.MODE_CREATE);  // Make an empty file if necessary

@@ -3120,6 +3146,10 @@ public class BackupManagerService {
                        e.toString());
                agentErrorCleanup();
                return BackupTransport.AGENT_ERROR;
            } finally {
                if (mNonIncremental) {
                    blankStateName.delete();
                }
            }

            // At this point the agent is off and running.  The next thing to happen will
Loading