DisplayManagerService启动及主屏添加-Android13
- 1、DisplayManagerService启动
- 1.1 简要时序图
- 2、DEFAULT_DISPLAY主屏幕添加
- 2.1 物理屏热插拔监听
- 2.2 物理屏信息
- 3、默认屏幕亮度
1、DisplayManagerService启动
1.1 简要时序图
代码位置:frameworks/base/services/core/java/com/android/server/display
frameworks/native/services/displayservice
frameworks/native/services/surfaceflinger
1、多屏幕相关:DisplayDeviceRepository.java、LogicalDisplayMapper.java、LocalDisplayAdapter.java、DisplayEventReceiver.java
屏幕类型 静态屏幕标识符 相关类 本地 local:<stable-id> LocalDisplayAdapter.java 网络 network:<mac-address> WifiDisplayAdapter.java 虚拟 virtual:<package-name-and-name> VirtualDisplayAdapter.java 叠加 overlay:<number> OverlayDisplayAdapter.java,开发者选项中模拟辅助显示设备开启
2、屏幕亮度相关:BrightnessSynchronizer.java
2、DEFAULT_DISPLAY主屏幕添加
AOSP > 文档 > 核心主题 > 显示屏支持
在 Android 11 中, 启动期间报告的第一个屏幕是主屏幕。这与连接类型是内部还是外部并不相关。 不过,主屏幕是不能断开连接的,由此可见,实际操作中的主屏幕必须是内部屏幕。请注意,一些可折叠手机有多个内部屏幕。
辅助屏幕已正确分类为Display.TYPE_INTERNAL
或Display.TYPE_EXTERNAL
(以前分别称为 Display.TYPE_BUILT_IN 和 Display.TYPE_HDMI),具体取决于连接类型。
在 Android 9 及更低版本中,屏幕使用 32 位 ID 表示,其中 0 表示内部屏幕,1 表示外部屏幕,[2, INT32_MAX] 表示 HWC 虚拟屏幕,而 -1 表示无效屏幕或非 HWC 虚拟屏幕。
从 Android 10 开始,屏幕会获得稳定持久的 ID,从而使 SurfaceFlinger 和 DisplayManagerService 可以跟踪两个以上的屏幕并识别以前看到的屏幕。如果 HWC 支持 IComposerClient.getDisplayIdentificationData 并提供屏幕标识数据,SurfaceFlinger 将会解析 EDID 结构并为物理屏幕和 HWC 虚拟屏幕分配稳定的 64 位屏幕 ID。系统会使用选项类型表示 ID,其中 null 值表示无效屏幕或非 HWC 虚拟屏幕。如果 HWC 不支持,SurfaceFlinger 会回退到最多只存在两个物理屏幕的旧版行为。
2.1 物理屏热插拔监听
1、启动注册 LocalDisplayAdapter.registerLocked 时查看添加
tryConnectDisplayLocked(physicalDisplayId)
2、DisplayEventReceiver
监听添加屏幕tryConnectDisplayLocked(physicalDisplayId)
:
- DisplayEventListener监听注册流程
LocalDisplayAdapter.java#mInjector.setDisplayEventListenerLocked(getHandler().getLooper(), new LocalDisplayEventListener()) > DisplayEventReceiver.java#nativeInit > android_view_DisplayEventReceiver.cpp::nativeInit > DisplayEventDispatcher.cpp::mReceiver > DisplayEventReceiver.cpp::mEventConnection > SurfaceFlinger.cpp::createDisplayEventConnection > Scheduler.cpp::createDisplayEventConnection > EventThread.cpp::createEventConnection > new EventThreadConnection
- DisplayEventReceiver监听接受流程
HWC::onHotplug > SurfaceFlinger.cpp::dispatchDisplayHotplugEvent > Scheduler.cpp::onHotplugReceived > EventThread.cpp::onHotplugReceived > EventThread::threadMain > EventThread::dispatchEvent > EventThreadConnection::postEvent > DisplayEventReceiver.cpp::sendEvents > gui::BitTube::sendObjects(dataChannel, events, count) > ==LooperCallback== DisplayEventDispatcher.cpp::handleEvent > DisplayEventDispatcher::processPendingEvents > android_view_DisplayEventReceiver.cpp::NativeDisplayEventReceiver::dispatchHotplug > LocalDisplayAdapter.java#ProxyDisplayEventReceiver#onHotplug > LocalDisplayEventListener#onHotplug > LocalDisplayAdapter.java#tryConnectDisplayLocked