当前位置: 首页 > article >正文

### **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 : 查询显示参数
```

---

通过深入源码级分析,可全面掌握四大服务的核心机制与协作关系,为性能优化和复杂问题排查提供坚实基础。


http://www.kler.cn/a/570903.html

相关文章:

  • 注意力机制详解笔记 Attention is all I donot understand!
  • 机试题——通讯录合并
  • 基于值函数的强化学习算法之SARSA详解
  • 字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!
  • spark 常见操作命令
  • 【三.大模型实战应用篇】【7.自然语言转SQL升级版:更智能的查询生成】
  • 蓝队学习一
  • leetcode 138. 随机链表的复制
  • 基于Servlet + JSP 的药店管理系统
  • Elasticsearch简单学习
  • AcWing 蓝桥杯集训·每日一题2025·5439. 农夫约翰真的种地
  • 如何升级Python版本。以下是详细的步骤和注意事项:检查当前Python版本:在命令行或终端中输入以下命令来查看当前安装的Python版本: bash复制代
  • 5.Linux配置虚拟机
  • 机器学习-无监督学习总结
  • 【JavaEE】springMVC返回Http响应
  • java2025热点面试题之springmvc
  • RabbitMQ 学习路线与知识总结
  • C# Equals 和 ReferenceEquals 使用详解
  • 使用深度学习框架进行自动构音障碍严重程度分类
  • 游戏引擎学习第130天