### **Android核心系统服务深度解析(AMS/ATMS/WMS/DMS)**
---
---
#### **一、AMS(ActivityManagerService)**
**职责**:管理应用生命周期、进程调度、四大组件(Activity/Service/Broadcast/ContentProvider)协调、权限控制、内存管理等。
---
##### **1. 源码路径**
- **核心类**:
- `frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java`
- `frameworks/base/core/java/android/app/ActivityManager.java`(客户端接口)
---
##### **2. 核心流程**
###### **2.1 系统启动初始化**
- **启动入口**:由`SystemServer`在`startBootstrapServices()`阶段初始化。
```java
// SystemServer.java
mActivityManagerService = new ActivityManagerService(context, ...);
mActivityManagerService.setSystemProcess(); // 注册到ServiceManager
mActivityManagerService.installSystemProviders(); // 安装系统ContentProvider
mActivityManagerService.systemReady(() -> {
// 系统准备完成后启动Launcher
});
```
###### **2.2 Activity启动流程**
```mermaid
sequenceDiagram
participant ClientApp
participant AMS
participant ProcessList
participant ATMS
participant ApplicationThread
ClientApp->>AMS: startActivity(intent)
AMS->>ProcessList: startProcessLocked() // 若目标进程不存在,通过Zygote fork新进程
AMS->>ATMS: startActivityViaWindowManager() // 委托ATMS处理任务栈
ATMS->>WMS: prepareWindow() // 窗口预创建
WMS-->>ATMS: 返回窗口配置
ATMS->>ApplicationThread: scheduleLaunchActivity() // IPC调用,触发目标Activity启动
ApplicationThread->>ActivityThread: handleLaunchActivity() // 创建Activity实例
```
###### **2.3 进程管理**
- **LRU列表**:通过`mLruProcesses`维护进程优先级,按最近使用时间排序。
- **OOM Adj机制**:`updateOomAdjLocked()`动态调整进程的`adj`值(0-1000),决定进程被杀优先级。
```java
// ProcessList.java
void updateOomAdjLocked(ProcessRecord app) {
if (app.curAdj != app.setAdj) {
Process.setOomAdj(app.pid, app.curAdj); // 通过procfs写入adj值
}
}
```
###### **2.4 四大组件管理**
- **Service绑定**:`bindService()`触发`ActiveServices`创建ServiceConnection。
- **Broadcast分发**:`BroadcastQueue`处理有序/无序广播,通过`BroadcastFilter`匹配接收者。
---
#### **二、ATMS(ActivityTaskManagerService)**
**职责**:管理Activity任务栈(Task)、多窗口模式、分屏逻辑、生命周期调度(Android 10+从AMS拆分)。
---
##### **1. 源码路径**
- **核心类**:
- `frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java`
- `frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java`
---
##### **2. 核心流程**
###### **2.1 任务栈(Task)管理**
- **数据结构**:
- `Task`:封装一组Activity的栈(后进先出),包含`ActivityRecord`列表。
- `ActivityStack`:管理Task的状态(如前台栈、后台栈)。
- **启动模式处理**:
- **standard**:默认模式,每次启动新实例。
- **singleTop**:栈顶复用,触发`onNewIntent()`。
- **singleTask**:全局唯一实例,可能触发任务栈重建。
- **singleInstance**:独立任务栈,独占一个栈。
###### **2.2 多窗口模式**
- **分屏(Split-screen)**:
```java
// ActivityTaskManagerService.java
void setTaskWindowingMode(int taskId, int mode) {
final Task task = mRootWindowContainer.getTask(taskId);
task.setWindowingMode(mode); // 设置分屏模式(如WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)
mWindowOrganizerController.applyTransaction(null);
}
```
- **画中画(PIP)**:通过`ActivityRecord.setPictureInPictureArgs()`配置窗口大小和位置。
###### **2.3 Activity生命周期调度**
- **状态机**:
- 生命周期状态:`INITIALIZING` → `CREATED` → `STARTED` → `RESUMED` → `PAUSED` → ... → `DESTROYED`。
- 关键类:`TransactionExecutor`执行`ClientTransactionItem`(如`LaunchActivityItem`、`ResumeActivityItem`)。
---
#### **三、WMS(WindowManagerService)**
**职责**:窗口管理、布局计算、Surface分配、输入事件分发、动画处理。
---
##### **1. 源码路径**
- **核心类**:
- `frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java`
- `frameworks/base/core/java/android/view/WindowManagerGlobal.java`(客户端接口)
---
##### **2. 核心流程**
###### **2.1 窗口添加与移除**
- **窗口类型**:
- **应用窗口**(TYPE_APPLICATION):如Activity的主窗口。
- **系统窗口**(TYPE_SYSTEM_ALERT、TYPE_TOAST):悬浮窗、Toast等。
- **子窗口**(TYPE_APPLICATION_PANEL):必须依附于父窗口。
- **添加窗口流程**:
```java
// WindowManagerService.java
public int addWindow(Session session, IWindow client, LayoutParams attrs) {
WindowState win = new WindowState(this, session, client, attrs);
mWindowMap.put(client.asBinder(), win);
win.attach();
performLayoutAndPlaceSurfaces(); // 触发布局和Surface分配
return win.mSeq;
}
```
###### **2.2 布局计算(Layout)**
- **遍历窗口树**:`WindowContainer`递归计算所有窗口的位置和大小。
- **Z-Order排序**:根据窗口类型和`LayoutParams.zOrder`确定层级。
```java
// WindowState.java
void assignLayer(WindowList children) {
children.sort((w1, w2) -> {
return Integer.compare(w1.mBaseLayer, w2.mBaseLayer); // 按BaseLayer排序
});
}
```
###### **2.3 Surface管理**
- **Surface分配流程**:
```mermaid
graph TB
WMS--请求分配-->SurfaceFlinger
SurfaceFlinger--返回-->SurfaceControl
WMS--创建-->WindowStateAnimator
WindowStateAnimator--关联SurfaceControl-->Surface
```
###### **2.4 输入事件分发**
- **InputDispatcher**:
- 从`InputReader`读取事件,通过`InputChannel`发送到目标窗口。
- 焦点管理:`mCurrentFocus`记录当前焦点窗口,事件仅分发到焦点窗口。
---
#### **四、DMS(DisplayManagerService)**
**职责**:管理物理/虚拟显示设备、分辨率/刷新率配置、多屏协同。
---
##### **1. 源码路径**
- **核心类**:
- `frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java`
- `frameworks/base/core/java/android/hardware/display/DisplayManagerGlobal.java`(客户端接口)
---
##### **2. 核心流程**
###### **2.1 显示设备注册**
- **物理显示**:
- `LocalDisplayAdapter`通过`SurfaceFlinger`检测物理屏幕(如主屏、HDMI)。
- `LogicalDisplay`将物理设备抽象为逻辑显示(支持多屏扩展)。
- **虚拟显示**:
```java
// DisplayManagerService.java
public VirtualDisplay createVirtualDisplay(...) {
DisplayDevice device = mDisplayAdapter.createVirtualDisplay(...);
mLogicalDisplays.put(displayId, new LogicalDisplay(displayId, device));
return new VirtualDisplay(displayId);
}
```
###### **2.2 分辨率与刷新率**
- **配置切换**:
```java
// DisplayManagerService.java
public void setUserPreferredDisplayMode(int displayId, Display.Mode mode) {
mDisplayDeviceRepo.setUserPreferredMode(displayId, mode);
scheduleTraversal(); // 触发WMS重新布局
}
```
###### **2.3 多屏协同**
- **扩展显示**:通过`Presentation`类在副屏显示独立内容。
- **热插拔处理**:监听`UEvent`(如HDMI插拔),更新`LogicalDisplay`状态。
---
#### **五、服务协作流程示例:启动Activity**
```mermaid
sequenceDiagram
participant AMS
participant ATMS
participant WMS
participant DMS
participant SurfaceFlinger
AMS->>ATMS: startActivity(intent)
ATMS->>WMS: prepareWindow()
WMS->>DMS: getDisplayInfo(displayId)
DMS-->>WMS: DisplayInfo{width, height, density}
WMS->>SurfaceFlinger: createSurface()
SurfaceFlinger-->>WMS: SurfaceControl
WMS->>ATMS: onWindowPrepared()
ATMS->>ApplicationThread: scheduleLaunchActivity()
ApplicationThread->>ActivityThread: handleLaunchActivity()
ActivityThread->>WMS: addView() // 添加DecorView
WMS->>Choreographer: scheduleTraversal()
Choreographer->>SurfaceFlinger: commitBuffer() // 提交帧数据
```
---
#### **六、调试工具与命令**
1. **dumpsys命令**:
```bash
adb shell dumpsys activity activities # 查看ATMS任务栈
adb shell dumpsys window windows # 查看WMS窗口信息
adb shell dumpsys display # 查看DMS显示配置
adb shell dumpsys meminfo # 查看AMS内存状态
```
2. **Systrace标记**:
- **AMS**:`am_activity_launch_time`(Activity启动耗时)。
- **WMS**:`performLayoutAndPlaceSurfaces`(布局与Surface处理耗时)。
3. **源码断点示例**:
- **AMS进程创建**:`ProcessList.startProcessLocked()`。
- **WMS布局计算**:`WindowManagerService.performLayoutAndPlaceSurfaces()`。
---
#### **七、优化与问题定位**
1. **启动卡顿**:
- **AMS**:检查`startProcessLocked()`耗时,优化Zygote预加载。
- **WMS**:减少首帧布局的`measure/layout`次数,使用硬件加速。
2. **窗口闪烁**:
- **WMS**:分析`performLayoutAndPlaceSurfaces()`是否频繁触发。
- **DMS**:检查刷新率配置是否稳定(如是否启用可变刷新率)。
3. **多屏显示异常**:
- **DMS**:验证`LogicalDisplay`与实际物理设备的映射关系。
- **ATMS**:检查分屏模式下`ActivityStack`的`WindowingMode`是否正确。
---
#### **八、关键数据结构与类图**
```mermaid
classDiagram
class ActivityManagerService {
-mProcessList: ProcessList
-mServices: ActiveServices
+startActivity()
+bindService()
}
class ActivityTaskManagerService {
-mRootWindowContainer: RootWindowContainer
-mStackSupervisor: ActivityStackSupervisor
+startActivityViaWindowManager()
}
class WindowManagerService {
-mWindowMap: HashMap~IBinder, WindowState~
-mInputManager: InputManagerService
+addWindow()
+performLayoutAndPlaceSurfaces()
}
class DisplayManagerService {
-mDisplayAdapters: List~DisplayAdapter~
-mLogicalDisplays: SparseArray~LogicalDisplay~
+createVirtualDisplay()
}
AMS --> ATMS : 委托任务栈管理
ATMS --> WMS : 请求窗口操作
WMS --> DMS : 查询显示参数
```
---
通过深入源码级分析,可全面掌握四大服务的核心机制与协作关系,为性能优化和复杂问题排查提供坚实基础。