基于Android R版本分析
DisplayManagerService
DisplayManagerService是负责Display管理的系统服务之一,还有一些其他功能,包括屏幕亮度调节也涉及到DMS,其继承了SystemServer,因此具有SystemService子类的共性,具有生命周期、由SystemServer启动、注册到系统服务中,通过Binder和其他组件进行交互等;
Package Name | Directory | Description | Example |
---|---|---|---|
android.hardware.display | /frameworks/base/core/java/android/hardware/display | 外部模块可访问没有@hide注释的类 | DisplayManager、DisplayManagerGlobal、...... |
android.view | /frameworks/base/core/java/android/view | 逻辑屏配置相关 | DisplayInfo、DisplayViewport、...... |
com.android.server.display | /frameworks/base/services/core/java/com/android/server/display | DMS核心,外部模块无权限直接访问 | DMS、DisplayDevice、...... |
Display 数据结构
Display
-
LogicalDisplay:代表逻辑显示屏,每一个physical display都会对应一个logical display;
-
DisplayDeviceInfo:DisplayDevice信息封装类,在创建DisplayDevice时会进行创建,与之对应的是Logical display的DisplayInfo;
-
DisplayInfo:LogicalDisplay信息的封装类,基本数据由DisplayDeviceInfo获取,app可以通过WMS来修改自己的参数;
-
DisplayAdapterListener:用于通知DisplayDevice发生变化的接口,DMS中对其进行了实现,会接收以下三个事件并根据事件作出全局反应:
- DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED:添加了新的DisplayDevice;
- DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED:DisplayDevice状态发生变化;
- DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED:移除DisplayDevice。
DisplayAdapter:DisplayManagerService所依赖的集合组件,其为系统显示,收集并发现物理显示设备提供了适配器的作用;
- LocalDisplayAdapter: 继承于DisplayAdapter, 用于LocalDisplayDevice和DMS的连接;
- WifiDisplayAdapter: 继承于DisplayAdapter,用于WifiDisplayDevice的和DMS的连接;
- OverlayDisplayAdapter:继承于DisplayAdapter,用于OverlayDisplayDevice和DMS的连接;
- VirtualDisplayAdapter:继承于DisplayAdapter,用于VirtualDisplayDevice和DMS的连接;
DisplayDevice:代表physical display;
- LocalDisplayDevice:DisplayDevice的子类,代表内置物理屏幕,DMS启动后会通过SurfaceControl去读取内置屏幕数据,并创建该类对象;
- WifiDisplayDevice:DisplayDevice的子类,代表通过Wifi连接显示的物理屏幕;
- OverlayDisplayDevice:DisplayDevice的子类,开发者选项 -> 模拟辅助显示开启后,创建的就是该类对象;
- VirtualDisplayDevice:DisplayDevice的子类,表示虚拟显示屏幕,用于屏幕录制等;
DMS 启动
创建 DisplayAdapter & LocalDisplayDevice
通知DMS完成 Physical Display
DisplayAdapter中是通过回调的方式来通知DMS的,回调接口类是DisplayAdapter.Listener,DMS中对其进行了实现,并在实例化LocalDisplayAdapter时作为参数传入;
DisplayContent 创建
每一个Display实例对应一个DisplayContent实例;