Merge "Add -nosystem flag to adb backup"

This commit is contained in:
Christopher Tate
2011-10-04 16:16:11 -07:00
committed by Android (Google) Code Review
3 changed files with 40 additions and 12 deletions

View File

@@ -66,6 +66,7 @@ public final class Backup {
boolean saveApks = false; boolean saveApks = false;
boolean saveShared = false; boolean saveShared = false;
boolean doEverything = false; boolean doEverything = false;
boolean allIncludesSystem = true;
String arg; String arg;
while ((arg = nextArg()) != null) { while ((arg = nextArg()) != null) {
@@ -78,6 +79,10 @@ public final class Backup {
saveShared = true; saveShared = true;
} else if ("-noshared".equals(arg)) { } else if ("-noshared".equals(arg)) {
saveShared = false; saveShared = false;
} else if ("-system".equals(arg)) {
allIncludesSystem = true;
} else if ("-nosystem".equals(arg)) {
allIncludesSystem = false;
} else if ("-all".equals(arg)) { } else if ("-all".equals(arg)) {
doEverything = true; doEverything = true;
} else { } else {
@@ -102,7 +107,7 @@ public final class Backup {
try { try {
ParcelFileDescriptor fd = ParcelFileDescriptor.adoptFd(socketFd); ParcelFileDescriptor fd = ParcelFileDescriptor.adoptFd(socketFd);
String[] packArray = new String[packages.size()]; String[] packArray = new String[packages.size()];
mBackupManager.fullBackup(fd, saveApks, saveShared, doEverything, mBackupManager.fullBackup(fd, saveApks, saveShared, doEverything, allIncludesSystem,
packages.toArray(packArray)); packages.toArray(packArray));
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Unable to invoke backup manager for backup"); Log.e(TAG, "Unable to invoke backup manager for backup");

View File

@@ -157,11 +157,15 @@ interface IBackupManager {
* @param allApps If <code>true</code>, the resulting tar stream will include all * @param allApps If <code>true</code>, the resulting tar stream will include all
* installed applications' data, not just those named in the <code>packageNames</code> * installed applications' data, not just those named in the <code>packageNames</code>
* parameter. * parameter.
* @param allIncludesSystem If {@code true}, then {@code allApps} will be interpreted
* as including packages pre-installed as part of the system. If {@code false},
* then setting {@code allApps} to {@code true} will mean only that all 3rd-party
* applications will be included in the dataset.
* @param packageNames The package names of the apps whose data (and optionally .apk files) * @param packageNames The package names of the apps whose data (and optionally .apk files)
* are to be backed up. The <code>allApps</code> parameter supersedes this. * are to be backed up. The <code>allApps</code> parameter supersedes this.
*/ */
void fullBackup(in ParcelFileDescriptor fd, boolean includeApks, boolean includeShared, void fullBackup(in ParcelFileDescriptor fd, boolean includeApks, boolean includeShared,
boolean allApps, in String[] packageNames); boolean allApps, boolean allIncludesSystem, in String[] packageNames);
/** /**
* Restore device content from the data stream passed through the given socket. The * Restore device content from the data stream passed through the given socket. The

View File

@@ -325,14 +325,16 @@ class BackupManagerService extends IBackupManager.Stub {
public boolean includeApks; public boolean includeApks;
public boolean includeShared; public boolean includeShared;
public boolean allApps; public boolean allApps;
public boolean includeSystem;
public String[] packages; public String[] packages;
FullBackupParams(ParcelFileDescriptor output, boolean saveApks, boolean saveShared, FullBackupParams(ParcelFileDescriptor output, boolean saveApks, boolean saveShared,
boolean doAllApps, String[] pkgList) { boolean doAllApps, boolean doSystem, String[] pkgList) {
fd = output; fd = output;
includeApks = saveApks; includeApks = saveApks;
includeShared = saveShared; includeShared = saveShared;
allApps = doAllApps; allApps = doAllApps;
includeSystem = doSystem;
packages = pkgList; packages = pkgList;
} }
} }
@@ -504,7 +506,7 @@ class BackupManagerService extends IBackupManager.Stub {
PerformFullBackupTask task = new PerformFullBackupTask(params.fd, PerformFullBackupTask task = new PerformFullBackupTask(params.fd,
params.observer, params.includeApks, params.observer, params.includeApks,
params.includeShared, params.curPassword, params.encryptPassword, params.includeShared, params.curPassword, params.encryptPassword,
params.allApps, params.packages, params.latch); params.allApps, params.includeSystem, params.packages, params.latch);
(new Thread(task)).start(); (new Thread(task)).start();
break; break;
} }
@@ -2161,6 +2163,7 @@ class BackupManagerService extends IBackupManager.Stub {
boolean mIncludeApks; boolean mIncludeApks;
boolean mIncludeShared; boolean mIncludeShared;
boolean mAllApps; boolean mAllApps;
final boolean mIncludeSystem;
String[] mPackages; String[] mPackages;
String mCurrentPassword; String mCurrentPassword;
String mEncryptPassword; String mEncryptPassword;
@@ -2219,13 +2222,14 @@ class BackupManagerService extends IBackupManager.Stub {
PerformFullBackupTask(ParcelFileDescriptor fd, IFullBackupRestoreObserver observer, PerformFullBackupTask(ParcelFileDescriptor fd, IFullBackupRestoreObserver observer,
boolean includeApks, boolean includeShared, String curPassword, boolean includeApks, boolean includeShared, String curPassword,
String encryptPassword, boolean doAllApps, String[] packages, String encryptPassword, boolean doAllApps, boolean doSystem, String[] packages,
AtomicBoolean latch) { AtomicBoolean latch) {
mOutputFile = fd; mOutputFile = fd;
mObserver = observer; mObserver = observer;
mIncludeApks = includeApks; mIncludeApks = includeApks;
mIncludeShared = includeShared; mIncludeShared = includeShared;
mAllApps = doAllApps; mAllApps = doAllApps;
mIncludeSystem = doSystem;
mPackages = packages; mPackages = packages;
mCurrentPassword = curPassword; mCurrentPassword = curPassword;
// when backing up, if there is a current backup password, we require that // when backing up, if there is a current backup password, we require that
@@ -2245,7 +2249,7 @@ class BackupManagerService extends IBackupManager.Stub {
@Override @Override
public void run() { public void run() {
final List<PackageInfo> packagesToBackup; List<PackageInfo> packagesToBackup = new ArrayList<PackageInfo>();
Slog.i(TAG, "--- Performing full-dataset backup ---"); Slog.i(TAG, "--- Performing full-dataset backup ---");
sendStartBackup(); sendStartBackup();
@@ -2254,8 +2258,23 @@ class BackupManagerService extends IBackupManager.Stub {
if (mAllApps) { if (mAllApps) {
packagesToBackup = mPackageManager.getInstalledPackages( packagesToBackup = mPackageManager.getInstalledPackages(
PackageManager.GET_SIGNATURES); PackageManager.GET_SIGNATURES);
} else { // Exclude system apps if we've been asked to do so
packagesToBackup = new ArrayList<PackageInfo>(); if (mIncludeSystem == false) {
for (int i = 0; i < packagesToBackup.size(); ) {
PackageInfo pkg = packagesToBackup.get(i);
if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
packagesToBackup.remove(i);
} else {
i++;
}
}
}
}
// Now process the command line argument packages, if any. Note that explicitly-
// named system-partition packages will be included even if includeSystem was
// set to false.
if (mPackages != null) {
for (String pkgName : mPackages) { for (String pkgName : mPackages) {
try { try {
packagesToBackup.add(mPackageManager.getPackageInfo(pkgName, packagesToBackup.add(mPackageManager.getPackageInfo(pkgName,
@@ -2268,8 +2287,8 @@ class BackupManagerService extends IBackupManager.Stub {
// Cull any packages that have indicated that backups are not permitted. // Cull any packages that have indicated that backups are not permitted.
for (int i = 0; i < packagesToBackup.size(); ) { for (int i = 0; i < packagesToBackup.size(); ) {
PackageInfo info = packagesToBackup.get(i); PackageInfo pkg = packagesToBackup.get(i);
if ((info.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) == 0) { if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) == 0) {
packagesToBackup.remove(i); packagesToBackup.remove(i);
} else { } else {
i++; i++;
@@ -4781,7 +4800,7 @@ class BackupManagerService extends IBackupManager.Stub {
// to the supplied file descriptor. This method is synchronous and does not return // to the supplied file descriptor. This method is synchronous and does not return
// to the caller until the backup has been completed. // to the caller until the backup has been completed.
public void fullBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeShared, public void fullBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeShared,
boolean doAllApps, String[] pkgList) { boolean doAllApps, boolean includeSystem, String[] pkgList) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullBackup"); mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullBackup");
// Validate // Validate
@@ -4811,7 +4830,7 @@ class BackupManagerService extends IBackupManager.Stub {
Slog.i(TAG, "Beginning full backup..."); Slog.i(TAG, "Beginning full backup...");
FullBackupParams params = new FullBackupParams(fd, includeApks, includeShared, FullBackupParams params = new FullBackupParams(fd, includeApks, includeShared,
doAllApps, pkgList); doAllApps, includeSystem, pkgList);
final int token = generateToken(); final int token = generateToken();
synchronized (mFullConfirmations) { synchronized (mFullConfirmations) {
mFullConfirmations.put(token, params); mFullConfirmations.put(token, params);