所有代碼都是Android 11
在沒有分析這個問題之前,一直都覺得這個啟動的黑白屏是由lancher 在啟動過程中被啟動的 app 相應的這個黑白屏,但是經過一段時間的源碼閱讀發現并不是這個樣子的,這里面有一個比較有意思的地方, 我在 FrameWork 系列 的第六篇文章 (6.ActivityManagerService(四)App啟動流程AppThread 創建)]中有提到過SystemServer 進程在創建后,他會創建一個 自己創建一個 Context 對象,同時綁定了Theme 等屬性,一開始一直不了解他用這個context 干什么,今天在面試過程中有人問到我這個問題,真的是突然就想到了這個黑白屏的由來,就與SystemServer 這個context 的有關
下面我來分析一下這個黑白屏的創建過程 , 他創建的時機是在 ActivityStarter 組件 啟動 activity 的flag 數據之后,
啟動事件流轉過程
Activity.startActivity()// TODO app 進程
--> Instrumentation.execStartActivity()// app 進程
--> ActivityTaskManagerService.startActivity() // TODO 注意 此時已經離開了app 進程,來到了SystemServer 進程
--> ActivityStart.execute()-->//TODO SystemServer 進程
-->ActivityStart.executeRequest()//TODO SystemServer 進程
-->ActivityStarter.startActivityUnchecked()//TODO SystemServer 進程
--> ActivityStarter.startActivityInner()//TODO SystemServer 進程
mTargetStack.startActivityLocked(mStartActivity,
topStack != null ? topStack.getTopNonFinishingActivity() : null, newTask,
mKeepCurTransition, mOptions);
到了這里intent 的 flag 的數據準備階段已經完成了,但是還有沒有fork進程,只是判斷了進程的狀態,判斷了窗口的狀態,判斷了ActivityRecord 的狀態 ,判斷了Task 的狀態,
我們接下來在看看 這個黑白屏是由誰來創建的
ActivityStarter.startActivityInner()
-->ActivityStack.startActivityLocked()
--->ActivityRecord.showStartingWindow()
-->ActivityRecord.addStartingWindow()
-->ActivityRecord.createSnapshot()
-->創建TaskSnapshotSurface
--> 繪制
這里整個流程答題就是這樣,但是最后獲取這個application 的信息化應該是從PackagerManagerService 中獲取的,但是具體的流程我這邊沒有看到過,這里就先記錄這些,記錄這個流程也只是讓自己加深一下印象, 這個黑白屏的信息并不是被啟動的進程創建的,而是 ATMS 在組裝數據完成后,發現需要啟動進程而創建的