- Installer installer = mSystemServiceManager.startService(Installer.class);
- ActivityTaskManagerService atm = mSystemServiceManager.startService(
- ActivityTaskManagerService.Lifecycle.class).getService();
- mActivityManagerService = ActivityManagerService.Lifecycle.startService(
- mSystemServiceManager, atm);
- mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
- mActivityManagerService.setInstaller(installer);
- public static ActivityManagerService startService(
- SystemServiceManager ssm, ActivityTaskManagerService atm) {
- sAtm = atm;
- return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
- }
我们从之前的分析知道ActivityManagerService.Lifecycle.startService传入class对象时会实例化该类对象并且调用它的onStart方法,这里我们先看ActivityManagerService.Lifecycle
- public static final class Lifecycle extends SystemService {
- private final ActivityManagerService mService;
- private static ActivityTaskManagerService sAtm;
-
- public Lifecycle(Context context) {
- super(context);
- mService = new ActivityManagerService(context, sAtm);
- }
-
- public static ActivityManagerService startService(
- SystemServiceManager ssm, ActivityTaskManagerService atm) {
- sAtm = atm;
- return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
- }
-
- @Override
- public void onStart() {
- mService.start();
- }
- ....
- }
ActivityManagerService.Lifecycle的构造函数又实例化了一个AMS,跟进去看下
- public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
- LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
- mInjector = new Injector();
- //系统上下文,与SystemServer的保持一致
- mContext = systemContext;
-
- mFactoryTest = FactoryTest.getMode();
- //系统进程的主线程
- mSystemThread = ActivityThread.currentActivityThread();
- mUiContext = mSystemThread.getSystemUiContext();
-
- Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
- //处理AMS消息的handle
- mHandlerThread = new ServiceThread(TAG,
- THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
- mHandlerThread.start();
- mHandler = new MainHandler(mHandlerThread.getLooper());
- //UiHandler对应于Android中的Ui线程
- mUiHandler = mInjector.getUiHandler(this);
-
- mProcStartHandlerThread = new ServiceThread(TAG + ":procStart",
- THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
- mProcStartHandlerThread.start();
- mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
-
- mConstants = new ActivityManagerConstants(mContext, this, mHandler);
- final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
- mProcessList.init(this, activeUids);
- mLowMemDetector = new LowMemDetector(this);
- mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
-
- // Broadcast policy parameters
- final BroadcastConstants foreConstants = new BroadcastConstants(
- Settings.Global.BROADCAST_FG_CONSTANTS);
- foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;
-
- final BroadcastConstants backConstants = new BroadcastConstants(
- Settings.Global.BROADCAST_BG_CONSTANTS);
- backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
-
- final BroadcastConstants offloadConstants = new BroadcastConstants(
- Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
- offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
- // by default, no "slow" policy in this queue
- offloadConstants.SLOW_TIME = Integer.MAX_VALUE;
-
- mEnableOffloadQueue = SystemProperties.getBoolean(
- "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);
-
- mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
- "foreground", foreConstants, false);
- mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
- "background", backConstants, true);
- mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
- "offload", offloadConstants, true);
- mBroadcastQueues[0] = mFgBroadcastQueue;
- mBroadcastQueues[1] = mBgBroadcastQueue;
- mBroadcastQueues[2] = mOffloadBroadcastQueue;
-
- mServices = new ActiveServices(this);
- mProviderMap = new ProviderMap(this);
- mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
- mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
-
- final File systemDir = SystemServiceManager.ensureSystemDir();
-
- // TODO: Move creation of battery stats service outside of activity manager service.
- mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
- BackgroundThread.get().getHandler());
- mBatteryStatsService.getActiveStatistics().readLocked();
- mBatteryStatsService.scheduleWriteToDisk();
- mOnBattery = DEBUG_POWER ? true
- : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
- mBatteryStatsService.getActiveStatistics().setCallback(this);
- mOomAdjProfiler.batteryPowerChanged(mOnBattery);
-
- mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
-
- mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
-
- mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
-
- mUserController = new UserController(this);
-
- mPendingIntentController = new PendingIntentController(
- mHandlerThread.getLooper(), mUserController);
-
- if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
- mUseFifoUiScheduling = true;
- }
-
- mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
- mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
- //得到ActivityTaskManagerService的对象,调用ATM.initialize
- mActivityTaskManager = atm;
- mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
- DisplayThread.get().getLooper());
- mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
-
- mProcessCpuThread = new Thread("CpuTracker") {
- @Override
- public void run() {
- synchronized (mProcessCpuTracker) {
- mProcessCpuInitLatch.countDown();
- mProcessCpuTracker.init();
- }
- while (true) {
- try {
- try {
- synchronized(this) {
- final long now = SystemClock.uptimeMillis();
- long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
- long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
- //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
- // + ", write delay=" + nextWriteDelay);
- if (nextWriteDelay < nextCpuDelay) {
- nextCpuDelay = nextWriteDelay;
- }
- if (nextCpuDelay > 0) {
- mProcessCpuMutexFree.set(true);
- this.wait(nextCpuDelay);
- }
- }
- } catch (InterruptedException e) {
- }
- updateCpuStatsNow();
- } catch (Exception e) {
- Slog.e(TAG, "Unexpected exception collecting process stats", e);
- }
- }
- }
- };
-
- mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);
-
- Watchdog.getInstance().addMonitor(this);
- Watchdog.getInstance().addThread(mHandler);
-
- // bind background threads to little cores
- // this is expected to fail inside of framework tests because apps can't touch cpusets directly
- // make sure we've already adjusted system_server's internal view of itself first
- updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
- try {
- Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
- Process.THREAD_GROUP_SYSTEM);
- Process.setThreadGroupAndCpuset(
- mOomAdjuster.mAppCompact.mCompactionThread.getThreadId(),
- Process.THREAD_GROUP_SYSTEM);
- } catch (Exception e) {
- Slog.w(TAG, "Setting background thread cpuset failed");
- }
-
- }
AMS的构造函数主要做了几件事:
可以看到AMS构造函数里面已经没有Activity相关的了,在Android10的版本已经移交给了ATMS了。
接下来看AMS的start()方法
- private void start() {
- removeAllProcessGroups();
- mProcessCpuThread.start();
-
- mBatteryStatsService.publish();
- mAppOpsService.publish(mContext);
- Slog.d("AppOps", "AppOpsService published");
- LocalServices.addService(ActivityManagerInternal.class, new LocalService());
- mActivityTaskManager.onActivityManagerInternalAdded();
- mUgmInternal.onActivityManagerInternalAdded();
- mPendingIntentController.onActivityManagerInternalAdded();
- // Wait for the synchronized block started in mProcessCpuThread,
- // so that any other access to mProcessCpuTracker from main thread
- // will be blocked during mProcessCpuTracker initialization.
- try {
- mProcessCpuInitLatch.await();
- } catch (InterruptedException e) {
- Slog.wtf(TAG, "Interrupted wait during start", e);
- Thread.currentThread().interrupt();
- throw new IllegalStateException("Interrupted wait during start");
- }
- }
-
publish是把服务添加进ServiceManager和LocalServices
- public void publish() {
- LocalServices.addService(BatteryStatsInternal.class, new LocalService());
- ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
- }
- public void setSystemServiceManager(SystemServiceManager mgr) {
- mSystemServiceManager = mgr;
- }
将SystemServer.java中创建的SystemServiceManager对象设置到了AMS中。
- public void setInstaller(Installer installer) {
- mInstaller = installer;
- }
将Installer对象设置到AMS中
回到SystemServer.run中,进入startOtherServices(); 该方法最后调用了AMS的systemReady方法
- mActivityManagerService.systemReady(() -> {
- ......
- }, BOOT_TIMINGS_TRACE_LOG);
我们先看systemReady的内容
- public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
- traceLog.traceBegin("PhaseActivityManagerReady");
- synchronized(this) {
- if (mSystemReady) {
- // If we're done calling all the receivers, run the next "boot phase" passed in
- // by the SystemServer
- if (goingCallback != null) {
- goingCallback.run();
- }
- return;
- }
-
- mLocalDeviceIdleController
- = LocalServices.getService(DeviceIdleController.LocalService.class);
- mActivityTaskManager.onSystemReady();
- // Make sure we have the current profile info, since it is needed for security checks.
- mUserController.onSystemReady();
- mAppOpsService.systemReady();
- mSystemReady = true;
- }
-
- try {
- sTheRealBuildSerial = IDeviceIdentifiersPolicyService.Stub.asInterface(
- ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE))
- .getSerial();
- } catch (RemoteException e) {}
-
- ArrayList
procsToKill = null; - synchronized(mPidsSelfLocked) {
- for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
- ProcessRecord proc = mPidsSelfLocked.valueAt(i);
- if (!isAllowedWhileBooting(proc.info)){
- if (procsToKill == null) {
- procsToKill = new ArrayList
(); - }
- procsToKill.add(proc);
- }
- }
- }
-
- synchronized(this) {
- if (procsToKill != null) {
- for (int i=procsToKill.size()-1; i>=0; i--) {
- ProcessRecord proc = procsToKill.get(i);
- Slog.i(TAG, "Removing system update proc: " + proc);
- mProcessList.removeProcessLocked(proc, true, false, "system update done");
- }
- }
-
- // Now that we have cleaned up any update processes, we
- // are ready to start launching real processes and know that
- // we won't trample on them any more.
- mProcessesReady = true;
- }
-
- Slog.i(TAG, "System now ready");
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY, SystemClock.uptimeMillis());
-
- mAtmInternal.updateTopComponentForFactoryTest();
- mAtmInternal.getLaunchObserverRegistry().registerLaunchObserver(mActivityLaunchObserver);
-
- watchDeviceProvisioning(mContext);
-
- retrieveSettings();
- mUgmInternal.onSystemReady();
-
- final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
- if (pmi != null) {
- pmi.registerLowPowerModeObserver(ServiceType.FORCE_BACKGROUND_CHECK,
- state -> updateForceBackgroundCheck(state.batterySaverEnabled));
- updateForceBackgroundCheck(
- pmi.getLowPowerState(ServiceType.FORCE_BACKGROUND_CHECK).batterySaverEnabled);
- } else {
- Slog.wtf(TAG, "PowerManagerInternal not found.");
- }
-
- if (goingCallback != null) goingCallback.run();
- // Check the current user here as a user can be started inside goingCallback.run() from
- // other system services.
- final int currentUserId = mUserController.getCurrentUserId();
- Slog.i(TAG, "Current user:" + currentUserId);
- if (currentUserId != UserHandle.USER_SYSTEM && !mUserController.isSystemUserStarted()) {
- // User other than system user has started. Make sure that system user is already
- // started before switching user.
- throw new RuntimeException("System user not started while current user is:"
- + currentUserId);
- }
- traceLog.traceBegin("ActivityManagerStartApps");
- mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
- Integer.toString(currentUserId), currentUserId);
- mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
- Integer.toString(currentUserId), currentUserId);
-
- // On Automotive, at this point the system user has already been started and unlocked,
- // and some of the tasks we do here have already been done. So skip those in that case.
- // TODO(b/132262830): this workdound shouldn't be necessary once we move the
- // headless-user start logic to UserManager-land
- final boolean bootingSystemUser = currentUserId == UserHandle.USER_SYSTEM;
-
- if (bootingSystemUser) {
- mSystemServiceManager.startUser(currentUserId);
- }
-
- synchronized (this) {
- // Only start up encryption-aware persistent apps; once user is
- // unlocked we'll come back around and start unaware apps
- startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
-
- // Start up initial activity.
- mBooting = true;
- // Enable home activity for system user, so that the system can always boot. We don't
- // do this when the system user is not setup since the setup wizard should be the one
- // to handle home activity in this case.
- if (UserManager.isSplitSystemUser() &&
- Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.USER_SETUP_COMPLETE, 0) != 0) {
- ComponentName cName = new ComponentName(mContext, SystemUserHomeActivity.class);
- try {
- AppGlobals.getPackageManager().setComponentEnabledSetting(cName,
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0,
- UserHandle.USER_SYSTEM);
- } catch (RemoteException e) {
- throw e.rethrowAsRuntimeException();
- }
- }
-
- if (bootingSystemUser) {
- mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
- }
-
- mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
-
- if (bootingSystemUser) {
- final int callingUid = Binder.getCallingUid();
- final int callingPid = Binder.getCallingPid();
- long ident = Binder.clearCallingIdentity();
- try {
- Intent intent = new Intent(Intent.ACTION_USER_STARTED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
- | Intent.FLAG_RECEIVER_FOREGROUND);
- intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
- broadcastIntentLocked(null, null, intent,
- null, null, 0, null, null, null, OP_NONE,
- null, false, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
- currentUserId);
- intent = new Intent(Intent.ACTION_USER_STARTING);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
- broadcastIntentLocked(null, null, intent,
- null, new IIntentReceiver.Stub() {
- @Override
- public void performReceive(Intent intent, int resultCode, String data,
- Bundle extras, boolean ordered, boolean sticky, int sendingUser)
- throws RemoteException {
- }
- }, 0, null, null,
- new String[] {INTERACT_ACROSS_USERS}, OP_NONE,
- null, true, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
- UserHandle.USER_ALL);
- } catch (Throwable t) {
- Slog.wtf(TAG, "Failed sending first user broadcasts", t);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- } else {
- Slog.i(TAG, "Not sending multi-user broadcasts for non-system user "
- + currentUserId);
- }
- mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
- if (bootingSystemUser) {
- mUserController.sendUserSwitchBroadcasts(-1, currentUserId);
- }
-
- BinderInternal.nSetBinderProxyCountWatermarks(BINDER_PROXY_HIGH_WATERMARK,
- BINDER_PROXY_LOW_WATERMARK);
- BinderInternal.nSetBinderProxyCountEnabled(true);
- BinderInternal.setBinderProxyCountCallback(
- new BinderInternal.BinderProxyLimitListener() {
- @Override
- public void onLimitReached(int uid) {
- Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
- + Process.myUid());
- BinderProxy.dumpProxyDebugInfo();
- if (uid == Process.SYSTEM_UID) {
- Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
- } else {
- killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
- "Too many Binders sent to SYSTEM");
- }
- }
- }, mHandler);
-
- traceLog.traceEnd(); // ActivityManagerStartApps
- traceLog.traceEnd(); // PhaseActivityManagerReady
- }
- }
第一次进来mSystemReady是false的
callback:
- mActivityManagerService.systemReady(() -> {
- Slog.i(TAG, "Making services ready");
- traceBeginAndSlog("StartActivityManagerReadyPhase");
- mSystemServiceManager.startBootPhase(
- SystemService.PHASE_ACTIVITY_MANAGER_READY);
- traceEnd();
- traceBeginAndSlog("StartObservingNativeCrashes");
- try {
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
- traceEnd();
-
- // No dependency on Webview preparation in system server. But this should
- // be completed before allowing 3rd party
- final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
- Future> webviewPrep = null;
- if (!mOnlyCore && mWebViewUpdateService != null) {
- webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
- Slog.i(TAG, WEBVIEW_PREPARATION);
- TimingsTraceLog traceLog = new TimingsTraceLog(
- SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
- traceLog.traceBegin(WEBVIEW_PREPARATION);
- ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
- mZygotePreload = null;
- mWebViewUpdateService.prepareWebViewInSystemServer();
- traceLog.traceEnd();
- }, WEBVIEW_PREPARATION);
- }
-
- if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- traceBeginAndSlog("StartCarServiceHelperService");
- mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
- traceEnd();
- }
-
- traceBeginAndSlog("StartSystemUI");
- try {
- startSystemUi(context, windowManagerF);
- } catch (Throwable e) {
- reportWtf("starting System UI", e);
- }
- traceEnd();
- // Enable airplane mode in safe mode. setAirplaneMode() cannot be called
- // earlier as it sends broadcasts to other services.
- // TODO: This may actually be too late if radio firmware already started leaking
- // RF before the respective services start. However, fixing this requires changes
- // to radio firmware and interfaces.
- if (safeMode) {
- traceBeginAndSlog("EnableAirplaneModeInSafeMode");
- try {
- connectivityF.setAirplaneMode(true);
- } catch (Throwable e) {
- reportWtf("enabling Airplane Mode during Safe Mode bootup", e);
- }
- traceEnd();
- }
- traceBeginAndSlog("MakeNetworkManagementServiceReady");
- try {
- if (networkManagementF != null) {
- networkManagementF.systemReady();
- }
- } catch (Throwable e) {
- reportWtf("making Network Managment Service ready", e);
- }
- CountDownLatch networkPolicyInitReadySignal = null;
- if (networkPolicyF != null) {
- networkPolicyInitReadySignal = networkPolicyF
- .networkScoreAndNetworkManagementServiceReady();
- }
- traceEnd();
- traceBeginAndSlog("MakeIpSecServiceReady");
- try {
- if (ipSecServiceF != null) {
- ipSecServiceF.systemReady();
- }
- } catch (Throwable e) {
- reportWtf("making IpSec Service ready", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeNetworkStatsServiceReady");
- try {
- if (networkStatsF != null) {
- networkStatsF.systemReady();
- }
- } catch (Throwable e) {
- reportWtf("making Network Stats Service ready", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeConnectivityServiceReady");
- try {
- if (connectivityF != null) {
- connectivityF.systemReady();
- }
- } catch (Throwable e) {
- reportWtf("making Connectivity Service ready", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeNetworkPolicyServiceReady");
- try {
- if (networkPolicyF != null) {
- networkPolicyF.systemReady(networkPolicyInitReadySignal);
- }
- } catch (Throwable e) {
- reportWtf("making Network Policy Service ready", e);
- }
- traceEnd();
-
- // Wait for all packages to be prepared
- mPackageManagerService.waitForAppDataPrepared();
-
- // It is now okay to let the various system services start their
- // third party code...
- traceBeginAndSlog("PhaseThirdPartyAppsCanStart");
- // confirm webview completion before starting 3rd party
- if (webviewPrep != null) {
- ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
- }
- mSystemServiceManager.startBootPhase(
- SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
- traceEnd();
-
- traceBeginAndSlog("StartNetworkStack");
- try {
- // Note : the network stack is creating on-demand objects that need to send
- // broadcasts, which means it currently depends on being started after
- // ActivityManagerService.mSystemReady and ActivityManagerService.mProcessesReady
- // are set to true. Be careful if moving this to a different place in the
- // startup sequence.
- NetworkStackClient.getInstance().start(context);
- } catch (Throwable e) {
- reportWtf("starting Network Stack", e);
- }
- traceEnd();
-
- traceBeginAndSlog("MakeLocationServiceReady");
- try {
- if (locationF != null) {
- locationF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying Location Service running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeCountryDetectionServiceReady");
- try {
- if (countryDetectorF != null) {
- countryDetectorF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying CountryDetectorService running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeNetworkTimeUpdateReady");
- try {
- if (networkTimeUpdaterF != null) {
- networkTimeUpdaterF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying NetworkTimeService running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeInputManagerServiceReady");
- try {
- // TODO(BT) Pass parameter to input manager
- if (inputManagerF != null) {
- inputManagerF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying InputManagerService running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeTelephonyRegistryReady");
- try {
- if (telephonyRegistryF != null) {
- telephonyRegistryF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying TelephonyRegistry running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeMediaRouterServiceReady");
- try {
- if (mediaRouterF != null) {
- mediaRouterF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying MediaRouterService running", e);
- }
- traceEnd();
- traceBeginAndSlog("MakeMmsServiceReady");
- try {
- if (mmsServiceF != null) {
- mmsServiceF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying MmsService running", e);
- }
- traceEnd();
-
- traceBeginAndSlog("IncidentDaemonReady");
- try {
- // TODO: Switch from checkService to getService once it's always
- // in the build and should reliably be there.
- final IIncidentManager incident = IIncidentManager.Stub.asInterface(
- ServiceManager.getService(Context.INCIDENT_SERVICE));
- if (incident != null) {
- incident.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying incident daemon running", e);
- }
- traceEnd();
- }, BOOT_TIMINGS_TRACE_LOG);
- }
callback内容:
AMS启动主要工作