Merge changes Ibd37ae12,I9a33547c
* changes: backup: no-op code cleanup [Multi-user] Make backup dirs user-specific
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user