第2章 Android系统启动

沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程

第2章 Android系统启动

在《第2章 Android系统启动》中,本课程对应刘望舒《Android进阶解密》,电子工业出版社2018年10月初版,468页、702千字,ISBN 9787121348389。原书以Android 8.0系统源码为主;本页不会用Android 10后的ATMS、现代ART实现、Perfetto或新隐藏API政策替换原书链路。

沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程。源码实验固定AOSP Android 8.0与作者出版仓库提交 3860d9e1;后续版本只作为迁移差异,不改变正式目录分母。

学习目标

  • 能解释“第2章 Android系统启动”全部正式目录节点,并定位Android 8.0中的入口类、函数与源码路径。
  • 能绘制进程、线程、Binder/JNI/加载边界和关键状态转移,区分请求发出与系统完成。
  • 能设计单变量故障实验,验证“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”。
  • 能写出包含版本、源码、日志/追踪、反例、停止、恢复、回退和复核人的独立交接记录。

机制总览

第2章 Android系统启动:机制路径

  1. 1

    从一条可证伪的调用链开始

    先预测:把启动描述成线性函数列表会忽略init action/service触发、Zygote socket、SystemServer服务依赖与Launcher查询包信息的跨进程边界。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。

  2. 2

    核心词汇与版本门

    以上词汇都固定在Android 8.0语义。在《第2章 Android系统启动》中,Android 7.0只在原书明确比较AMS家族时出现;Android 9以后反射/隐藏API限制、Android 10的ActivityTaskManager、现代Profiler/Perfetto等只能写进迁移备注,不能改写本页正式链路。

  3. 3

    原书目录核对清单

    本节把「原书目录核对清单」放回《第2章 Android系统启动》的输入、状态变化与输出路径中理解。

先按顺序建立机制,再进入实验切换阶段并检查失效证据。

章级决策实验

第2章 Android系统启动:机制与证据

切换《第2章 Android系统启动》的三个关键教学阶段,先解释机制,再用运行与失败证据验证结论。

选择推理阶段

当前阶段 · 从一条可证伪的调用链开始

先预测:把启动描述成线性函数列表会忽略init action/service触发、Zygote socket、SystemServer服务依赖与Launcher查询包信息的跨进程边界。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。

可核验证据

在固定 AOSP 8.0 标签上追踪「从一条可证伪的调用链开始」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。

学完《第2章 Android系统启动》后,应能从输入和前置条件推导状态变化,并用可重复的构建、运行或边界测试证明结果。

失效—证据矩阵

第2章 Android系统启动:失效与核验

从一条可证伪的调用链开始

典型失效

若只背诵「从一条可证伪的调用链开始」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。

核验证据

在固定 AOSP 8.0 标签上追踪「从一条可证伪的调用链开始」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。

核心词汇与版本门

典型失效

若只背诵「核心词汇与版本门」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。

核验证据

在固定 AOSP 8.0 标签上追踪「核心词汇与版本门」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。

原书目录核对清单

典型失效

若只背诵「原书目录核对清单」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。

核验证据

在固定 AOSP 8.0 标签上追踪「原书目录核对清单」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。

每个判断都必须能落到观测、测试或产物,不能只凭代码表面推测。

从一条可证伪的调用链开始

先预测:把启动描述成线性函数列表会忽略init action/service触发、Zygote socket、SystemServer服务依赖与Launcher查询包信息的跨进程边界。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。

原书面向应用开发者学习系统源码,重点不是抄完整函数,而是抓住跨层调用的关键节点。每个节点都要回答:谁发起、在哪个进程和线程执行、哪份状态被修改、后续如何被唤醒、失败如何返回、什么现象代表真正完成。

验收不变量是:每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成。只有源码版本、符号关系、运行轨迹与最终状态四类证据一致,结论才可以进入下一章。

核心词汇与版本门

以上词汇都固定在Android 8.0语义。在《第2章 Android系统启动》中,Android 7.0只在原书明确比较AMS家族时出现;Android 9以后反射/隐藏API限制、Android 10的ActivityTaskManager、现代Profiler/Perfetto等只能写进迁移备注,不能改写本页正式链路。

原书目录核对清单

本页承担23个目录或复习节点,正文、图解、实验和题目必须能反向定位每一项:

  • 2.1 init进程启动过程
  • 2.1.1 引入init进程
  • 2.1.2 init进程的入口函数
  • 2.1.3 解析init.rc
  • 2.1.4 解析Service类型语句
  • 2.1.5 init启动Zygote
  • 2.1.6 属性服务
  • 2.1.7 init进程启动总结
  • 2.2 Zygote进程启动过程
  • 2.2.1 Zygote概述
  • 2.2.2 Zygote启动脚本
  • 2.2.3 Zygote进程启动过程介绍
  • 2.2.4 Zygote进程启动总结
  • 2.3 SystemServer处理过程
  • 2.3.1 Zygote处理SystemServer进程
  • 2.3.2 解析SystemServer进程
  • 2.3.3 SystemServer进程总结
  • 2.4 Launcher启动过程
  • 2.4.1 Launcher概述
  • 2.4.2 Launcher启动过程介绍
  • 2.4.3 Launcher中应用图标显示过程
  • 2.5 Android系统启动流程
  • 2.6 本章小结

分步追踪:源码、运行与反例

分步1 / 3

定位源码入口与责任边界

固定Android 8.0标签,从公开入口向下追踪,不跳过Binder代理、JNI注册、ClassLoader查找或system_server状态对象。

可复现实验

kernel -> init(PID 1) -> app_process -> Zygote -> system_server -> Launcher
on boot -> class core -> service zygote -> socket zygote -> start
adb shell ps -A | grep -E 'zygote|system_server|launcher'
adb shell getprop sys.boot_completed

动手试:在同一镜像、同一构建和同一输入上重复正常、冷启动/首次加载、热路径、单变量失败与恢复五轮。在《第2章 Android系统启动》中,记录PID/TID、调用入口、对象或token、状态前后值、耗时、异常/返回码和最终可见结果;性能章再记录P50/P95/P99,内存章保留GC Root路径。

独立证据门

  • 节点覆盖Android系统启动
  • 最小切片贯通全链路
  • 故障实验对比每个阶段都明确谁创建下一进程、使用何种配置…
  • 凭证据完成交接

练习

练习

问题 1:为什么“第2章 Android系统启动”必须固定Android 8.0?

问题 2:怎样构造“把启动描述成线性函数列表会忽略init action/service触发、Zygote socket、SystemServer服务依赖与Launcher查询包信息的跨进程边界”的最小反例?

问题 3:何时可以认为本页完成独立交接?

本章回顾

“第2章 Android系统启动”的核心是沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程。把启动描述成线性函数列表会忽略init action/service触发、Zygote socket、SystemServer服务依赖与Launcher查询包信息的跨进程边界是必须保留的反证;源码阅读只有连接运行时的进程、线程、状态与最终结果,才从“知道类名”升级为“能诊断”。

名词解释

本章出现的专业名词,用大白话再讲一遍。

init

init服务于“沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”独立验收。

init.rc

init.rc服务于“沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”独立验收。

Zygote

Zygote服务于“沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”独立验收。

SystemServer

SystemServer服务于“沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”独立验收。

Launcher

Launcher服务于“沿init、Zygote、SystemServer和Launcher四段主链追踪Android 8.0从PID 1到应用图标可见的启动过程”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“每个阶段都明确谁创建下一进程、使用何种配置或IPC、何时进入消息循环,以及何种日志证明阶段完成”独立验收。

← 上一页:第1章 Android系统架构 · 下一页:第3章 应用程序进程启动过程 →

原版目录概念补充核对

以下条目补齐官方目录中容易被示例主线掩盖的概念。它们不重复罗列目录,而是明确每项概念的机制、适用边界和验收证据。

2.1.1 引入init进程:机制、边界与证据

第2章 Android系统启动中的2.1.1 引入init进程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.1.2 init进程的入口函数:机制、边界与证据

第2章 Android系统启动中的2.1.2 init进程的入口函数要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.1.3 解析init.rc:机制、边界与证据

第2章 Android系统启动中的2.1.3 解析init.rc要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.1.4 解析Service类型语句:机制、边界与证据

第2章 Android系统启动中的2.1.4 解析Service类型语句由 framework 对象、system_server 状态和应用进程回调共同完成,API 返回不等于系统状态已经落定。应跟踪 token/record、目标进程与线程、生命周期回调和最终窗口或组件状态,并用无效 token、进程重建或迟到回调验证拒绝与恢复路径。

2.1.5 init启动Zygote:机制、边界与证据

第2章 Android系统启动中的2.1.5 init启动Zygote要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.1.6 属性服务:机制、边界与证据

第2章 Android系统启动中的2.1.6 属性服务必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。

2.1.7 init进程启动总结:机制、边界与证据

第2章 Android系统启动中的2.1.7 init进程启动总结要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.2 Zygote进程启动过程:机制、边界与证据

第2章 Android系统启动中的2.2 Zygote进程启动过程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.2.1 Zygote概述:机制、边界与证据

第2章 Android系统启动中的2.2.1 Zygote概述要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.2.2 Zygote启动脚本:机制、边界与证据

第2章 Android系统启动中的2.2.2 Zygote启动脚本要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.2.3 Zygote进程启动过程介绍:机制、边界与证据

第2章 Android系统启动中的2.2.3 Zygote进程启动过程介绍要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.2.4 Zygote进程启动总结:机制、边界与证据

第2章 Android系统启动中的2.2.4 Zygote进程启动总结要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.3 SystemServer处理过程:机制、边界与证据

第2章 Android系统启动中的2.3 SystemServer处理过程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.3.1 Zygote处理SystemServer进程:机制、边界与证据

第2章 Android系统启动中的2.3.1 Zygote处理SystemServer进程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.3.2 解析SystemServer进程:机制、边界与证据

第2章 Android系统启动中的2.3.2 解析SystemServer进程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.3.3 SystemServer进程总结:机制、边界与证据

第2章 Android系统启动中的2.3.3 SystemServer进程总结要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.4 Launcher启动过程:机制、边界与证据

第2章 Android系统启动中的2.4 Launcher启动过程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.4.1 Launcher概述:机制、边界与证据

第2章 Android系统启动中的2.4.1 Launcher概述要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.4.2 Launcher启动过程介绍:机制、边界与证据

第2章 Android系统启动中的2.4.2 Launcher启动过程介绍要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.4.3 Launcher中应用图标显示过程:机制、边界与证据

第2章 Android系统启动中的2.4.3 Launcher中应用图标显示过程要沿 Android 8.0 的真实启动或 IPC 链路解释:先定位入口源码与调用者,再标出进程、线程、Binder 对象、状态写入和完成回调。固定 AOSP 标签后,用 PID/TID、调用栈、关键日志与一个进程未就绪或回调延迟样本核对先后关系。

2.5 Android系统启动流程:机制、边界与证据

第2章 Android系统启动中的2.5 Android系统启动流程必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。

2.6 本章小结:机制、边界与证据

第2章 Android系统启动中的2.6 本章小结必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。

讨论

评论区加载中…