Read The Fucking Source Code.
—— Linus
站在’巨人’的肩膀上开始自己的旅途。—— 佚名
愉快的周末,从打开💻开始,到骑行归来结束。—— 佚名
文章系列
注:
本系列文章源码基于 Android 11-r21 master 分支
- Android 系统启动 <init 进程> 笔记【1】
- Android 系统启动 <zygote 进程> 笔记【2】
- Android 系统启动
<System server>
笔记【3】
相关文件
- /system/core/init/init.cpp
- /system/etc/init/hw/init.rc (源码工程没找到,是从手机上获取)
- /system/etc/init/hw/init.zygote32.rc (手机上获取)
- /system/etc/init/hw/init.zygote64_32.rc (手机上获取)
- /system/core/init/action.cpp
- /system/core/init/service.cpp
- /system/core/init/service_list.cpp
- frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
- frameworks/base/core/java/com/android/internal/os/Zygote.java
- frameworks/base/core/java/com/android/internal/os/WrapperInit.java
解析 hw/init.rc
init.rc 解析
带着上文留下的疑惑继续看源码,之前提到执行到第二阶段时候进入了 loop 循环,似乎不知去向何处?第二阶段创建 init 进程中有一个重要的函数那就是 LoadBootScripts(actionManager,serviceList)
加载启动脚本,相当重要,与 init.rc
文件存在千丝万缕的关系,那么就要看看这里究竟在执行什么。
在 Android 11 上,init.rc 文件在/system/etc/init/hw/init.rc
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSCwp9hL-1658835973999)
这是在小米手机找的,看看内容,rc 文件被视为 Android 初始化语言,也有一定的语法,
总结下 Android 初始化语言
- action on 后携带一组命令
- trigger 触发器,确定何时执行命令
- service 当 init 退出时启动或重启
- options 进一步控制命令执行的方式和时间
- 命令:on 每一行代表一条命令
- import 导入额外的 rc 文件需要解析
下面简略看看 rc 文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKFSboqt-1658835973999)
解析 zygote.rc
看上面截图,现在该执行init.zygote32.rc、init.zygote64_32.rc
,继续往下看。
创建 zygote Process
在第二阶段 SecondStageMain 初始化时候解析了 inir.rc,回到 main.cpp 看到 函数映射表 GetBuiltinFunctionMap 作为参数传进入 SubcontextMain 第四部分开始执行,接着看看执行流程。
到此,通过查找服务列表创建了一堆进程,现在我们主要关注 zygote
进程的创建,这时候间从 cpp 进入 Java
初始化 zygote
预加载
创建 zygote Server
服务主要还是通过 socket 实现,等待来自 Linux、unix 守护进程 (socket) 的消息,同时也负责子进程的创建。
创建 System Server
到这里 SystemServer 已经创建完成,接下来是通过 MethodAndArgsCaller
方法执行其中的 main
方法,源码路径是/frameworks/base/services/java/com/android/server/SystemServer.java
。
那么本节笔记到此,我们下周再见😊。
附加
参考链接
- Androi.bp:bp 文件,替换 .mk 的配置文,由 https://github.com/palantir/blueprint 框架解析
- Android.mk:mk 文件,Android 程序编译
- lmkd:low memory killer deamon 低内存终止守护进程
- Apex:Android pony express 解决较低级别系统模块的安装流程 https://source.android.google.cn/devices/tech/ota/apex?hl=zh-cn
- syspro 文件:系统共享信息的属性配置文件,通常作为系统 API 实现 https://source.android.google.cn/devices/architecture/sysprops-apis?hl=zh-cn#:~:text=一个,Sysprop%20说明文件包含一条属性消息,用来描述一组属性%E3%80%82
- ABI:与 CPU 指令集相关 https://developer.android.google.cn/ndk/guides/abis?hl=zh-cn
- Linux IO 多路复用:select、poll、epoll https://cloud.tencent.com/developer/article/1005481
- MTE:memory tagging extension 内存标签扩展
- 已加标记指针:https://source.android.google.cn/devices/tech/debug/tagged-pointers?hl=zh-cn