# WindowManagerService架构

WindowManagerService（WMS）是Android窗口系统的核心服务，负责管理所有窗口的创建、显示、布局和交互。本文深入分析WMS的架构设计、工作原理和关键实现。

## WMS系统架构概览

```mermaid
graph TB
    subgraph "客户端层"
        A1[Activity] --> A2[ViewRootImpl]
        A2 --> A3[WindowManagerGlobal]
        A3 --> A4[IWindowSession]
    end
    
    subgraph "服务端层"
        B1[WindowManagerService] --> B2[WindowState]
        B2 --> B3[DisplayContent]
        B3 --> B4[WindowToken]
        
        B1 --> B5[InputManagerService]
        B1 --> B6[SurfaceFlinger]
        B1 --> B7[ActivityManagerService]
    end
    
    subgraph "显示层"
        C1[SurfaceControl] --> C2[SurfaceFlinger]
        C2 --> C3[显示设备]
    end
    
    A4 --> B1
    B2 --> C1
```

## 1. WMS核心组件

### 1.1 WindowManagerService
- **窗口管理**：管理所有窗口的生命周期
- **布局计算**：计算窗口的位置和大小
- **输入分发**：将输入事件分发给目标窗口
- **动画处理**：管理窗口动画

### 1.2 WindowState
- **窗口状态**：表示一个窗口的当前状态
- **窗口属性**：存储窗口的LayoutParams等属性
- **Surface控制**：管理窗口的Surface
- **父子关系**：维护窗口的父子关系

### 1.3 DisplayContent
- **显示内容**：管理一个显示设备上的所有窗口
- **窗口栈**：维护窗口的Z-Order顺序
- **显示配置**：管理显示设备的分辨率、方向等

## 2. 窗口管理机制

### 2.1 窗口添加流程
```java
// WMS添加窗口的关键流程
public int addWindow(Session session, IWindow client, ...) {
    // 1. 权限检查
    if (!checkCallingPermission(...)) {
        return WindowManagerGlobal.ADD_PERMISSION_DENIED;
    }
    
    // 2. 创建WindowState
    WindowState win = new WindowState(...);
    
    // 3. 添加到对应DisplayContent
    DisplayContent displayContent = getDisplayContent(displayId);
    displayContent.addWindow(win);
    
    // 4. 创建Surface
    win.createSurfaceControl();
    
    // 5. 更新布局
    performLayoutAndPlaceSurfacesLocked();
    
    return WindowManagerGlobal.ADD_OKAY;
}
```

### 2.2 窗口移除流程
```java
// WMS移除窗口的关键流程
public void removeWindow(Session session, IWindow client) {
    // 1. 查找WindowState
    WindowState win = windowForClientLocked(session, client);
    if (win == null) {
        return;
    }
    
    // 2. 从DisplayContent移除
    win.mDisplayContent.removeWindow(win);
    
    // 3. 销毁Surface
    win.destroySurface();
    
    // 4. 清理资源
    win.dispose();
    
    // 5. 更新布局
    performLayoutAndPlaceSurfacesLocked();
}
```

## 3. 布局计算机制

### 3.1 布局流程
```java
// WMS布局计算流程
void performLayoutAndPlaceSurfacesLocked() {
    // 1. 遍历所有DisplayContent
    for (DisplayContent displayContent : mDisplayContents) {
        // 2. 计算窗口位置和大小
        displayContent.computeScreenConfiguration();
        
        // 3. 应用窗口策略
        applyWindowPolicy(displayContent);
        
        // 4. 分配Surface位置
        assignWindowLayers(displayContent);
        
        // 5. 更新Surface
        updateSurfaces(displayContent);
    }
}
```

### 3.2 窗口策略
- **系统窗口策略**：状态栏、导航栏等系统窗口
- **应用窗口策略**：Activity窗口、对话框等
- **输入法策略**：软键盘窗口的位置和大小
- **多窗口策略**：分屏、画中画等模式

## 4. 输入事件分发

### 4.1 事件接收
- **InputDispatcher**：接收来自InputManagerService的事件
- **窗口查找**：根据事件坐标查找目标窗口
- **焦点管理**：管理当前获得焦点的窗口

### 4.2 事件传递
```java
// WMS事件分发关键代码
boolean dispatchPointerEvent(PointerEvent event) {
    // 1. 查找目标窗口
    WindowState targetWindow = findTouchedWindow(event);
    
    // 2. 检查窗口是否可接收输入
    if (!targetWindow.canReceiveKeys()) {
        return false;
    }
    
    // 3. 将事件传递给目标窗口
    targetWindow.dispatchPointerEvent(event);
    
    // 4. 更新焦点窗口
    updateFocusedWindow(targetWindow);
    
    return true;
}
```

## 5. 动画系统

### 5.1 窗口动画类型
- **进入动画**：窗口显示时的动画
- **退出动画**：窗口隐藏时的动画
- **Activity切换动画**：Activity切换时的动画
- **过渡动画**：窗口状态变化时的动画

### 5.2 动画执行流程
```java
// WMS动画执行流程
void applyAnimationLocked(WindowState win, int transit) {
    // 1. 获取动画资源
    Animation animation = loadAnimation(win, transit);
    
    // 2. 创建动画控制器
    win.mAnimator = new WindowStateAnimator(win);
    
    // 3. 设置动画
    win.mAnimator.setAnimation(animation);
    
    // 4. 启动动画
    win.mAnimator.startAnimation();
    
    // 5. 调度动画更新
    scheduleAnimationLocked();
}
```

## 6. 多显示支持

### 6.1 显示设备管理
- **主显示**：设备内置主屏幕
- **外接显示**：通过HDMI、USB-C等连接
- **虚拟显示**：用于录屏、投屏等场景

### 6.2 多显示窗口管理
```java
// 多显示窗口管理
class DisplayContent {
    // 显示设备ID
    final int mDisplayId;
    
    // 该显示设备上的所有窗口
    final WindowList mWindows = new WindowList();
    
    // 窗口栈管理
    final Stack<WindowState> mWindowStack = new Stack<>();
    
    // 显示配置
    DisplayInfo mDisplayInfo;
    
    // 添加窗口到该显示设备
    void addWindow(WindowState win) {
        mWindows.add(win);
        updateWindowOrder();
    }
}
```

## 7. 性能优化

### 7.1 布局优化
- **增量布局**：只更新变化的窗口布局
- **布局缓存**：缓存布局计算结果
- **异步布局**：非关键布局异步执行

### 7.2 内存优化
- **窗口复用**：复用相同类型的窗口对象
- **资源释放**：及时释放不再使用的资源
- **内存监控**：监控窗口系统内存使用

### 7.3 响应优化
- **事件合并**：合并连续的输入事件
- **异步处理**：耗时操作异步执行
- **优先级调度**：根据窗口优先级调度处理

## 8. 调试与问题排查

### 8.1 调试工具
```bash
# 查看所有窗口信息
adb shell dumpsys window windows

# 查看窗口动画信息
adb shell dumpsys window animator

# 查看输入事件信息
adb shell dumpsys input

# 查看焦点窗口
adb shell dumpsys window | grep -A 10 "FocusedWindow"

# 性能分析
adb shell dumpsys window | grep -A 20 "Window #"
```

### 8.2 常见问题
- **窗口泄漏**：窗口未正确移除
- **布局错误**：窗口位置或大小计算错误
- **焦点混乱**：焦点窗口不正确
- **动画卡顿**：窗口动画执行不流畅
- **内存溢出**：窗口系统占用过多内存

### 8.3 问题排查步骤
1. **收集信息**：使用dumpsys命令收集窗口状态
2. **分析日志**：查看系统日志中的窗口相关错误
3. **重现问题**：在开发环境中重现问题
4. **代码分析**：分析相关代码逻辑
5. **性能分析**：使用性能分析工具定位瓶颈

## 总结

WindowManagerService是Android窗口系统的核心：
- **窗口管理**：统一管理所有窗口的生命周期
- **布局计算**：负责窗口位置和大小的计算
- **输入分发**：将输入事件正确分发给目标窗口
- **动画处理**：管理窗口的显示和隐藏动画
- **多显示支持**：支持多个显示设备的窗口管理

深入理解WindowManagerService架构，对于优化界面性能、排查窗口问题和设计复杂窗口交互具有重要意义。