1、问题
点击桌面图标打开一个 App,谁在系统侧调度进程与界面?窗口又是谁管的?
活动与进程调度主要靠 AMS;窗口层级与显示配合靠WMS,二者都在 system_server,App经Binder调用。
2、入口
| 角色 | 在哪 | App 侧常见入口 |
|---|---|---|
| AMS | system_server | ActivityManager / ActivityTaskManager、startActivity |
| WMS | system_server | WindowManager、addView / 窗口 token |
| Zygote | 独立进程 | 被 AMS 请求 fork 新 App 进程时参与 |
3、主路径:点击图标 → 看到界面
1. Launcher / 用户点击图标
→ 调用 startActivity(Intent)
2. App 进程(Launcher)经 Binder 进入系统
→ ActivityManagerService(AMS)收到启动请求
(分界:左边应用侧,右边系统侧)
3. AMS 做策略判断
→ 权限、任务栈、是否已有进程、是否要新建任务等
4. 若目标 App 进程不存在
→ AMS 请求 Zygote fork 新进程
→ 新进程进入 ActivityThread 主循环
5. AMS 调度生命周期
→ 经 Binder 回调到 App:onCreate → onStart → onResume 等
6. Activity 要显示时与窗口发生关系
→ 通过 Session/Token 与 WMS 协作,加入窗口层级
7. SurfaceFlinger 合成送显
→ 用户看见界面
4、应用侧 vs 系统侧(必会)
| 应用侧 | 系统侧 | |
|---|---|---|
| 典型代码 | context.startActivity() | ActivityManagerService |
| 跑在哪 | 你的 App / Launcher 进程 | system_server |
| 怎么连 | SDK API | Binder 进 AMS |
5、AMS
- 管什么:Activity 启动/切换、任务栈、进程与生命周期调度(还有不少相关能力,先抓启动)
- 不一手包办 UI 像素:真正窗口层级更多在 WMS;AMS 负责「哪个 Activity 该起来」
- 和 Zygote:需要新进程时,由 AMS(经进程管理路径)让 Zygote fork
6、WMS
- 管什么:窗口(Window)、层级、与 Display 的关系;多屏时「显示在哪块屏」会碰到它
- 和 Activity:Activity 有窗口;可见性、焦点、层级和 WMS 强相关
- 座舱伏笔:多 Display / 仪表与中控分屏,后面 OccupantZone、Car 多屏会再碰到 WMS/显示策略
一句话:AMS 决定启动谁;WMS 参与怎么铺到屏幕上。
7、和 AIDL Demo / 座舱对照
| 系统启动 Activity | 你们取车速 Demo |
|---|---|
startActivity → AMS | getSpeed / 回调 → CarService |
| 系统服务在 system_server | 自研服务在 CarServiceApp 进程 |
真 ServiceManager 里有 activity | Demo 小本子里有 "car"(仅本进程) |
| 最终要上屏 → 常扯到 WMS | HMI 自己 setText 更新(简单 UI) |
8、实践
有设备/模拟器时:
# 看 activity 服务在不在
adb shell service list | grep activity
# 看当前前台/焦点相关(输出多,看个开头即可)
adb shell dumpsys activity activities | head -50
# 启动一个包后观察(把包名换成你的)
adb shell am start -n com.jxf.carhmiapp/.MainActivity
adb shell dumpsys activity activities | head -50
2万+

被折叠的 条评论
为什么被折叠?



