Android原生调节屏幕背光流程

news/2024/9/23 4:28:58/

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 查看当前数据库中的表。

http://www.ppmy.cn/news/871323.html

相关文章

数字脉冲调光(用于手机或平板电脑等设备的背光调节原理)

数字脉冲调光是一种利用脉冲个数的不同来实现背光调节的 调光方法,此种方法占用一个普通的GPIO口,调光时通过向 背光IC的EN端口发送相应个数的脉冲来实现相应阶数的背光调 节,一般有16阶可调,所发脉冲要满足IC相应的要求。 下图为…

android修改自动背光,android 背光控制

echo 23 > /sys/devices/platform/atmel_lcdfb.0/backlight/backlight/brightness android 源代码 http://blog.chinaunix.net/u1/49742/showart_2077813.html android 知识总结 http://www.limodev.cn/ Android 背光的控制: 屏幕背光设置 packages/apps/Setting…

android lcd 背光控制流程

此文章是网上看到的,在MTK平台基础上的背光控制流程的分析。个人觉得写得比较详细,于是截取部分内容转载出来。 不过话说在前头,对于lcd而言,决定显示效果的有几个因素:pwm,gama(屏幕灰度&#…

LCD背光驱动 --Backlight

显示屏按其显示原理大致可分为CRT(显像管)、LCD(液晶)及OLED三类,从市场应用看,手机中使用的显示屏主流是LCD,OLED只在翻盖机的小屏中占有少量份额,而CRT在手机中没有用到。 LCD本身不会发光,要想让其显示所要数…

Android Q自动背光曲线调节

诺基亚客户对背光曲线有很明确需求,因此就将系统的背光曲线部分看了下,现将这个流程总结出来。 一,概念明确 背光的调节有与光相关的概念,需要首先明确下,后面我们会用到这些概念。 1,环境光:是…

android关闭背光

android关闭背光 Android11方法1(可能关不完还是会有点亮):方法2(这个涉及系统权限):2.1调试:2.2处理问题:2.2.1 处理核心代码2.2.2 验证 遇到问题2.2.3 验证 遇到问题检查要操作文件…

Android屏幕背光调整机制

扩展一个硬件(比如LED、蓝牙、传感器等),至少需要硬件、驱动、驱动交互模块。至于系统的层面如何把系统库加入自己的体系里面去,就是操作系统自己的事了。这里分析一下以背光调整为例Android。 源码在这里:http://code…

Android背光系统实现

(一)Lights应用层 SystemUI——系统应用,其主要功能:状态栏信息显示、通知面板、截图/壁纸/屏保服务等; 代码: packages/apps/Settings/src/com/android/settings/BrightnessPreference.java frameworks/…