Android 5.1调节背光流程
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
https://mp.csdn.net/mdeditor/99670972
目录
1、启动相关服务(PMS,LightService,DMS)
2、背光修改Code执行流程
3、背光调整框架图
4、如何通过log分析设备界面背光调节无效问题
具体分析
1、启动相关服务(PMS,LightService,DMS)
1.1 主机开机,在启动SystemServer进程时,会启动电源和背光等相关服务;
启动PMS服务之后,里面调用AMS的initPowerManager,完成初始化设定。
1.2 主机开启启动引导服务之后,会继续启动系统核心服务,如LightServuce、BatteryService;
1.3 启动PMS服务之后,最终会执行SystemReady(),获取LocalService,并从settings数据库中读取默认的背光亮度值。
1.3.1 获取相关服务对象,用于控制向底层发送上层设置的背光参数值;
1.3.2 从framework/base/core目录下的资源文件中,获取系统默认的背光亮度值,其中包括最大和最小默认值。
1.4 获取本地LightService对象mLightsManager,以及底层需要控制的背光类型。其中在SystemReady()当中,会初始化settingsObserver,用于监听数据库当中背光亮度值的改变。
1.5 其中mSettingsObserver会监听数据库当中当前亮度的背光值。当数据库当中的背光亮度值改变之后,都会回调handleSettingsChangedLocked(),最终update电源状态;
1.6 执行initPowerManagerment()接口,并传递相应的参数。
1.7 DisplayManagerInternal为抽象类,必须要有子类去继承实现它定义的接口;
1.7.1 在初始化过程中,创建mDisplayPowerController对象,该对象主要传递从PMS下传的request对象,该对象包含了此时上层设置的背光亮度值;
1.7.2 其中requestPowerState接口主要提供给PMS调用,当电源状态改变之后,PMS最终会调用该接口,向MCU发送对于的spi消息,进而控制背光亮度;
至此,主机开启服务流程到此结束,主要初始化相关参数,搭建背光调节整体框架。
2、背光修改Code执行流程
1、当在原生设置界面点击亮度调节按钮,或滑动背光调节slider时,上层应用会设置数据库中的亮度背光值。
2、当数据库当中的背光亮度值改变之后,最终会在PMS当中注册的SettingsObserver当中监听到该变化。
3、updateSettingsLocked()主要从数据库中读取当前背光的亮度值;获取当前的亮度模式(自动or手动); 将获取之后的亮度值与之前的的做对比,判读当前的亮度值是否发送改变。
- 将从数据库当中读取的背光亮度值保存再定义的全部变量mScreenBrightnessSetting当中;
*该变量最终会填充request对象,并最终由PMS将该对象传递到DisplayPowerState中。
4、updatePowerStateLocked() 该接口主要处理电源状态,比较复杂,这里暂不讲解,如有兴趣,可以查看下源码。 最终会调用到updateDisplayPowerStateLocked()。
5、该接口处理当前的背光亮度值,其中还存在是否包含亮度自动调节问题。 - 该接口中,会判断之前保证的亮度值是否有效。正常的亮度取值未(0-255)
- 填充mDisplayPowerRequest对象,并将该对象通过调用mDisplayManagerInternal.requestPowerState(mDisplayPowerState)传递到DisplayManagerState当中。
6、DisplayManagerService当中的内部类继承实现了DisplayManagerInternal这个抽象类,并且将PMS传递的request对象继续传递到DisplayPowerController对象中。
7、DisplayPowerController.requestPowerState - 发送当前背光改变的Handler消息:MSG_UPDATE_POWER_STATE,并在内部定义的Handler当前去处理。
- DisplayPowerController.updatePowerState。其中RampAnimator为泛型,最终会根据这里传递的参数,重新初始化object和property。
- 最终会调用animaTo(target ,rate) —>mProperty.setValue(mObject ,target) —>
DisplayPowerState–>setValue(obj, value) —>obj–> setScreenBrightness(value)
其中,mProperty为DisplayPowerState
8、 - 开机执行initialize()并创建mScreenBrightnessRamAnimator对象,初始化DisplayPowerState对象,并传递mPowerState和DPS.SCREEN_BRIGHTNESS;
- 初始化成功之后,获取系统设置的亮度背光值,然后调用animateScreenBrightness(brightness, rate);
- 最终会调用到泛型的RampAnimator文件中的animateTo(target,rate)接口;
- 最终会调用到DPS.setScreenBrightness,并且向Handler发送Runable消息,并执行run方法,将brightness传递到mPhotonicModulator对象中,
9 、其中PhotonicModulator为DSP内部类,从DisplayPowerState的构造方法可知会创建一个PhontoinModulator,并调用其start方法,可知其继承与Thread。查看其run可知,最终会调用run中的setBrightness接口。
3、背光调整框架图 (后续更新)
4、如何通过log分析设备界面背光调节无效问题
- 调节背光时,使用select语句查看数据库当中的screen_brightness字段值是否发生改变;
- 查看PowerManagerService当中的updateDisplayPowerStateLocked()方法,查看screenBrightness的值是否发生改变,需要注意此处有一个Math函数,决定是否要传递上层设置的亮度值,
screenBrightness = Math.max(Math.min(screenBrightness,
mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum) - 数据库操作命令:
update system set value=‘25’ where name=‘screen_brightness’;
select * from system where name=’%ness%’
.tables 查看当前数据库中的表。