AMS 启动流程管理进程与Binder的关联
1. AMS在Activity启动流程中扮演什么角色?
核心作用:AMS是Activity启动的总调度中心,负责协调各环节,确保Activity正确启动并显示。
具体流程:
-
接收启动请求:
-
应用调用
startActivity()
后,通过Binder IPC 通知AMS。
-
-
校验合法性:
-
AMS通过PMS检查目标Activity是否在
AndroidManifest.xml
中注册。 -
检查调用者权限(如
startActivity
权限或目标Activity的exported
属性)。
-
-
进程管理:
-
如果目标应用未运行,AMS通过
Zygote
fork新进程,并触发Application
和主线程初始化。
-
-
调度生命周期:
-
AMS通知目标进程的
ActivityThread
执行onCreate()
、onStart()
等生命周期回调。
-
-
窗口管理:
-
与
WindowManagerService
(WMS)协作,将Activity的UI布局添加到屏幕。
-
一句话总结:AMS是Activity启动的“大脑”,负责权限校验、进程创建、生命周期调度和跨进程协调。
2. AMS如何管理进程优先级(adj)?
核心机制:AMS通过OOM_ADJ(Out Of Memory Adjustment)值标记进程重要性,Linux内核根据该值决定回收顺序。
优先级分类(数值越小,优先级越高):
ADJ级别 | 值范围 | 典型场景 |
---|---|---|
FOREGROUND_APP | 0-1 | 当前用户交互的Activity所在进程 |
VISIBLE_APP | 2 | 可见但无焦点的Activity(如弹窗) |
PERCEPTIBLE_APP | 3-4 | 用户可感知的进程(如后台音乐) |
CACHED_APP | 5-15 | 后台缓存进程(可随时回收) |
管理策略:
-
动态调整:根据组件状态(如Activity是否可见、Service是否绑定)实时更新adj值。
-
Low Memory Killer(LMK):当系统内存不足时,内核优先杀死高adj值的进程(如先杀
CACHED_APP
,保留FOREGROUND_APP
)。
面试加分点:
示意图:
复制
[App进程] --(Binder IPC)--> [AMS in system_server] --(Binder IPC)--> [Zygote/WMS/PMS]
面试加分点:
总结回答模板
-
提到
lmkd
(Low Memory Killer Daemon)是Android专有的进程回收机制,与AMS紧密配合 -
3. 简述AMS和Binder的关系(AMS是Binder服务端)
核心关系:AMS通过Binder机制实现跨进程通信(IPC),是Android架构中系统服务的典型代表。
具体表现: -
Binder服务端:
-
AMS本身运行在
system_server
进程,作为Binder服务端,提供IActivityManager
接口供其他进程调用。 -
例如:
startActivity()
最终通过Binder调用到AMS的startActivityAsUser()
方法。
-
-
Binder客户端:
-
应用进程通过
ActivityManager
类获取AMS的Binder代理(IActivityManager.Stub.Proxy
)。
-
-
跨进程协作:
-
AMS通过Binder与
ActivityThread
(应用主线程)通信,调度生命周期(如scheduleLaunchActivity()
)。
-
-
强调AMS的Binder接口设计遵循AIDL规范,是Android系统级IPC的核心案例。
-
Activity启动角色:
“AMS是启动流程的中枢,负责权限校验、进程创建、生命周期调度,并协调WMS/PMS完成显示。” -
进程优先级管理:
“AMS通过adj值标记进程重要性(如0为前台进程,15为缓存进程),内核根据adj值决定回收顺序。” -
Binder关系:
“AMS作为Binder服务端运行在system_server,提供IActivityManager接口,供应用进程跨进程调用。”