Android 开机链路 + 桌面 App「用户点击图标」启动链路(端到端梳理)
目的:把 开机到桌面可用 的关键链路,以及 用户在桌面点击图标 → 目标 App Activity 展示首帧 的完整主干流程串起来。
说明:不同 Android 版本实现细节略有差异(Android 10+ 引入 ATMS 分工更明显),本文以 通用主干 为主,必要处点出关键分工。
1) 开机链路(Boot Chain):Kernel → init → zygote → system_server → launcher

1.1 Kernel 启动 init(Native)
- Kernel 启动完成后启动用户态第一个进程:
/init init负责:- 挂载分区、初始化 SELinux、安全策略
- 解析
init.rc/*.rc - 启动关键守护/服务:
servicemanager、zygote、surfaceflinger等
关键产物
- Binder 驱动就绪 +
servicemanager提供服务注册/发现 - 图形基础(
surfaceflinger)启动,为后续 SystemUI/Launcher 出图打底
1.2 init 启动 Zygote(Native → Java 孵化器)
- 通过 rc 启动
zygote/zygote64 - Zygote 做两件核心事:
- 预加载(classes、resources、常用库)以提升后续 fork 性能
- 提供 fork :派生
system_server和各 App 进程
常见入口:
com.android.internal.os.ZygoteInit.main()preload()forkSystemServer()
1.3 system_server 启动:SystemServer 拉起核心系统服务(Java)
com.android.server.SystemServer.main()→run()- 分阶段启动大量 System Services(版本略有差异),关键与"启动/桌面"强相关的包括:
- AMS(ActivityManagerService):进程/广播/服务/ANR 等
- ATMS(ActivityTaskManagerService,Android 10+):Activity/Task 启动与任务栈
- WMS(WindowManagerService):窗口管理与显示策略
- PMS(PackageManagerService):包解析、组件解析、权限
InputManagerService:输入PowerManagerService:电源与唤醒DisplayManagerService:显示- 以及 SystemUI、网络、音频等
关键节点:systemReady / bootCompleted
- 系统服务启动完成后会进入
systemReady(),随后发出 BOOT_COMPLETED(对三方 app 影响很大)
1.4 SystemUI/Launcher 出现(桌面可用)
- 一般会先启动 SystemUI(状态栏、导航栏、锁屏等)
- 解锁后/或满足条件后,启动 Launcher(桌面应用)
桌面启动方式(概念)
- SystemServer 选择一个 HOME Activity(Launcher)
- Intent:
ACTION_MAIN+CATEGORY_HOME
- Intent:
- 走一次标准的 Activity 启动链路(见第 2 部分)
2) 桌面用户点击图标:Launcher → SystemServer → 目标 App 首帧
场景:用户在桌面点击某个 App 图标(目标 Activity 可能是 LAUNCHER Activity),系统完成从点击到界面显示。
2.1 触摸事件到 Launcher:Input → View → onClick
- 触摸从硬件到应用的主链路(高层概念):
- Input 驱动产生事件
InputManagerService分发- 通过 WMS 选择焦点窗口/目标应用
- 事件到达 Launcher 进程(
ViewRootImpl→DecorView→View) - 点击触发 Launcher 的图标点击逻辑
2.2 Launcher 组装 Intent 并发起 startActivity
- Launcher 通常为目标 App 组装:
- 显式 Intent:
ComponentName(包名/Activity) - 或隐式 Intent(较少用于图标)
- 常带 flag:
FLAG_ACTIVITY_NEW_TASK(因 Launcher 非目标 app 内部页面跳转)
- 显式 Intent:
Launcher 侧常见入口(概念):
Activity.startActivity()/Context.startActivity()Instrumentation.execStartActivity()- 进入系统服务(Binder):
- Android 10+ 常见:
IActivityTaskManager.startActivity(...)
- Android 10+ 常见:
2.3 进入 SystemServer:ATMS 做 Activity 启动决策(任务栈/复用/权限)
SystemServer 侧关键流程(高层语义):
- 权限校验、调用者校验(是否允许启动、后台启动限制等)
- 通过 PMS 解析目标组件(ActivityInfo/ProcessName/UID 等)
- 计算任务栈归属与启动模式(standard/singleTask...)
- 判断是 冷/温/热启动 :
- 进程是否存在
- 目标 Activity 是否已存在于任务栈
结论:ATMS 负责"Activity/Task 怎么启动、放哪、复用谁 ";而"进程怎么来"交给 AMS。
2.4 冷启动分支:目标进程不存在 → AMS 创建进程(zygote fork)
触发条件
- 目标 App 进程尚未创建,或被杀
关键链路(概念)
- ATMS:需要进程 → 请求 AMS
- AMS:准备
ProcessRecord(uid/selinux/abi/进程名) ZygoteProcess.start(...):- 通过 socket 与 zygote 通信
- zygote fork 出目标 App 进程
2.5 目标 App 进程起来:ActivityThread.main → attach 到 AMS
App 进程入口:
android.app.ActivityThread.main()- 建立主线程 Looper
attach(false):- Binder →
IActivityManager.attachApplication(appThread)
- Binder →
SystemServer(AMS)收到 attach:
- 记录进程已上线
- 回调到 App 进程:
IApplicationThread.bindApplication(...)
2.6 bindApplication:创建 Application / 初始化运行环境
App 进程执行:
ActivityThread.handleBindApplication()- 创建
LoadedApk - 创建
Application Application.onCreate()- 安装 ContentProviders(如有)
- 创建
到这一步:进程与应用级初始化完成,但 Activity 还未真正 onCreate(下一步由 ATMS 发起 Launch)。
2.7 真正启动 Activity:SystemServer 下发事务 → App 执行 onCreate/onResume
Android P+ 常用事务机制(概念):
- SystemServer(ATMS)构造
ClientTransaction- 包含
LaunchActivityItem、ResumeActivityItem等
- 包含
- Binder → App:
IApplicationThread.scheduleTransaction(transaction)
App 侧执行:
TransactionExecutor.execute()ActivityThread.handleLaunchActivity()- 创建 Activity 实例
Activity.attach()Activity.onCreate()
- 随后
onStart()、onResume()
2.8 首帧显示:WMS/Surface + App 绘制管线
并行协作点:
- ATMS/WMS 控制窗口可见性、转场动画、焦点
- App 在
onResume前后触发视图树创建 - 首帧绘制:
Choreographer驱动 measure/layout/drawSurface提交给 SurfaceFlinger 合成显示
用户可见结果
- 屏幕从桌面切到目标 App,展示首帧
3) 冷/温/热启动对比(用户点击图标时常见)
- 冷启动(Cold):无进程 → fork + bindApplication + LaunchActivity + 首帧
- 温启动(Warm):进程在,但 Activity 不在前台/需新建 → 省掉 fork 和 Application.onCreate(多数情况)
- 热启动(Hot):Activity 实例仍在 → 多为 task 切前台 + onRestart/onStart/onResume + 窗口切换
4) 一张"时序图"(从点击到首帧)

5) 你可以拿来对照的观测手段
adb shell am start -W <intent>:粗看启动耗时adb shell dumpsys activity activities:任务栈/Activity 状态adb shell dumpsys activity processes:进程状态adb shell dumpsys window windows:窗口状态perfetto/atrace:精确看 bindApplication、launch、首帧绘制 slice