Launcher3启动
Launcher3启动
startOtherServices
//frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {mActivityManagerService.systemReady(() -> {Slog.i(TAG, "Making services ready");t.traceBegin("StartActivityManagerReadyPhase");mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);t.traceEnd();t.traceBegin("StartObservingNativeCrashes");try {mActivityManagerService.startObservingNativeCrashes();} catch (Throwable e) {reportWtf("observing native crashes", e);}t.traceEnd();t.traceBegin("RegisterAppOpsPolicy");try {mActivityManagerService.setAppOpsPolicy(new AppOpsPolicy(mSystemContext));} catch (Throwable e) {reportWtf("registering app ops policy", e);}t.traceEnd();// No dependency on Webview preparation in system server. But this should// be completed before allowing 3rd partyfinal String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";Future<?> webviewPrep = null;if (mWebViewUpdateService != null) {webviewPrep = SystemServerInitThreadPool.submit(() -> {Slog.i(TAG, WEBVIEW_PREPARATION);TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();traceLog.traceBegin(WEBVIEW_PREPARATION);ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");mZygotePreload = null;mWebViewUpdateService.prepareWebViewInSystemServer();traceLog.traceEnd();}, WEBVIEW_PREPARATION);}
}
systemReady()
//frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);......
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {......if (isBootingSystemUser && !UserManager.isHeadlessSystemUserMode()) {t.traceBegin("startHomeOnAllDisplays");mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");t.traceEnd();}.......
}
startHomeOnAllDisplays()
//frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javapublic void setWindowManager(WindowManagerService wm) {synchronized (mGlobalLock) {mWindowManager = wm;mRootWindowContainer = wm.mRoot;......}}@Overridepublic boolean startHomeOnAllDisplays(int userId, String reason) {synchronized (mGlobalLock) {return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);}}
startHomeOnAllDisplays(
//frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javaboolean startHomeOnAllDisplays(int userId, String reason) {boolean homeStarted = false;for (int i = getChildCount() - 1; i >= 0; i--) {final int displayId = getChildAt(i).mDisplayId;homeStarted |= startHomeOnDisplay(userId, reason, displayId);}return homeStarted;}