OSDN Git Service

DO NOT MERGE Isolated processes don't get precached system service binders
authorSuprabh Shukla <suprabh@google.com>
Thu, 13 Oct 2016 02:01:11 +0000 (19:01 -0700)
committerSuprabh Shukla <suprabh@google.com>
Fri, 14 Oct 2016 22:55:29 +0000 (22:55 +0000)
More specifically, they get a PackageManager binder -- necessary for
Android process startup and configuration -- but none of the other
usual preloaded service binders.
(backported from commit 2c61c57ac53cbb270b4e76b9d04465f8a3f6eadc)

Bug: 30202228

Change-Id: I3810649f504cd631665ece338a83d2e54d41ad05

services/java/com/android/server/am/ActivityManagerService.java

index c85dc98..d3871ec 100644 (file)
@@ -788,6 +788,7 @@ public final class ActivityManagerService extends ActivityManagerNative
      * For example, references to the commonly used services.
      */
     HashMap<String, IBinder> mAppBindArgs;
+    HashMap<String, IBinder> mIsolatedAppBindArgs;
 
     /**
      * Temporary to avoid allocations.  Protected by main lock.
@@ -2210,7 +2211,17 @@ public final class ActivityManagerService extends ActivityManagerNative
      * process when the bindApplication() IPC is sent to the process. They're
      * lazily setup to make sure the services are running when they're asked for.
      */
-    private HashMap<String, IBinder> getCommonServicesLocked() {
+    private HashMap<String, IBinder> getCommonServicesLocked(boolean isolated) {
+        // Isolated processes won't get this optimization, so that we don't
+        // violate the rules about which services they have access to.
+        if (isolated) {
+            if (mIsolatedAppBindArgs == null) {
+                mIsolatedAppBindArgs = new HashMap<String, IBinder>();
+                mIsolatedAppBindArgs.put("package", ServiceManager.getService("package"));
+            }
+            return mIsolatedAppBindArgs;
+        }
+
         if (mAppBindArgs == null) {
             mAppBindArgs = new HashMap<String, IBinder>();
 
@@ -4990,7 +5001,8 @@ public final class ActivityManagerService extends ActivityManagerNative
                     app.instrumentationArguments, app.instrumentationWatcher,
                     app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
                     isRestrictedBackupMode || !normalMode, app.persistent,
-                    new Configuration(mConfiguration), app.compat, getCommonServicesLocked(),
+                    new Configuration(mConfiguration), app.compat,
+                    getCommonServicesLocked(app.isolated),
                     mCoreSettingsObserver.getCoreSettingsLocked());
             updateLruProcessLocked(app, false, null);
             app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();