android App 启动流程详解
- 启动请求阶段
用户点击应用图标:
Launcher(桌面应用)通过 startActivity() 发送启动请求,携带目标应用的入口 Activity 信息,如包名和组件名15。
Launcher 请求传递:
启动请求通过 Binder 机制传递给系统服务 ActivityManagerService(AMS)进行合法性验证(如权限、Intent 匹配等)15。
- AMS 处理请求
创建 Task 和 ActivityRecord:
AMS 为待启动的 Activity 创建新的 Task(任务栈)和 ActivityRecord,用于管理 Activity 的生命周期和状态15。
调度启动任务:
AMS 将启动请求加入系统主线程的消息队列,等待调度执行16。
- 应用进程创建
Zygote 孵化新进程:
若目标应用进程未运行,AMS 通过 Socket 向 Zygote 进程发送请求,由 Zygote 调用 fork() 创建新进程,继承已预加载的类库和资源47。
执行 ActivityThread.main():
新进程启动后,执行 ActivityThread 的 main() 方法,初始化主线程的 Looper 和消息循环34。
- 组件初始化
绑定 Application:
ActivityThread 调用 attach() 方法向 AMS 注册应用进程,随后创建 Application 实例并执行其 onCreate() 方法34。
创建 Activity 实例:
AMS 通过 Binder 通知应用进程创建目标 Activity,触发 Activity 的生命周期方法(如 onCreate()、onStart())13。
- 界面显示
界面渲染:
Activity 的 onResume() 方法执行后,View 系统通过 ViewRootImpl 完成界面测量、布局和绘制,最终通过 SurfaceFlinger 合成显示到屏幕16。
启动完成:
Activity 界面完全显示后,启动流程结束,应用进入可交互状态15。
关键依赖组件
Zygote:预加载系统资源,快速孵化应用进程78。
AMS:统一管理 Activity 生命周期和进程调度15。
Binder IPC:跨进程通信机制,支撑系统服务与应用进程的交互17。
此流程综合了系统服务协作、进程创建、组件初始化及界面渲染,核心目标是在保证安全性和效率的前提下完成应用启动