- 整体框架
Android SurfaceFlinger中Display部分
Android Framework 中Display 部分
--DisplayManagerService对display的管理
--WindowManagerService对Display的管理
Android系统转屏问题
Android SurfaceFlinger中的Display部分
SurfaceFlinger用于获取显示屏相关信息。
SurfaceFlinger用HWC机制处理display信息。HWC是Android新版本引入的新模块,可能是替换掉早期的OverLayer机制,提供出全新的使用硬件合成的功能。
HWComposer_hwc1.cpp类中queryDisplayProperties方法用于查询显示屏的相关的参数,如显示屏宽度高度刷新率、是否连接等等。显示屏的相关参数保留在mDisplayData[disp]变量中。
Android Framework 中Display 部分
DisplayManagerService
DisplayManagerService用于拿到已经存在的显示屏相关信息。
DisplayManagerService由systemserver启动,在其onStart函数中会发送MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER消息;这个消息会被registerDefaultDisplayAdapter函数处理,用于创建LocalDisplayAdapter对象,在adapter对象的registerLocked函数中,系统会去尝试连接两种显示屏幕,built in(默认屏,如手机中默认的MIPI屏)跟HDMI(扩展屏),tryConnectDisplayLocked主要用于从SurfaceFlinger(getDisplayConfigs) 中获取显示屏的所有支持的配置参数及正在使用的参数,并且创建并配置新的LocalDisplayDevice对象,然后通过DISPLAY_DEVICE_EVENT_ADDED消息告知DMS有新的显示设备添加;DMS(addLogicalDisplayLocked)会去处理该消息,并且会去创建一个新的LogicalDisplay
在最开始,LogicalDisplay会使用与LocalDisplayDevice同样的显示屏配置信息。同时会为这个LogicalDisplay设备分配displayId 与layerStack,sf会把相同layerStack值的图层composer在一起,丢给display去显示。
LocalDisplayDevice是真实存在,是一块实实在在的显示设备,不可改变,有具体的宽度,高度等信息。LogicalDisplay是表象,是能够依托于LocalDisplayDevice,并且能更改的。
LocalDisplayDevice类的configureDisplayInTransactionLocked方法,可以控制屏幕旋转。把orientation变量强制设为指定值,即可实现。
- 全屏问题
PhoneWindowManager类的rotationForOrientationLw方法,强制返回1,可以全屏;否则,非全屏显示。
- 旋转问题
LogicalDisplay。LogicalDisplay是界于真实显示设备相关类(DisplayDevice)与WMS中抽象的显示类(DisplayInfo)中间的类。
LogicalDisplay类中的configureDisplayInTransactionLocked方法用于控制设备信息的旋转角度及宽高。修改其中的orientation变量值,即可控制旋转方向。