8 启动黑白屏的由来

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容