diff options
| author | Annie Meng <anniemeng@google.com> | 2019-02-01 14:09:14 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-02-01 14:09:14 +0000 |
| commit | f021dc766ca800d0cce5df9f07a613b301a16642 (patch) | |
| tree | 6d717b9d146794ef5bf5f3d6c65ffa835cf36a90 /core/java | |
| parent | fb0699062a3f9b2339a02f135a87cbf25c52583f (diff) | |
| parent | d582787a82d593202517ad852b351863525b7d00 (diff) | |
Merge changes Ie9c8934d,Iea747394
* changes:
Create "android" backup agent in the system process for all users
[Multi-user] Pass userId on backup agent creation
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 43 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/app/IApplicationThread.aidl | 4 |
3 files changed, 36 insertions, 15 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 22dcce51cebb..21d66e567a81 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -129,6 +129,7 @@ import android.util.MergedConfiguration; import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Slog; +import android.util.SparseArray; import android.util.SparseIntArray; import android.util.SuperNotCalledException; import android.util.proto.ProtoOutputStream; @@ -305,8 +306,14 @@ public final class ActivityThread extends ClientTransactionHandler { @UnsupportedAppUsage final ArrayList<Application> mAllApplications = new ArrayList<Application>(); - // set of instantiated backup agents, keyed by package name - final ArrayMap<String, BackupAgent> mBackupAgents = new ArrayMap<String, BackupAgent>(); + /** + * Bookkeeping of instantiated backup agents indexed first by user id, then by package name. + * Indexing by user id supports parallel backups across users on system packages as they run in + * the same process with the same package name. Indexing by package name supports multiple + * distinct applications running in the same process. + */ + private final SparseArray<ArrayMap<String, BackupAgent>> mBackupAgentsByUser = + new SparseArray<>(); /** Reference to singleton {@link ActivityThread} */ @UnsupportedAppUsage private static volatile ActivityThread sCurrentActivityThread; @@ -659,10 +666,11 @@ public final class ActivityThread extends ClientTransactionHandler { ApplicationInfo appInfo; CompatibilityInfo compatInfo; int backupMode; + int userId; public String toString() { return "CreateBackupAgentData{appInfo=" + appInfo + " backupAgent=" + appInfo.backupAgentName - + " mode=" + backupMode + "}"; + + " mode=" + backupMode + " userId=" + userId + "}"; } } @@ -877,20 +885,22 @@ public final class ActivityThread extends ClientTransactionHandler { } public final void scheduleCreateBackupAgent(ApplicationInfo app, - CompatibilityInfo compatInfo, int backupMode) { + CompatibilityInfo compatInfo, int backupMode, int userId) { CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.compatInfo = compatInfo; d.backupMode = backupMode; + d.userId = userId; sendMessage(H.CREATE_BACKUP_AGENT, d); } public final void scheduleDestroyBackupAgent(ApplicationInfo app, - CompatibilityInfo compatInfo) { + CompatibilityInfo compatInfo, int userId) { CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.compatInfo = compatInfo; + d.userId = userId; sendMessage(H.DESTROY_BACKUP_AGENT, d); } @@ -3616,7 +3626,8 @@ public final class ActivityThread extends ClientTransactionHandler { try { IBinder binder = null; - BackupAgent agent = mBackupAgents.get(packageName); + ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId); + BackupAgent agent = backupAgents.get(packageName); if (agent != null) { // reusing the existing instance if (DEBUG_BACKUP) { @@ -3635,9 +3646,9 @@ public final class ActivityThread extends ClientTransactionHandler { context.setOuterContext(agent); agent.attach(context); - agent.onCreate(); + agent.onCreate(UserHandle.of(data.userId)); binder = agent.onBind(); - mBackupAgents.put(packageName, agent); + backupAgents.put(packageName, agent); } catch (Exception e) { // If this is during restore, fail silently; otherwise go // ahead and let the user see the crash. @@ -3653,7 +3664,7 @@ public final class ActivityThread extends ClientTransactionHandler { // tell the OS that we're live now try { - ActivityManager.getService().backupAgentCreated(packageName, binder); + ActivityManager.getService().backupAgentCreated(packageName, binder, data.userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3669,7 +3680,8 @@ public final class ActivityThread extends ClientTransactionHandler { LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo); String packageName = packageInfo.mPackageName; - BackupAgent agent = mBackupAgents.get(packageName); + ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId); + BackupAgent agent = backupAgents.get(packageName); if (agent != null) { try { agent.onDestroy(); @@ -3677,12 +3689,21 @@ public final class ActivityThread extends ClientTransactionHandler { Slog.w(TAG, "Exception thrown in onDestroy by backup agent of " + data.appInfo); e.printStackTrace(); } - mBackupAgents.remove(packageName); + backupAgents.remove(packageName); } else { Slog.w(TAG, "Attempt to destroy unknown backup agent " + data); } } + private ArrayMap<String, BackupAgent> getBackupAgentsForUser(int userId) { + ArrayMap<String, BackupAgent> backupAgents = mBackupAgentsByUser.get(userId); + if (backupAgents == null) { + backupAgents = new ArrayMap<>(); + mBackupAgentsByUser.put(userId, backupAgents); + } + return backupAgents; + } + @UnsupportedAppUsage private void handleCreateService(CreateServiceData data) { // If we are getting ready to gc after going to the background, well diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index eea054333141..3aa9fa7fedee 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -221,8 +221,8 @@ interface IActivityManager { boolean shutdown(int timeout); void stopAppSwitches(); void resumeAppSwitches(); - boolean bindBackupAgent(in String packageName, int backupRestoreMode, int userId); - void backupAgentCreated(in String packageName, in IBinder agent); + boolean bindBackupAgent(in String packageName, int backupRestoreMode, int targetUserId); + void backupAgentCreated(in String packageName, in IBinder agent, int userId); void unbindBackupAgent(in ApplicationInfo appInfo); int getUidForIntentSender(in IIntentSender sender); int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll, diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index c64fcf3e7526..e7a8c0e28bc6 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -88,9 +88,9 @@ oneway interface IApplicationThread { void profilerControl(boolean start, in ProfilerInfo profilerInfo, int profileType); void setSchedulingGroup(int group); void scheduleCreateBackupAgent(in ApplicationInfo app, in CompatibilityInfo compatInfo, - int backupMode); + int backupMode, int userId); void scheduleDestroyBackupAgent(in ApplicationInfo app, - in CompatibilityInfo compatInfo); + in CompatibilityInfo compatInfo, int userId); void scheduleOnNewActivityOptions(IBinder token, in Bundle options); void scheduleSuicide(); void dispatchPackageBroadcast(int cmd, in String[] packages); |
