Android原生调节屏幕背光流程

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 查看当前数据库中的表。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值