diff options
| -rw-r--r-- | cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 24 | ||||
| -rw-r--r-- | core/java/android/backup/BackupManager.java | 16 | ||||
| -rw-r--r-- | core/java/android/backup/IRestoreSession.aidl | 2 | ||||
| -rw-r--r-- | core/java/android/backup/SharedPreferencesBackupHelper.java | 2 | ||||
| -rw-r--r-- | core/java/android/os/AsyncTask.java | 6 | ||||
| -rw-r--r-- | services/java/com/android/server/BackupManagerService.java | 20 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ActivityManagerService.java | 9 | ||||
| -rw-r--r-- | tests/backup/src/com/android/backuptest/BackupTestAgent.java | 2 | ||||
| -rwxr-xr-x | tests/backup/test_backup.sh | 5 | ||||
| -rwxr-xr-x | tests/backup/test_restore.sh | 19 |
10 files changed, 72 insertions, 33 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index 01083f1..c299bff 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -171,9 +171,7 @@ public final class Bmgr { if (sets == null || sets.length == 0) { System.out.println("No restore sets available"); } else { - for (RestoreSet s : sets) { - System.out.println(" " + s.token + " : " + s.name); - } + printRestoreSets(sets); } } catch (RemoteException e) { System.err.println(e.toString()); @@ -181,6 +179,12 @@ public final class Bmgr { } } + private void printRestoreSets(RestoreSet[] sets) { + for (RestoreSet s : sets) { + System.out.println(" " + s.token + " : " + s.name); + } + } + class RestoreObserver extends IRestoreObserver.Stub { boolean done; public void restoreStarting(int numPackages) { @@ -201,9 +205,9 @@ public final class Bmgr { } private void doRestore() { - int token; + long token; try { - token = Integer.parseInt(nextArg()); + token = Long.parseLong(nextArg()); } catch (NumberFormatException e) { showUsage(); return; @@ -212,6 +216,7 @@ public final class Bmgr { RestoreObserver observer = new RestoreObserver(); try { + boolean didRestore = false; int curTransport = mBmgr.getCurrentTransport(); mRestore = mBmgr.beginRestoreSession(curTransport); if (mRestore == null) { @@ -223,9 +228,18 @@ public final class Bmgr { if (s.token == token) { System.out.println("Scheduling restore: " + s.name); mRestore.performRestore(token, observer); + didRestore = true; break; } } + if (!didRestore) { + if (sets == null || sets.length == 0) { + System.out.println("No available restore sets; no restore performed"); + } else { + System.out.println("No matching restore set token. Available sets:"); + printRestoreSets(sets); + } + } mRestore.endRestoreSession(); } catch (RemoteException e) { System.err.println(e.toString()); diff --git a/core/java/android/backup/BackupManager.java b/core/java/android/backup/BackupManager.java index 8df7eae..79e2c03 100644 --- a/core/java/android/backup/BackupManager.java +++ b/core/java/android/backup/BackupManager.java @@ -68,9 +68,11 @@ public class BackupManager { * {@link android.app.BackupAgent} subclass will be scheduled when you call this method. */ public void dataChanged() { - try { - mService.dataChanged(mContext.getPackageName()); - } catch (RemoteException e) { + if (mService != null) { + try { + mService.dataChanged(mContext.getPackageName()); + } catch (RemoteException e) { + } } } @@ -83,9 +85,11 @@ public class BackupManager { */ public IRestoreSession beginRestoreSession(int transportID) { IRestoreSession binder = null; - try { - binder = mService.beginRestoreSession(transportID); - } catch (RemoteException e) { + if (mService != null) { + try { + binder = mService.beginRestoreSession(transportID); + } catch (RemoteException e) { + } } return binder; } diff --git a/core/java/android/backup/IRestoreSession.aidl b/core/java/android/backup/IRestoreSession.aidl index ac01c2d..2a1fbc1 100644 --- a/core/java/android/backup/IRestoreSession.aidl +++ b/core/java/android/backup/IRestoreSession.aidl @@ -45,7 +45,7 @@ interface IRestoreSession { * @param observer If non-null, this binder points to an object that will receive * progress callbacks during the restore operation. */ - int performRestore(int token, IRestoreObserver observer); + int performRestore(long token, IRestoreObserver observer); /** * End this restore session. After this method is called, the IRestoreSession binder diff --git a/core/java/android/backup/SharedPreferencesBackupHelper.java b/core/java/android/backup/SharedPreferencesBackupHelper.java index f492629..4a7b399 100644 --- a/core/java/android/backup/SharedPreferencesBackupHelper.java +++ b/core/java/android/backup/SharedPreferencesBackupHelper.java @@ -30,7 +30,7 @@ public class SharedPreferencesBackupHelper extends FileBackupHelperBase implemen private Context mContext; private String[] mPrefGroups; - public SharedPreferencesBackupHelper(Context context, String[] prefGroups) { + public SharedPreferencesBackupHelper(Context context, String... prefGroups) { super(context); mContext = context; diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java index 6c13582..abfb274 100644 --- a/core/java/android/os/AsyncTask.java +++ b/core/java/android/os/AsyncTask.java @@ -127,12 +127,12 @@ import java.util.concurrent.atomic.AtomicInteger; public abstract class AsyncTask<Params, Progress, Result> { private static final String LOG_TAG = "AsyncTask"; - private static final int CORE_POOL_SIZE = 1; - private static final int MAXIMUM_POOL_SIZE = 10; + private static final int CORE_POOL_SIZE = 5; + private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 10; private static final BlockingQueue<Runnable> sWorkQueue = - new LinkedBlockingQueue<Runnable>(MAXIMUM_POOL_SIZE); + new LinkedBlockingQueue<Runnable>(10); private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index bc2eaed..bbebba3 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -138,10 +138,12 @@ class BackupManagerService extends IBackupManager.Stub { private class RestoreParams { public IBackupTransport transport; public IRestoreObserver observer; + public long token; - RestoreParams(IBackupTransport _transport, IRestoreObserver _obs) { + RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, long _token) { transport = _transport; observer = _obs; + token = _token; } } @@ -347,9 +349,8 @@ class BackupManagerService extends IBackupManager.Stub { case MSG_RUN_RESTORE: { - int token = msg.arg1; RestoreParams params = (RestoreParams)msg.obj; - (new PerformRestoreThread(params.transport, params.observer, token)).start(); + (new PerformRestoreThread(params.transport, params.observer, params.token)).start(); break; } } @@ -761,7 +762,7 @@ class BackupManagerService extends IBackupManager.Stub { class PerformRestoreThread extends Thread { private IBackupTransport mTransport; private IRestoreObserver mObserver; - private int mToken; + private long mToken; private RestoreSet mImage; private File mStateDir; @@ -776,7 +777,7 @@ class BackupManagerService extends IBackupManager.Stub { } PerformRestoreThread(IBackupTransport transport, IRestoreObserver observer, - int restoreSetToken) { + long restoreSetToken) { mTransport = transport; mObserver = observer; mToken = restoreSetToken; @@ -847,9 +848,7 @@ class BackupManagerService extends IBackupManager.Stub { } } - // STOPSHIP TODO: pick out the set for this token (instead of images[0]) - long token = images[0].token; - if (!mTransport.startRestore(token, restorePackages.toArray(new PackageInfo[0]))) { + if (!mTransport.startRestore(mToken, restorePackages.toArray(new PackageInfo[0]))) { // STOPSHIP TODO: Handle the failure somehow? Log.e(TAG, "Error starting restore operation"); return; @@ -1198,7 +1197,7 @@ class BackupManagerService extends IBackupManager.Stub { } } - public int performRestore(int token, IRestoreObserver observer) + public int performRestore(long token, IRestoreObserver observer) throws android.os.RemoteException { mContext.enforceCallingPermission("android.permission.BACKUP", "performRestore"); @@ -1206,8 +1205,7 @@ class BackupManagerService extends IBackupManager.Stub { for (int i = 0; i < mRestoreSets.length; i++) { if (token == mRestoreSets[i].token) { Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); - msg.obj = new RestoreParams(mRestoreTransport, observer); - msg.arg1 = token; + msg.obj = new RestoreParams(mRestoreTransport, observer, token); mBackupHandler.sendMessage(msg); return 0; } diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index fd1dfc8..6d04b6b 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -10472,8 +10472,17 @@ public final class ActivityManagerService extends ActivityManagerNative implemen // done with this agent public void unbindBackupAgent(ApplicationInfo appInfo) { if (DEBUG_BACKUP) Log.v(TAG, "unbindBackupAgent: " + appInfo); + if (appInfo == null) { + Log.w(TAG, "unbind backup agent for null app"); + return; + } synchronized(this) { + if (mBackupAppName == null) { + Log.w(TAG, "Unbinding backup agent with no active backup"); + return; + } + if (!mBackupAppName.equals(appInfo.packageName)) { Log.e(TAG, "Unbind of " + appInfo + " but is not the current backup target"); return; diff --git a/tests/backup/src/com/android/backuptest/BackupTestAgent.java b/tests/backup/src/com/android/backuptest/BackupTestAgent.java index 6acd90c..8e4fd39 100644 --- a/tests/backup/src/com/android/backuptest/BackupTestAgent.java +++ b/tests/backup/src/com/android/backuptest/BackupTestAgent.java @@ -18,6 +18,7 @@ package com.android.backuptest; import android.backup.BackupHelperAgent; import android.backup.FileBackupHelper; +import android.backup.SharedPreferencesBackupHelper; public class BackupTestAgent extends BackupHelperAgent { @@ -25,6 +26,7 @@ public class BackupTestAgent extends BackupHelperAgent addHelper("data_files", new FileBackupHelper(this, BackupTestActivity.FILE_NAME)); addHelper("more_data_files", new FileBackupHelper(this, "another_file.txt", "3.txt", "empty.txt")); + addHelper("shared_prefs", new SharedPreferencesBackupHelper(this, "settings", "raw")); } } diff --git a/tests/backup/test_backup.sh b/tests/backup/test_backup.sh index 6ef5dff..dbf9ed2 100755 --- a/tests/backup/test_backup.sh +++ b/tests/backup/test_backup.sh @@ -9,6 +9,8 @@ adb shell bmgr transport 1 adb shell "rm /data/data/com.android.backuptest/files/* ; \ mkdir /data/data/com.android.backuptest ; \ mkdir /data/data/com.android.backuptest/files ; \ + mkdir /data/data/com.android.backuptest/shared_prefs ; \ + echo -n \"<map><int name=\\\"pref\\\" value=\\\"1\\\" /></map>\" > /data/data/com.android.backuptest/shared_prefs/raw.xml ; \ echo -n first file > /data/data/com.android.backuptest/files/file.txt ; \ echo -n asdf > /data/data/com.android.backuptest/files/another_file.txt ; \ echo -n 3 > /data/data/com.android.backuptest/files/3.txt ; \ @@ -20,3 +22,6 @@ adb shell bmgr backup com.android.backuptest # run the backup adb shell bmgr run + + + diff --git a/tests/backup/test_restore.sh b/tests/backup/test_restore.sh index f3d581e..ccf29cf 100755 --- a/tests/backup/test_restore.sh +++ b/tests/backup/test_restore.sh @@ -2,7 +2,7 @@ function check_file { - data=$(adb shell cat /data/data/com.android.backuptest/files/$1) + data=$(adb shell cat /data/data/com.android.backuptest/$1) if [ "$data" = "$2" ] ; then echo "$1 has correct value [$2]" else @@ -16,8 +16,12 @@ function check_file echo --- Previous files adb shell "ls -l /data/data/com.android.backuptest/files" adb shell "rm /data/data/com.android.backuptest/files/*" -echo --- Erased files +echo --- Previous shared_prefs +adb shell "ls -l /data/data/com.android.backuptest/shared_prefs" +adb shell "rm /data/data/com.android.backuptest/shared_prefs/*" +echo --- Erased files and shared_prefs adb shell "ls -l /data/data/com.android.backuptest/files" +adb shell "ls -l /data/data/com.android.backuptest/shared_prefs" echo --- echo @@ -32,15 +36,18 @@ echo echo # check the results -check_file file.txt "first file" -check_file another_file.txt "asdf" -check_file 3.txt "3" -check_file empty.txt "" +check_file files/file.txt "first file" +check_file files/another_file.txt "asdf" +check_file files/3.txt "3" +check_file files/empty.txt "" +check_file shared_prefs/raw.xml '<map><int name="pref" value="1" /></map>' echo echo echo echo --- Restored files adb shell "ls -l /data/data/com.android.backuptest/files" +echo --- Restored shared_prefs +adb shell "ls -l /data/data/com.android.backuptest/shared_prefs" echo --- echo |
