Merge changes Ibd37ae12,I9a33547c

* changes:
  backup: no-op code cleanup
  [Multi-user] Make backup dirs user-specific
This commit is contained in:
Chandan Nath
2019-01-07 17:45:53 +00:00
committed by Android (Google) Code Review
5 changed files with 55 additions and 111 deletions

View File

@@ -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);

View File

@@ -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,

View File

@@ -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
if (userId != UserHandle.USER_SYSTEM) {
return new File(getBaseDir(userId), BACKUP_STAGING_DIR);
}
// 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);
}
/** 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");
}
}

View File

@@ -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()

View File

@@ -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");