• Android—AMS启动


    1. Installer installer = mSystemServiceManager.startService(Installer.class);
    2. ActivityTaskManagerService atm = mSystemServiceManager.startService(
    3. ActivityTaskManagerService.Lifecycle.class).getService();
    4. mActivityManagerService = ActivityManagerService.Lifecycle.startService(
    5. mSystemServiceManager, atm);
    6. mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    7. mActivityManagerService.setInstaller(installer);

    1.ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);

    1. public static ActivityManagerService startService(
    2. SystemServiceManager ssm, ActivityTaskManagerService atm) {
    3. sAtm = atm;
    4. return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
    5. }

      我们从之前的分析知道ActivityManagerService.Lifecycle.startService传入class对象时会实例化该类对象并且调用它的onStart方法,这里我们先看ActivityManagerService.Lifecycle

    1. public static final class Lifecycle extends SystemService {
    2. private final ActivityManagerService mService;
    3. private static ActivityTaskManagerService sAtm;
    4. public Lifecycle(Context context) {
    5. super(context);
    6. mService = new ActivityManagerService(context, sAtm);
    7. }
    8. public static ActivityManagerService startService(
    9. SystemServiceManager ssm, ActivityTaskManagerService atm) {
    10. sAtm = atm;
    11. return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
    12. }
    13. @Override
    14. public void onStart() {
    15. mService.start();
    16. }
    17. ....
    18. }

    ActivityManagerService.Lifecycle的构造函数又实例化了一个AMS,跟进去看下

    1. public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
    2. LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
    3. mInjector = new Injector();
    4. //系统上下文,与SystemServer的保持一致
    5. mContext = systemContext;
    6. mFactoryTest = FactoryTest.getMode();
    7. //系统进程的主线程
    8. mSystemThread = ActivityThread.currentActivityThread();
    9. mUiContext = mSystemThread.getSystemUiContext();
    10. Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
    11. //处理AMS消息的handle
    12. mHandlerThread = new ServiceThread(TAG,
    13. THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    14. mHandlerThread.start();
    15. mHandler = new MainHandler(mHandlerThread.getLooper());
    16. //UiHandler对应于Android中的Ui线程
    17. mUiHandler = mInjector.getUiHandler(this);
    18. mProcStartHandlerThread = new ServiceThread(TAG + ":procStart",
    19. THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
    20. mProcStartHandlerThread.start();
    21. mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
    22. mConstants = new ActivityManagerConstants(mContext, this, mHandler);
    23. final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
    24. mProcessList.init(this, activeUids);
    25. mLowMemDetector = new LowMemDetector(this);
    26. mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
    27. // Broadcast policy parameters
    28. final BroadcastConstants foreConstants = new BroadcastConstants(
    29. Settings.Global.BROADCAST_FG_CONSTANTS);
    30. foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;
    31. final BroadcastConstants backConstants = new BroadcastConstants(
    32. Settings.Global.BROADCAST_BG_CONSTANTS);
    33. backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
    34. final BroadcastConstants offloadConstants = new BroadcastConstants(
    35. Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
    36. offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
    37. // by default, no "slow" policy in this queue
    38. offloadConstants.SLOW_TIME = Integer.MAX_VALUE;
    39. mEnableOffloadQueue = SystemProperties.getBoolean(
    40. "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);
    41. mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
    42. "foreground", foreConstants, false);
    43. mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
    44. "background", backConstants, true);
    45. mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
    46. "offload", offloadConstants, true);
    47. mBroadcastQueues[0] = mFgBroadcastQueue;
    48. mBroadcastQueues[1] = mBgBroadcastQueue;
    49. mBroadcastQueues[2] = mOffloadBroadcastQueue;
    50. mServices = new ActiveServices(this);
    51. mProviderMap = new ProviderMap(this);
    52. mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
    53. mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
    54. final File systemDir = SystemServiceManager.ensureSystemDir();
    55. // TODO: Move creation of battery stats service outside of activity manager service.
    56. mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
    57. BackgroundThread.get().getHandler());
    58. mBatteryStatsService.getActiveStatistics().readLocked();
    59. mBatteryStatsService.scheduleWriteToDisk();
    60. mOnBattery = DEBUG_POWER ? true
    61. : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
    62. mBatteryStatsService.getActiveStatistics().setCallback(this);
    63. mOomAdjProfiler.batteryPowerChanged(mOnBattery);
    64. mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
    65. mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
    66. mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
    67. mUserController = new UserController(this);
    68. mPendingIntentController = new PendingIntentController(
    69. mHandlerThread.getLooper(), mUserController);
    70. if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
    71. mUseFifoUiScheduling = true;
    72. }
    73. mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
    74. mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
    75. //得到ActivityTaskManagerService的对象,调用ATM.initialize
    76. mActivityTaskManager = atm;
    77. mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
    78. DisplayThread.get().getLooper());
    79. mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
    80. mProcessCpuThread = new Thread("CpuTracker") {
    81. @Override
    82. public void run() {
    83. synchronized (mProcessCpuTracker) {
    84. mProcessCpuInitLatch.countDown();
    85. mProcessCpuTracker.init();
    86. }
    87. while (true) {
    88. try {
    89. try {
    90. synchronized(this) {
    91. final long now = SystemClock.uptimeMillis();
    92. long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
    93. long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
    94. //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
    95. // + ", write delay=" + nextWriteDelay);
    96. if (nextWriteDelay < nextCpuDelay) {
    97. nextCpuDelay = nextWriteDelay;
    98. }
    99. if (nextCpuDelay > 0) {
    100. mProcessCpuMutexFree.set(true);
    101. this.wait(nextCpuDelay);
    102. }
    103. }
    104. } catch (InterruptedException e) {
    105. }
    106. updateCpuStatsNow();
    107. } catch (Exception e) {
    108. Slog.e(TAG, "Unexpected exception collecting process stats", e);
    109. }
    110. }
    111. }
    112. };
    113. mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);
    114. Watchdog.getInstance().addMonitor(this);
    115. Watchdog.getInstance().addThread(mHandler);
    116. // bind background threads to little cores
    117. // this is expected to fail inside of framework tests because apps can't touch cpusets directly
    118. // make sure we've already adjusted system_server's internal view of itself first
    119. updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
    120. try {
    121. Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
    122. Process.THREAD_GROUP_SYSTEM);
    123. Process.setThreadGroupAndCpuset(
    124. mOomAdjuster.mAppCompact.mCompactionThread.getThreadId(),
    125. Process.THREAD_GROUP_SYSTEM);
    126. } catch (Exception e) {
    127. Slog.w(TAG, "Setting background thread cpuset failed");
    128. }
    129. }

    AMS的构造函数主要做了几件事:

    1. 创建ServiceThread子线程并获取对应线程的handler
    2. 创建前台广播、后台广播、特殊广播的3条队列
    3. 创建ActiveServices
    4. 创建ProviderMap
    5. 赋值ATMS,并进行初始化
    6. 创建CPU监控线程、开启WatchDog等

    可以看到AMS构造函数里面已经没有Activity相关的了,在Android10的版本已经移交给了ATMS了。

    接下来看AMS的start()方法

    1. private void start() {
    2. removeAllProcessGroups();
    3. mProcessCpuThread.start();
    4. mBatteryStatsService.publish();
    5. mAppOpsService.publish(mContext);
    6. Slog.d("AppOps", "AppOpsService published");
    7. LocalServices.addService(ActivityManagerInternal.class, new LocalService());
    8. mActivityTaskManager.onActivityManagerInternalAdded();
    9. mUgmInternal.onActivityManagerInternalAdded();
    10. mPendingIntentController.onActivityManagerInternalAdded();
    11. // Wait for the synchronized block started in mProcessCpuThread,
    12. // so that any other access to mProcessCpuTracker from main thread
    13. // will be blocked during mProcessCpuTracker initialization.
    14. try {
    15. mProcessCpuInitLatch.await();
    16. } catch (InterruptedException e) {
    17. Slog.wtf(TAG, "Interrupted wait during start", e);
    18. Thread.currentThread().interrupt();
    19. throw new IllegalStateException("Interrupted wait during start");
    20. }
    21. }

    publish是把服务添加进ServiceManager和LocalServices

    1. public void publish() {
    2. LocalServices.addService(BatteryStatsInternal.class, new LocalService());
    3. ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
    4. }
    1. 启动CPU监控线程
    2. 注册电池、权限管理相关服务

    2.mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

    1. public void setSystemServiceManager(SystemServiceManager mgr) {
    2. mSystemServiceManager = mgr;
    3. }

    将SystemServer.java中创建的SystemServiceManager对象设置到了AMS中。

    3.mActivityManagerService.setInstaller(installer)

    1. public void setInstaller(Installer installer) {
    2. mInstaller = installer;
    3. }

    将Installer对象设置到AMS中

    回到SystemServer.run中,进入startOtherServices(); 该方法最后调用了AMS的systemReady方法

    1. mActivityManagerService.systemReady(() -> {
    2. ......
    3. }, BOOT_TIMINGS_TRACE_LOG);

    我们先看systemReady的内容

    1. public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
    2. traceLog.traceBegin("PhaseActivityManagerReady");
    3. synchronized(this) {
    4. if (mSystemReady) {
    5. // If we're done calling all the receivers, run the next "boot phase" passed in
    6. // by the SystemServer
    7. if (goingCallback != null) {
    8. goingCallback.run();
    9. }
    10. return;
    11. }
    12. mLocalDeviceIdleController
    13. = LocalServices.getService(DeviceIdleController.LocalService.class);
    14. mActivityTaskManager.onSystemReady();
    15. // Make sure we have the current profile info, since it is needed for security checks.
    16. mUserController.onSystemReady();
    17. mAppOpsService.systemReady();
    18. mSystemReady = true;
    19. }
    20. try {
    21. sTheRealBuildSerial = IDeviceIdentifiersPolicyService.Stub.asInterface(
    22. ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE))
    23. .getSerial();
    24. } catch (RemoteException e) {}
    25. ArrayList procsToKill = null;
    26. synchronized(mPidsSelfLocked) {
    27. for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
    28. ProcessRecord proc = mPidsSelfLocked.valueAt(i);
    29. if (!isAllowedWhileBooting(proc.info)){
    30. if (procsToKill == null) {
    31. procsToKill = new ArrayList();
    32. }
    33. procsToKill.add(proc);
    34. }
    35. }
    36. }
    37. synchronized(this) {
    38. if (procsToKill != null) {
    39. for (int i=procsToKill.size()-1; i>=0; i--) {
    40. ProcessRecord proc = procsToKill.get(i);
    41. Slog.i(TAG, "Removing system update proc: " + proc);
    42. mProcessList.removeProcessLocked(proc, true, false, "system update done");
    43. }
    44. }
    45. // Now that we have cleaned up any update processes, we
    46. // are ready to start launching real processes and know that
    47. // we won't trample on them any more.
    48. mProcessesReady = true;
    49. }
    50. Slog.i(TAG, "System now ready");
    51. EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY, SystemClock.uptimeMillis());
    52. mAtmInternal.updateTopComponentForFactoryTest();
    53. mAtmInternal.getLaunchObserverRegistry().registerLaunchObserver(mActivityLaunchObserver);
    54. watchDeviceProvisioning(mContext);
    55. retrieveSettings();
    56. mUgmInternal.onSystemReady();
    57. final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
    58. if (pmi != null) {
    59. pmi.registerLowPowerModeObserver(ServiceType.FORCE_BACKGROUND_CHECK,
    60. state -> updateForceBackgroundCheck(state.batterySaverEnabled));
    61. updateForceBackgroundCheck(
    62. pmi.getLowPowerState(ServiceType.FORCE_BACKGROUND_CHECK).batterySaverEnabled);
    63. } else {
    64. Slog.wtf(TAG, "PowerManagerInternal not found.");
    65. }
    66. if (goingCallback != null) goingCallback.run();
    67. // Check the current user here as a user can be started inside goingCallback.run() from
    68. // other system services.
    69. final int currentUserId = mUserController.getCurrentUserId();
    70. Slog.i(TAG, "Current user:" + currentUserId);
    71. if (currentUserId != UserHandle.USER_SYSTEM && !mUserController.isSystemUserStarted()) {
    72. // User other than system user has started. Make sure that system user is already
    73. // started before switching user.
    74. throw new RuntimeException("System user not started while current user is:"
    75. + currentUserId);
    76. }
    77. traceLog.traceBegin("ActivityManagerStartApps");
    78. mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
    79. Integer.toString(currentUserId), currentUserId);
    80. mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
    81. Integer.toString(currentUserId), currentUserId);
    82. // On Automotive, at this point the system user has already been started and unlocked,
    83. // and some of the tasks we do here have already been done. So skip those in that case.
    84. // TODO(b/132262830): this workdound shouldn't be necessary once we move the
    85. // headless-user start logic to UserManager-land
    86. final boolean bootingSystemUser = currentUserId == UserHandle.USER_SYSTEM;
    87. if (bootingSystemUser) {
    88. mSystemServiceManager.startUser(currentUserId);
    89. }
    90. synchronized (this) {
    91. // Only start up encryption-aware persistent apps; once user is
    92. // unlocked we'll come back around and start unaware apps
    93. startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
    94. // Start up initial activity.
    95. mBooting = true;
    96. // Enable home activity for system user, so that the system can always boot. We don't
    97. // do this when the system user is not setup since the setup wizard should be the one
    98. // to handle home activity in this case.
    99. if (UserManager.isSplitSystemUser() &&
    100. Settings.Secure.getInt(mContext.getContentResolver(),
    101. Settings.Secure.USER_SETUP_COMPLETE, 0) != 0) {
    102. ComponentName cName = new ComponentName(mContext, SystemUserHomeActivity.class);
    103. try {
    104. AppGlobals.getPackageManager().setComponentEnabledSetting(cName,
    105. PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0,
    106. UserHandle.USER_SYSTEM);
    107. } catch (RemoteException e) {
    108. throw e.rethrowAsRuntimeException();
    109. }
    110. }
    111. if (bootingSystemUser) {
    112. mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
    113. }
    114. mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
    115. if (bootingSystemUser) {
    116. final int callingUid = Binder.getCallingUid();
    117. final int callingPid = Binder.getCallingPid();
    118. long ident = Binder.clearCallingIdentity();
    119. try {
    120. Intent intent = new Intent(Intent.ACTION_USER_STARTED);
    121. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
    122. | Intent.FLAG_RECEIVER_FOREGROUND);
    123. intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
    124. broadcastIntentLocked(null, null, intent,
    125. null, null, 0, null, null, null, OP_NONE,
    126. null, false, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
    127. currentUserId);
    128. intent = new Intent(Intent.ACTION_USER_STARTING);
    129. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    130. intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
    131. broadcastIntentLocked(null, null, intent,
    132. null, new IIntentReceiver.Stub() {
    133. @Override
    134. public void performReceive(Intent intent, int resultCode, String data,
    135. Bundle extras, boolean ordered, boolean sticky, int sendingUser)
    136. throws RemoteException {
    137. }
    138. }, 0, null, null,
    139. new String[] {INTERACT_ACROSS_USERS}, OP_NONE,
    140. null, true, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
    141. UserHandle.USER_ALL);
    142. } catch (Throwable t) {
    143. Slog.wtf(TAG, "Failed sending first user broadcasts", t);
    144. } finally {
    145. Binder.restoreCallingIdentity(ident);
    146. }
    147. } else {
    148. Slog.i(TAG, "Not sending multi-user broadcasts for non-system user "
    149. + currentUserId);
    150. }
    151. mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
    152. if (bootingSystemUser) {
    153. mUserController.sendUserSwitchBroadcasts(-1, currentUserId);
    154. }
    155. BinderInternal.nSetBinderProxyCountWatermarks(BINDER_PROXY_HIGH_WATERMARK,
    156. BINDER_PROXY_LOW_WATERMARK);
    157. BinderInternal.nSetBinderProxyCountEnabled(true);
    158. BinderInternal.setBinderProxyCountCallback(
    159. new BinderInternal.BinderProxyLimitListener() {
    160. @Override
    161. public void onLimitReached(int uid) {
    162. Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
    163. + Process.myUid());
    164. BinderProxy.dumpProxyDebugInfo();
    165. if (uid == Process.SYSTEM_UID) {
    166. Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
    167. } else {
    168. killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
    169. "Too many Binders sent to SYSTEM");
    170. }
    171. }
    172. }, mHandler);
    173. traceLog.traceEnd(); // ActivityManagerStartApps
    174. traceLog.traceEnd(); // PhaseActivityManagerReady
    175. }
    176. }

     第一次进来mSystemReady是false的

    1. 确保基础服务已经systemReady
    2. 清掉系统更新进程
    3. 运行callback
    4. mAtmInternal.startHomeOnAllDisplays运行launcher应用
    5. 发广播

    callback:

    1. mActivityManagerService.systemReady(() -> {
    2. Slog.i(TAG, "Making services ready");
    3. traceBeginAndSlog("StartActivityManagerReadyPhase");
    4. mSystemServiceManager.startBootPhase(
    5. SystemService.PHASE_ACTIVITY_MANAGER_READY);
    6. traceEnd();
    7. traceBeginAndSlog("StartObservingNativeCrashes");
    8. try {
    9. mActivityManagerService.startObservingNativeCrashes();
    10. } catch (Throwable e) {
    11. reportWtf("observing native crashes", e);
    12. }
    13. traceEnd();
    14. // No dependency on Webview preparation in system server. But this should
    15. // be completed before allowing 3rd party
    16. final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
    17. Future webviewPrep = null;
    18. if (!mOnlyCore && mWebViewUpdateService != null) {
    19. webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
    20. Slog.i(TAG, WEBVIEW_PREPARATION);
    21. TimingsTraceLog traceLog = new TimingsTraceLog(
    22. SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
    23. traceLog.traceBegin(WEBVIEW_PREPARATION);
    24. ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
    25. mZygotePreload = null;
    26. mWebViewUpdateService.prepareWebViewInSystemServer();
    27. traceLog.traceEnd();
    28. }, WEBVIEW_PREPARATION);
    29. }
    30. if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    31. traceBeginAndSlog("StartCarServiceHelperService");
    32. mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
    33. traceEnd();
    34. }
    35. traceBeginAndSlog("StartSystemUI");
    36. try {
    37. startSystemUi(context, windowManagerF);
    38. } catch (Throwable e) {
    39. reportWtf("starting System UI", e);
    40. }
    41. traceEnd();
    42. // Enable airplane mode in safe mode. setAirplaneMode() cannot be called
    43. // earlier as it sends broadcasts to other services.
    44. // TODO: This may actually be too late if radio firmware already started leaking
    45. // RF before the respective services start. However, fixing this requires changes
    46. // to radio firmware and interfaces.
    47. if (safeMode) {
    48. traceBeginAndSlog("EnableAirplaneModeInSafeMode");
    49. try {
    50. connectivityF.setAirplaneMode(true);
    51. } catch (Throwable e) {
    52. reportWtf("enabling Airplane Mode during Safe Mode bootup", e);
    53. }
    54. traceEnd();
    55. }
    56. traceBeginAndSlog("MakeNetworkManagementServiceReady");
    57. try {
    58. if (networkManagementF != null) {
    59. networkManagementF.systemReady();
    60. }
    61. } catch (Throwable e) {
    62. reportWtf("making Network Managment Service ready", e);
    63. }
    64. CountDownLatch networkPolicyInitReadySignal = null;
    65. if (networkPolicyF != null) {
    66. networkPolicyInitReadySignal = networkPolicyF
    67. .networkScoreAndNetworkManagementServiceReady();
    68. }
    69. traceEnd();
    70. traceBeginAndSlog("MakeIpSecServiceReady");
    71. try {
    72. if (ipSecServiceF != null) {
    73. ipSecServiceF.systemReady();
    74. }
    75. } catch (Throwable e) {
    76. reportWtf("making IpSec Service ready", e);
    77. }
    78. traceEnd();
    79. traceBeginAndSlog("MakeNetworkStatsServiceReady");
    80. try {
    81. if (networkStatsF != null) {
    82. networkStatsF.systemReady();
    83. }
    84. } catch (Throwable e) {
    85. reportWtf("making Network Stats Service ready", e);
    86. }
    87. traceEnd();
    88. traceBeginAndSlog("MakeConnectivityServiceReady");
    89. try {
    90. if (connectivityF != null) {
    91. connectivityF.systemReady();
    92. }
    93. } catch (Throwable e) {
    94. reportWtf("making Connectivity Service ready", e);
    95. }
    96. traceEnd();
    97. traceBeginAndSlog("MakeNetworkPolicyServiceReady");
    98. try {
    99. if (networkPolicyF != null) {
    100. networkPolicyF.systemReady(networkPolicyInitReadySignal);
    101. }
    102. } catch (Throwable e) {
    103. reportWtf("making Network Policy Service ready", e);
    104. }
    105. traceEnd();
    106. // Wait for all packages to be prepared
    107. mPackageManagerService.waitForAppDataPrepared();
    108. // It is now okay to let the various system services start their
    109. // third party code...
    110. traceBeginAndSlog("PhaseThirdPartyAppsCanStart");
    111. // confirm webview completion before starting 3rd party
    112. if (webviewPrep != null) {
    113. ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
    114. }
    115. mSystemServiceManager.startBootPhase(
    116. SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
    117. traceEnd();
    118. traceBeginAndSlog("StartNetworkStack");
    119. try {
    120. // Note : the network stack is creating on-demand objects that need to send
    121. // broadcasts, which means it currently depends on being started after
    122. // ActivityManagerService.mSystemReady and ActivityManagerService.mProcessesReady
    123. // are set to true. Be careful if moving this to a different place in the
    124. // startup sequence.
    125. NetworkStackClient.getInstance().start(context);
    126. } catch (Throwable e) {
    127. reportWtf("starting Network Stack", e);
    128. }
    129. traceEnd();
    130. traceBeginAndSlog("MakeLocationServiceReady");
    131. try {
    132. if (locationF != null) {
    133. locationF.systemRunning();
    134. }
    135. } catch (Throwable e) {
    136. reportWtf("Notifying Location Service running", e);
    137. }
    138. traceEnd();
    139. traceBeginAndSlog("MakeCountryDetectionServiceReady");
    140. try {
    141. if (countryDetectorF != null) {
    142. countryDetectorF.systemRunning();
    143. }
    144. } catch (Throwable e) {
    145. reportWtf("Notifying CountryDetectorService running", e);
    146. }
    147. traceEnd();
    148. traceBeginAndSlog("MakeNetworkTimeUpdateReady");
    149. try {
    150. if (networkTimeUpdaterF != null) {
    151. networkTimeUpdaterF.systemRunning();
    152. }
    153. } catch (Throwable e) {
    154. reportWtf("Notifying NetworkTimeService running", e);
    155. }
    156. traceEnd();
    157. traceBeginAndSlog("MakeInputManagerServiceReady");
    158. try {
    159. // TODO(BT) Pass parameter to input manager
    160. if (inputManagerF != null) {
    161. inputManagerF.systemRunning();
    162. }
    163. } catch (Throwable e) {
    164. reportWtf("Notifying InputManagerService running", e);
    165. }
    166. traceEnd();
    167. traceBeginAndSlog("MakeTelephonyRegistryReady");
    168. try {
    169. if (telephonyRegistryF != null) {
    170. telephonyRegistryF.systemRunning();
    171. }
    172. } catch (Throwable e) {
    173. reportWtf("Notifying TelephonyRegistry running", e);
    174. }
    175. traceEnd();
    176. traceBeginAndSlog("MakeMediaRouterServiceReady");
    177. try {
    178. if (mediaRouterF != null) {
    179. mediaRouterF.systemRunning();
    180. }
    181. } catch (Throwable e) {
    182. reportWtf("Notifying MediaRouterService running", e);
    183. }
    184. traceEnd();
    185. traceBeginAndSlog("MakeMmsServiceReady");
    186. try {
    187. if (mmsServiceF != null) {
    188. mmsServiceF.systemRunning();
    189. }
    190. } catch (Throwable e) {
    191. reportWtf("Notifying MmsService running", e);
    192. }
    193. traceEnd();
    194. traceBeginAndSlog("IncidentDaemonReady");
    195. try {
    196. // TODO: Switch from checkService to getService once it's always
    197. // in the build and should reliably be there.
    198. final IIncidentManager incident = IIncidentManager.Stub.asInterface(
    199. ServiceManager.getService(Context.INCIDENT_SERVICE));
    200. if (incident != null) {
    201. incident.systemRunning();
    202. }
    203. } catch (Throwable e) {
    204. reportWtf("Notifying incident daemon running", e);
    205. }
    206. traceEnd();
    207. }, BOOT_TIMINGS_TRACE_LOG);
    208. }

    callback内容:

    1. 监测Native Crash
    2. 启动WebView相关
    3. 启动SystemUi

    AMS启动主要工作

    1. 将自身AMS添加到ServiceManger
    2. 将内部类LocalService:ActivityManagerInternal添加到LocalServices
    3. 在启动完bootStrap、core、otherServices后调用systemReady方法
    4. systemReady判断各类服务是否已ready,然后启动SystemUI和Launcher应用。
  • 相关阅读:
    docker(Kubernetes)环境如何查看network namespace
    零基础学Java第五节(面向对象一)
    说下 MySQL 中的锁
    python Threads and ThreadPools
    真题集P115---2015年真题(以及 力扣54)
    【7 Vue3 – Composition API】
    【计算机网络笔记七】应用层(四)HTTP 通过Content-Type提交数据的方式
    [交互]前端展示服务端获取的图片
    Linux基本指令(上)——“Linux”
    17.9处理大数据对象(血干JAVA系类)
  • 原文地址:https://blog.csdn.net/weixin_41939525/article/details/126017791