所有代码都是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 在组装数据完成后,发现需要启动进程而创建的
网友评论