summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java24
-rw-r--r--core/java/android/backup/BackupManager.java16
-rw-r--r--core/java/android/backup/IRestoreSession.aidl2
-rw-r--r--core/java/android/backup/SharedPreferencesBackupHelper.java2
-rw-r--r--core/java/android/os/AsyncTask.java6
-rw-r--r--services/java/com/android/server/BackupManagerService.java20
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java9
-rw-r--r--tests/backup/src/com/android/backuptest/BackupTestAgent.java2
-rwxr-xr-xtests/backup/test_backup.sh5
-rwxr-xr-xtests/backup/test_restore.sh19
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