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

Commit 2fbb91c4 authored by Chandan Nath's avatar Chandan Nath Committed by Android (Google) Code Review
Browse files

Merge changes Ibd37ae12,I9a33547c

* changes:
  backup: no-op code cleanup
  [Multi-user] Make backup dirs user-specific
parents 2729b24c b3bf0c63
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -24,15 +24,12 @@ import android.content.ComponentName;
import android.content.Context;

public class FullBackupJob extends JobService {
    private static final String TAG = "FullBackupJob";
    private static final boolean DEBUG = true;

    private static ComponentName sIdleService =
            new ComponentName("android", FullBackupJob.class.getName());

    private static final int JOB_ID = 0x5038;

    JobParameters mParams;
    private JobParameters mParams;

    public static void schedule(Context ctx, long minDelay, BackupManagerConstants constants) {
        JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+4 −7
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@ import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Slog;

import com.android.server.backup.restore.PerformAdbRestoreTask;

import libcore.io.IoUtils;

import java.io.File;
@@ -42,11 +40,10 @@ public class KeyValueAdbRestoreEngine implements Runnable {
    private final UserBackupManagerService mBackupManagerService;
    private final File mDataDir;

    FileMetadata mInfo;
    PerformAdbRestoreTask mRestoreTask;
    ParcelFileDescriptor mInFD;
    IBackupAgent mAgent;
    int mToken;
    private final FileMetadata mInfo;
    private final ParcelFileDescriptor mInFD;
    private final IBackupAgent mAgent;
    private final int mToken;

    public KeyValueAdbRestoreEngine(UserBackupManagerService backupManagerService,
            File dataDir, FileMetadata info, ParcelFileDescriptor inFD, IBackupAgent agent,
+16 −10
Original line number Diff line number Diff line
@@ -17,29 +17,35 @@
package com.android.server.backup;

import android.os.Environment;
import android.os.UserHandle;

import java.io.File;

/** Directories used for user specific backup/restore persistent state and book-keeping. */
public final class UserBackupManagerFiles {
final class UserBackupManagerFiles {
    // Name of the directories the service stores bookkeeping data under.
    private static final String BACKUP_PERSISTENT_DIR = "backup";
    private static final String BACKUP_STAGING_DIR = "backup_stage";

    private static File getBaseDir(int userId) {
        return Environment.getDataSystemCeDirectory(userId);
    }

    static File getBaseStateDir(int userId) {
        // TODO (b/120424138) this should be per user
        if (userId != UserHandle.USER_SYSTEM) {
            return new File(getBaseDir(userId), BACKUP_PERSISTENT_DIR);
        }
        // TODO (b/120424138) remove if clause above and use same logic for system user.
        // simultaneously, copy below dir to new system user dir
        return new File(Environment.getDataDirectory(), BACKUP_PERSISTENT_DIR);
    }

    static File getDataDir(int userId) {
        // TODO (b/120424138) this should be per user
        // This dir on /cache is managed directly in init.rc
        return new File(Environment.getDownloadCacheDirectory(), BACKUP_STAGING_DIR);
        if (userId != UserHandle.USER_SYSTEM) {
            return new File(getBaseDir(userId), BACKUP_STAGING_DIR);
        }

    /** Directory used by full backup engine to store state. */
    public static File getFullBackupEngineFilesDir(int userId) {
        // TODO (b/120424138) this should be per user
        return new File("/data/system");
        // TODO (b/120424138) remove if clause above and use same logic for system user. Since this
        // is a staging dir, we dont need to copy below dir to new system user dir
        return new File(Environment.getDownloadCacheDirectory(), BACKUP_STAGING_DIR);
    }
}
+19 −82
Original line number Diff line number Diff line
@@ -208,8 +208,8 @@ public class UserBackupManagerService {

    public static final String RUN_BACKUP_ACTION = "android.app.backup.intent.RUN";
    public static final String RUN_INITIALIZE_ACTION = "android.app.backup.intent.INIT";
    public static final String BACKUP_FINISHED_ACTION = "android.intent.action.BACKUP_FINISHED";
    public static final String BACKUP_FINISHED_PACKAGE_EXTRA = "packageName";
    private static final String BACKUP_FINISHED_ACTION = "android.intent.action.BACKUP_FINISHED";
    private static final String BACKUP_FINISHED_PACKAGE_EXTRA = "packageName";

    // Bookkeeping of in-flight operations. The operation token is the index of the entry in the
    // pending operations list.
@@ -247,25 +247,25 @@ public class UserBackupManagerService {
    private final TransportManager mTransportManager;
    private final HandlerThread mUserBackupThread;

    private Context mContext;
    private PackageManager mPackageManager;
    private IPackageManager mPackageManagerBinder;
    private IActivityManager mActivityManager;
    private final Context mContext;
    private final PackageManager mPackageManager;
    private final IPackageManager mPackageManagerBinder;
    private final IActivityManager mActivityManager;
    private PowerManager mPowerManager;
    private AlarmManager mAlarmManager;
    private IStorageManager mStorageManager;
    private BackupManagerConstants mConstants;
    private PowerManager.WakeLock mWakelock;
    private BackupHandler mBackupHandler;
    private final AlarmManager mAlarmManager;
    private final IStorageManager mStorageManager;
    private final BackupManagerConstants mConstants;
    private final PowerManager.WakeLock mWakelock;
    private final BackupHandler mBackupHandler;

    private IBackupManager mBackupManagerBinder;
    private final IBackupManager mBackupManagerBinder;

    private boolean mEnabled;   // access to this is synchronized on 'this'
    private boolean mSetupComplete;
    private boolean mAutoRestore;

    private PendingIntent mRunBackupIntent;
    private PendingIntent mRunInitIntent;
    private final PendingIntent mRunBackupIntent;
    private final PendingIntent mRunInitIntent;

    private final ArraySet<String> mPendingInits = new ArraySet<>();  // transport names

@@ -273,7 +273,7 @@ public class UserBackupManagerService {
    private final SparseArray<HashSet<String>> mBackupParticipants = new SparseArray<>();

    // Backups that we haven't started yet.  Keys are package names.
    private HashMap<String, BackupRequest> mPendingBackups = new HashMap<>();
    private final HashMap<String, BackupRequest> mPendingBackups = new HashMap<>();

    // locking around the pending-backup management
    private final Object mQueueLock = new Object();
@@ -340,7 +340,7 @@ public class UserBackupManagerService {
    private final SparseArray<Operation> mCurrentOperations = new SparseArray<>();
    private final Object mCurrentOpLock = new Object();
    private final Random mTokenGenerator = new Random();
    final AtomicInteger mNextToken = new AtomicInteger();
    private final AtomicInteger mNextToken = new AtomicInteger();

    // Where we keep our journal files and other bookkeeping.
    private final File mBaseStateDir;
@@ -348,7 +348,7 @@ public class UserBackupManagerService {
    private final File mJournalDir;
    @Nullable
    private DataChangedJournal mJournal;
    private File mFullBackupScheduleFile;
    private final File mFullBackupScheduleFile;

    // Keep a log of all the apps we've ever backed up.
    private ProcessedPackagesJournal mProcessedPackagesJournal;
@@ -561,7 +561,7 @@ public class UserBackupManagerService {
        mUserBackupThread.quit();
    }

    public int getUserId() {
    public @UserIdInt int getUserId() {
        return mUserId;
    }

@@ -577,51 +577,27 @@ public class UserBackupManagerService {
        return mContext;
    }

    public void setContext(Context context) {
        mContext = context;
    }

    public PackageManager getPackageManager() {
        return mPackageManager;
    }

    public void setPackageManager(PackageManager packageManager) {
        mPackageManager = packageManager;
    }

    public IPackageManager getPackageManagerBinder() {
        return mPackageManagerBinder;
    }

    public void setPackageManagerBinder(IPackageManager packageManagerBinder) {
        mPackageManagerBinder = packageManagerBinder;
    }

    public IActivityManager getActivityManager() {
        return mActivityManager;
    }

    public void setActivityManager(IActivityManager activityManager) {
        mActivityManager = activityManager;
    }

    public AlarmManager getAlarmManager() {
        return mAlarmManager;
    }

    public void setAlarmManager(AlarmManager alarmManager) {
        mAlarmManager = alarmManager;
    }

    @VisibleForTesting
    void setPowerManager(PowerManager powerManager) {
        mPowerManager = powerManager;
    }

    public void setBackupManagerBinder(IBackupManager backupManagerBinder) {
        mBackupManagerBinder = backupManagerBinder;
    }

    public TransportManager getTransportManager() {
        return mTransportManager;
    }
@@ -656,35 +632,18 @@ public class UserBackupManagerService {
        mWakelock.setWorkSource(workSource);
    }

    public void setWakelock(PowerManager.WakeLock wakelock) {
        mWakelock = wakelock;
    }

    public Handler getBackupHandler() {
        return mBackupHandler;
    }

    public void setBackupHandler(BackupHandler backupHandler) {
        mBackupHandler = backupHandler;
    }

    public PendingIntent getRunInitIntent() {
        return mRunInitIntent;
    }

    public void setRunInitIntent(PendingIntent runInitIntent) {
        mRunInitIntent = runInitIntent;
    }

    public HashMap<String, BackupRequest> getPendingBackups() {
        return mPendingBackups;
    }

    public void setPendingBackups(
            HashMap<String, BackupRequest> pendingBackups) {
        mPendingBackups = pendingBackups;
    }

    public Object getQueueLock() {
        return mQueueLock;
    }
@@ -697,10 +656,6 @@ public class UserBackupManagerService {
        mBackupRunning = backupRunning;
    }

    public long getLastBackupPass() {
        return mLastBackupPass;
    }

    public void setLastBackupPass(long lastBackupPass) {
        mLastBackupPass = lastBackupPass;
    }
@@ -709,10 +664,6 @@ public class UserBackupManagerService {
        return mClearDataLock;
    }

    public boolean isClearingData() {
        return mClearingData;
    }

    public void setClearingData(boolean clearingData) {
        mClearingData = clearingData;
    }
@@ -733,11 +684,6 @@ public class UserBackupManagerService {
        return mActiveRestoreSession;
    }

    public void setActiveRestoreSession(
            ActiveRestoreSession activeRestoreSession) {
        mActiveRestoreSession = activeRestoreSession;
    }

    public SparseArray<Operation> getCurrentOperations() {
        return mCurrentOperations;
    }
@@ -771,18 +717,10 @@ public class UserBackupManagerService {
        return mRng;
    }

    public Set<String> getAncestralPackages() {
        return mAncestralPackages;
    }

    public void setAncestralPackages(Set<String> ancestralPackages) {
        mAncestralPackages = ancestralPackages;
    }

    public long getAncestralToken() {
        return mAncestralToken;
    }

    public void setAncestralToken(long ancestralToken) {
        mAncestralToken = ancestralToken;
    }
@@ -3147,8 +3085,7 @@ public class UserBackupManagerService {
        synchronized (mAgentConnectLock) {
            if (Binder.getCallingUid() == Process.SYSTEM_UID) {
                Slog.d(TAG, "agentConnected pkg=" + packageName + " agent=" + agentBinder);
                IBackupAgent agent = IBackupAgent.Stub.asInterface(agentBinder);
                mConnectedAgent = agent;
                mConnectedAgent = IBackupAgent.Stub.asInterface(agentBinder);
                mConnecting = false;
            } else {
                Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
+15 −8
Original line number Diff line number Diff line
@@ -34,14 +34,12 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;

import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.UserBackupManagerFiles;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.remote.RemoteCall;
import com.android.server.backup.utils.FullBackupUtils;
@@ -78,21 +76,21 @@ public class FullBackupEngine {
        private final File mFilesDir;

        FullBackupRunner(
                UserBackupManagerService userBackupManagerService,
                PackageInfo packageInfo,
                IBackupAgent agent,
                ParcelFileDescriptor pipe,
                int token,
                boolean includeApks)
                throws IOException {
            // TODO: http://b/22388012
            mUserId = UserHandle.USER_SYSTEM;
            mUserId = userBackupManagerService.getUserId();
            mPackageManager = backupManagerService.getPackageManager();
            mPackage = packageInfo;
            mAgent = agent;
            mPipe = ParcelFileDescriptor.dup(pipe.getFileDescriptor());
            mToken = token;
            mIncludeApks = includeApks;
            mFilesDir = UserBackupManagerFiles.getFullBackupEngineFilesDir(mUserId);
            mFilesDir = userBackupManagerService.getDataDir();
        }

        @Override
@@ -155,9 +153,12 @@ public class FullBackupEngine {
                        backupManagerService.getBackupManagerBinder(),
                        mTransportFlags);
            } catch (IOException e) {
                Slog.e(TAG, "Error running full backup for " + mPackage.packageName);
                Slog.e(TAG, "Error running full backup for " + mPackage.packageName, e);
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote agent vanished during full backup of " + mPackage.packageName);
                Slog.e(
                        TAG,
                        "Remote agent vanished during full backup of " + mPackage.packageName,
                        e);
            } finally {
                try {
                    mPipe.close();
@@ -233,7 +234,13 @@ public class FullBackupEngine {
                pipes = ParcelFileDescriptor.createPipe();

                FullBackupRunner runner =
                        new FullBackupRunner(mPkg, mAgent, pipes[1], mOpToken, mIncludeApks);
                        new FullBackupRunner(
                                backupManagerService,
                                mPkg,
                                mAgent,
                                pipes[1],
                                mOpToken,
                                mIncludeApks);
                pipes[1].close(); // the runner has dup'd it
                pipes[1] = null;
                Thread t = new Thread(runner, "app-data-runner");