am 222722ee: Merge "Tell installd when boot completes." into lmp-mr1-dev

* commit '222722ee73c38dea5544118df6bd349e630d1c26':
  Tell installd when boot completes.
This commit is contained in:
Narayan Kamath
2014-11-12 12:52:21 +00:00
committed by Android Git Automerger
4 changed files with 48 additions and 3 deletions

View File

@@ -688,6 +688,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.

View File

@@ -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.statusbar.StatusBarManagerInternal;
import com.android.server.wm.AppTransition;
@@ -372,6 +373,8 @@ public final class ActivityManagerService extends ActivityManagerNative
/** All system services */
SystemServiceManager mSystemServiceManager;
private Installer mInstaller;
/** Run all ActivityStacks through this */
ActivityStackSupervisor mStackSupervisor;
@@ -2169,6 +2172,10 @@ public final class ActivityManagerService extends ActivityManagerNative
mSystemServiceManager = mgr;
}
public void setInstaller(Installer installer) {
mInstaller = installer;
}
private void start() {
Process.removeAllProcessGroups();
mProcessCpuThread.start();
@@ -6147,6 +6154,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);

View File

@@ -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;

View File

@@ -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();