diff options
author | Narayan Kamath <narayan@google.com> | 2014-11-20 10:47:16 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-20 10:47:17 +0000 |
commit | 9f285bd60b219b562bc55c7c2a9fae23eae554e5 (patch) | |
tree | 49d33c4826c5ad49c5b5006eee912b2717488920 | |
parent | ea8ff822121cde16344ba2db194a5f17283fa740 (diff) | |
parent | 343f478241fab49c909b229d6876ff8405e7b0d5 (diff) | |
download | frameworks_base-9f285bd60b219b562bc55c7c2a9fae23eae554e5.zip frameworks_base-9f285bd60b219b562bc55c7c2a9fae23eae554e5.tar.gz frameworks_base-9f285bd60b219b562bc55c7c2a9fae23eae554e5.tar.bz2 |
Merge "Tell installd when boot completes."
4 files changed, 48 insertions, 3 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 3ada9bb..21a9904 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -689,6 +689,20 @@ public class Process { } /** + * Tries to establish a connection to the zygote that handles a given {@code abi}. Might block and retry if the + * zygote is unresponsive. This method is a no-op if a connection is already open. + * + * @hide + */ + public static void establishZygoteConnectionForAbi(String abi) { + try { + openZygoteSocketIfNeeded(abi); + } catch (ZygoteStartFailedEx ex) { + throw new RuntimeException("Unable to connect to zygote for abi: " + abi, ex); + } + } + + /** * Tries to open socket to Zygote process if not already open. If * already open, does nothing. May block and retry. */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 8dfb321..9185ada 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -81,6 +81,7 @@ import com.android.server.SystemServiceManager; import com.android.server.Watchdog; import com.android.server.am.ActivityStack.ActivityState; import com.android.server.firewall.IntentFirewall; +import com.android.server.pm.Installer; import com.android.server.pm.UserManagerService; import com.android.server.wm.AppTransition; import com.android.server.wm.WindowManagerService; @@ -370,6 +371,8 @@ public final class ActivityManagerService extends ActivityManagerNative /** All system services */ SystemServiceManager mSystemServiceManager; + private Installer mInstaller; + /** Run all ActivityStacks through this */ ActivityStackSupervisor mStackSupervisor; @@ -2358,6 +2361,10 @@ public final class ActivityManagerService extends ActivityManagerNative mSystemServiceManager = mgr; } + public void setInstaller(Installer installer) { + mInstaller = installer; + } + private void start() { Process.removeAllProcessGroups(); mProcessCpuThread.start(); @@ -6326,6 +6333,18 @@ public final class ActivityManagerService extends ActivityManagerNative mCallFinishBooting = false; } + ArraySet<String> completedIsas = new ArraySet<String>(); + for (String abi : Build.SUPPORTED_ABIS) { + Process.establishZygoteConnectionForAbi(abi); + final String instructionSet = VMRuntime.getInstructionSet(abi); + if (!completedIsas.contains(instructionSet)) { + if (mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi)) != 0) { + Slog.e(TAG, "Unable to mark boot complete for abi: " + abi); + } + completedIsas.add(instructionSet); + } + } + // Register receivers to handle package update events mPackageMonitor.register(mContext, Looper.getMainLooper(), UserHandle.ALL, false); diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index ca11862..31c604f 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -216,6 +216,18 @@ public final class Installer extends SystemService { return mInstaller.execute(builder.toString()); } + public int markBootComplete(String instructionSet) { + if (!isValidInstructionSet(instructionSet)) { + Slog.e(TAG, "Invalid instruction set: " + instructionSet); + return -1; + } + + StringBuilder builder = new StringBuilder("markbootcomplete"); + builder.append(' '); + builder.append(instructionSet); + return mInstaller.execute(builder.toString()); + } + public boolean ping() { if (mInstaller.execute("ping") < 0) { return false; diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 92ad1ad..8a64aa6 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -147,7 +147,6 @@ public final class SystemServer { private SystemServiceManager mSystemServiceManager; // TODO: remove all of these references by improving dependency resolution and boot phases - private Installer mInstaller; private PowerManagerService mPowerManagerService; private ActivityManagerService mActivityManagerService; private DisplayManagerService mDisplayManagerService; @@ -309,12 +308,13 @@ public final class SystemServer { // Wait for installd to finish starting up so that it has a chance to // create critical directories such as /data/user with the appropriate // permissions. We need this to complete before we initialize other services. - mInstaller = mSystemServiceManager.startService(Installer.class); + Installer installer = mSystemServiceManager.startService(Installer.class); // Activity manager runs the show. mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); + mActivityManagerService.setInstaller(installer); // Power manager needs to be started early because other services need it. // Native daemons may be watching for it to be registered so it must be ready @@ -345,7 +345,7 @@ public final class SystemServer { // Start the package manager. Slog.i(TAG, "Package Manager"); - mPackageManagerService = PackageManagerService.main(mSystemContext, mInstaller, + mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); |