【Android技能点】一张图理清 开机、App启动流程

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
    • 启动关键守护/服务:servicemanagerzygotesurfaceflinger

关键产物

  • Binder 驱动就绪 + servicemanager 提供服务注册/发现
  • 图形基础(surfaceflinger)启动,为后续 SystemUI/Launcher 出图打底

1.2 init 启动 Zygote(Native → Java 孵化器)

  • 通过 rc 启动 zygote/zygote64
  • Zygote 做两件核心事:
    1. 预加载(classes、resources、常用库)以提升后续 fork 性能
    2. 提供 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
  • 走一次标准的 Activity 启动链路(见第 2 部分)

2) 桌面用户点击图标:Launcher → SystemServer → 目标 App 首帧

场景:用户在桌面点击某个 App 图标(目标 Activity 可能是 LAUNCHER Activity),系统完成从点击到界面显示。

2.1 触摸事件到 Launcher:Input → View → onClick

  • 触摸从硬件到应用的主链路(高层概念):
    1. Input 驱动产生事件
    2. InputManagerService 分发
    3. 通过 WMS 选择焦点窗口/目标应用
    4. 事件到达 Launcher 进程(ViewRootImplDecorViewView
    5. 点击触发 Launcher 的图标点击逻辑

2.2 Launcher 组装 Intent 并发起 startActivity

  • Launcher 通常为目标 App 组装:
    • 显式 Intent:ComponentName(包名/Activity)
    • 或隐式 Intent(较少用于图标)
    • 常带 flag:FLAG_ACTIVITY_NEW_TASK(因 Launcher 非目标 app 内部页面跳转)

Launcher 侧常见入口(概念):

  • Activity.startActivity() / Context.startActivity()
  • Instrumentation.execStartActivity()
  • 进入系统服务(Binder):
    • Android 10+ 常见:IActivityTaskManager.startActivity(...)

2.3 进入 SystemServer:ATMS 做 Activity 启动决策(任务栈/复用/权限)

SystemServer 侧关键流程(高层语义):

  1. 权限校验、调用者校验(是否允许启动、后台启动限制等)
  2. 通过 PMS 解析目标组件(ActivityInfo/ProcessName/UID 等)
  3. 计算任务栈归属与启动模式(standard/singleTask...)
  4. 判断是 冷/温/热启动
    • 进程是否存在
    • 目标 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)

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
    • 包含 LaunchActivityItemResumeActivityItem
  • 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/draw
    • Surface 提交给 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
相关推荐
李坤林21 分钟前
Android Binder 详解(6) Binder 客户端的创建
android·binder
北京自在科技22 分钟前
苹果iOS 26.3实现跨安卓数据无缝迁移
android·ios·findmy
_道隐_27 分钟前
Android里面的layer、DisplayList和hardwarebuffer之间是什么关系
android
stevenzqzq2 小时前
ctrl +B和ctrl+shift +B的区别
android·ide·android studio
似霰2 小时前
HIDL Hal 开发笔记5----Same-Process HALs 实例分析
android·framework·hal
robotx3 小时前
安卓16 设置壁纸中应用网格,有两个5X5的选项
android
Yyuanyuxin3 小时前
保姆级学习开发安卓手机软件(三)--安装模拟机并开始简单的进入开发
android·学习
Android小码家3 小时前
llama.cpp+Android应用定制
android·llama
龚礼鹏3 小时前
Android应用程序 c/c++ 崩溃排查流程二——AddressSanitizer工具使用
android·c语言·c++
Android-Flutter3 小时前
android compose DropdownMenu 菜单项列表 使用
android