美文网首页
Android Framework 08---渲染机制完全解析0

Android Framework 08---渲染机制完全解析0

作者: 沪漂意哥哥 | 来源:发表于2022-04-08 07:20 被阅读0次

一. 应用从启动到onCreate的过程

image.png

二. Activity生成过程详细分析

21版本: image.png 28版本以后: image.png

三. 核心对象整理

1.ActivityThread
2.ApplicationThread

AMS通信

3.Instrumentation

Application与Activity生命周期管理

4.ClientTransaction

客户端回调事务管理

5.ActivityStackSupervisor

配置信息管理

6.ActivityRecord

Activity配置信息实体,Launcher进程负责解析清单文件传递数据入AMS

7.ClientTransactionItem

LauncherActivityItem:启动
PauseActivityItem:暂停
StopActivityItem:停止
ResumeActivityItem:重新加载
DestroyActivityItem:销毁

三. 源码阅读思路与流程

1.zygote进程fork之后,系统启动ActivityThread
2.ActivityThread准备一个ApplicationThread类

用于去和AMS进行通信。

3.ActivityThead发起一个对于AMS.attachApplication的binder调用
4.回到bindApplication中发生数据组装后的handler调用
5.sendMessage消息转入handlerMessage中

最终调用到handleBindApplication

6.handleBindApplication

a.mInstrumentation生命周期管理对象的构建
b.Application的创建与调用:反射构建Application信息+调用create函数
上述过程完成了Application的创建调用管理过程,接着就是Activity的相关管理。

7.mStackSupervisor.attachApplicationLocked

该类为Activity配置管理

8.验证是否是MainAcitivty
image.png
9.进入realStartAcitivityLocked中启动Activity创建

ClientTransactionActivity启动事务管理,首先回封装事务数据,然后进行相关事务提交,事务提交的目的是让人去进行调度。

10.此时回到ApplicationThread.scheduleTransaction的调用

消息发送--EXECUTE_TRANSACTION

11.消息发送接收到后执行mTranscationExecutor.execute(transcation)
12.由performLaunchActivity具体进行反射构建

mInstrumentation.newAcitiy:反射构建具体实体对象
然后进行acitivity.attach:初始化PhoneWindow对象
再调用callAcitivtyOnCreate:activity.onCreate

四. 源码总结

1.Launcher进程会将清单文件中相关配置信息传递数据到AMS
2.AMS负责的管理的是配置信息。
3.Activity启动后会产生一个ApplicationThread通信类对AMS进行通信。
4.AMS接收到attach调用后,将相关配置信息进行筛选,打包后交由事务管理进行回调,事务管理会回调ApplicationTread中相关schedule函数进行通信。
5.所有的具体数据构建的反色构建 由Instrumentation完成。

五. setContentView加载数据的核心概念。

目的:XML信息加载与管理

1.加载基础布局数据 image.png

基础布局实际物理文件地址:SDK安装目录\platforms\android-31\data\res

2.加载用户布局数据

五. setContentView具体源码分析流程。

1.activity.setContentView
这里实际调用的是Window.setContentView image.png

我们可以看到在attach中实际 生产的对象为PhoneWindow,所以我们直接找到对应PhoneWindow.setContentView

2.PhoneWindow.setContentView

这里主要注意两个点:
a.由installDecor()完成基础布局数据加载。

b.由mLayoutInflater.inflate(layoutResID,mContentParent)完成用户布局数据加载。 image.png
3.PhoneWindow.installDecor
a.构建生成一个DecorView对象。 image.png

b.获取到基础布局当中的内容部分
mContentparent = generatelayout(mDecor);

1)首先是对DeDecorViewcor一系列参数属性的设置 image.png
2)根据主题不同,进行选择不同的基础布局文件进行解析 image.png
3)这里以R.layout.screen_simple为例 image.png

4)mDecor.onResourcesLoaded(mLayoutInflater,layoutResource)对该文件进行XML解析

5)在加载进来的基础布局上找到ID为content的布局作为用来存储用户布局的面版,该对象就是mContentParent属性 image.png

两个结论:

1.Decor作为整个视图的基础面版,那么包含由相关的一些导航栏等附件数据 image.png
2.mContentParent为紫色部分,也就是基础布局文件中的id为content这个视图
4.用户数据加载
mLayoutInflater.inflate(layoutResId,mContentParent) image.png
5.具体解析流程
a.根据文件获取解析器 image.png
b.创建根节点View image.png
c.解析下级View image.png
d.将根节点添加到DecorView image.png

五. 源码总结

总结:整个setContentView就是在做两件事情

1.加载基础布局xml生成对应数据,形成DecorView。
2.将用户布局的要挂载的位置提取处理,即mContentParent.
3.加载用户布局文件且级联下级生成对应的View,挂载到mContentParent下,至此,所有View数据加载完毕。

相关文章

网友评论

      本文标题:Android Framework 08---渲染机制完全解析0

      本文链接:https://www.haomeiwen.com/subject/dfrjsrtx.html