Android应用的冷启动过程涉及多层次的进程间通信(IPC)机制,结合源码分析如下:
一、冷启动核心流程与IPC机制
1. Launcher发起启动请求
- 触发方式 :用户点击桌面图标,Launcher应用通过
startActivity()
发起请求。 - IPC方式 :Launcher进程通过Binder 调用
ActivityManagerService
(AMS)的startActivity()
方法。-
源码关键路径:
java// Launcher的Instrumentation调用链 Instrumentation.execStartActivity() → ActivityManager.getService().startActivity() // 跨进程调用AMS
-
Binder通信 :
ActivityManager.getService()
返回的是AMS的Binder代理对象(IActivityManager),通过Binder驱动完成跨进程调用。
-
2. AMS处理启动请求
- 检查进程状态 :AMS检查目标应用进程是否存在,通过
ProcessRecord
管理进程信息。- 管理类 :
ProcessRecord
存储进程的UID、PID、进程名等信息,AMS维护mProcessNames
(按进程名索引)和mPidsSelfLocked
(按PID索引)两个Map来跟踪进程状态。 - 判断逻辑 :若目标进程不存在,调用
Process.start()
创建新进程。
- 管理类 :
3. 创建新进程(Zygote fork)
- IPC方式 :AMS通过Socket 与Zygote进程通信,请求fork新进程。
-
源码路径:
javaProcess.start() → ZygoteProcess.startViaZygote() → 建立Socket连接,发送参数(如主类名、UID、GID等)
-
Socket通信 :Zygote进程监听Socket端口(如
/dev/socket/zygote
),接收AMS请求后fork子进程。
-
4. 应用进程初始化
- 入口点 :新进程从
ActivityThread.main()
开始执行,初始化主线程Looper和Handler。- 关键消息 :
BIND_APPLICATION
:触发Application.onCreate()
初始化。EXECUTE_TRANSACTION
:创建并启动首个Activity(如MainActivity)。
- 进程内通信:通过Handler消息机制处理生命周期事件,无跨进程通信。
- 关键消息 :
5. Activity启动与界面绘制
- IPC方式 :应用进程通过Binder 与
WindowManagerService
(WMS)通信,完成窗口创建和绘制。-
源码路径:
javaActivityThread.handleResumeActivity() → WindowManagerGlobal.addView() → 通过Binder调用WMS
-
Binder通信:WMS管理窗口的添加、布局和绘制,与应用进程通过Binder交互。
-
二、进程状态管理类
1. ProcessRecord
-
作用:记录进程的运行时信息(如PID、UID、进程名、运行中的组件等)。
-
管理方式 :AMS通过
mProcessNames
(以进程名为Key)和mPidsSelfLocked
(以PID为Key)两个Map维护所有进程的ProcessRecord
对象。 -
源码示例 :
java// ActivityManagerService.java final ProcessRecord getProcessRecordLocked(String processName, int uid) { return mProcessNames.get(processName, uid); }
2. ProcessList
- 作用:管理进程的创建、回收和优先级调整。
- 核心方法 :
startProcessLocked()
:触发进程创建流程。updateLruProcessLocked()
:更新进程的LRU(最近最少使用)状态,决定回收策略。
三、冷启动中的关键IPC总结
步骤 | 通信双方 | IPC方式 | 目的 |
---|---|---|---|
启动请求 | Launcher → AMS | Binder | 传递Intent和启动参数 |
进程创建 | AMS → Zygote | Socket | 请求fork新进程 |
窗口管理 | App进程 → WMS | Binder | 创建窗口、管理绘制 |
服务绑定 | App进程 → 系统服务(如ContentProvider) | Binder | 访问系统资源 |
四、优化与调试
- 启动时间测量 :通过
adb shell am start -W
或Activity的reportFullyDrawn()
方法获取冷启动耗时。 - 性能分析工具 :使用
systrace
分析主线程任务调度,定位锁竞争或CPU调度问题。
通过以上流程,Android冷启动过程通过Binder和Socket实现了跨进程协作,而ProcessRecord
和ProcessList
是AMS管理进程状态的核心类。