自动背光调节下亮度条无法到达最左端

文章目录

          • [DESCRIPTION]
          • [SOLUTION]
            • 1. 拿到背光曲线的配置表:
            • 2. 根据配置表去查看代码中背光曲线的mapping配置
            • 3. 复现问题,尝试dump PMS的信息
            • 4. 修复问题
          • [SUMMARY]

[DESCRIPTION]

根据测试描述和本地测试,复现步骤和现象如下:

  1. 用遮光板遮挡 L-sensor,亮度条无法到达最左端
  2. 手动滑动亮度条到最左端,再重复上一步骤,亮度条可以到最左端
  3. 恢复出厂设置,清除数据等操作均无法保证在 L-sensor 被遮挡时进度条到最左边
[SOLUTION]
1. 拿到背光曲线的配置表:

自动背光调节下亮度条无法到达最左端_第1张图片

2. 根据配置表去查看代码中背光曲线的mapping配置

xml中配置的mapping数组对应于上面表中的光照(Lux)和PWM_Level(TYP:350nit)两列.需要注意的是config_autoBrightnessLcdBacklightValues数组元素要比config_autoBrightnessLevels多一个

<integer-array name="config_autoBrightnessLevels">
        <item>5item>
        <item>30item>
        <item>50item>
        <item>100item>
        <item>150item>
        <item>200item>
        <item>350item>
        <item>450item>
        <item>550item>
        <item>700item>
        <item>950item>
        <item>1100item>
        <item>1500item>
        <item>2000item>
        <item>3500item>
        <item>5500item>
        <item>6500item>
    integer-array>

<integer-array name="config_autoBrightnessLcdBacklightValues">
        <item>5item>
        <item>5item>
        <item>43item>
        <item>73item>
        <item>87item>
        <item>122item>
        <item>122item>
        <item>122item>
        <item>122item>
        <item>122item>
        <item>182item>
        <item>182item>
        <item>223item>
        <item>255item>
        <item>255item>
        <item>255item>
        <item>255item>
        <item>255item>
    integer-array>

通过需求表和配置的mapping数组关系,没发现任何问题

3. 复现问题,尝试dump PMS的信息

除了使用dump PMS(PowerManagerService)还可以在代码中加log,查看亮度条变化到不同位置时候nit(光照强度)和 brightness(背光强度)之间的映射关系,通过对比实际打印出的mapping关系和xml配置的mapping关系作对比,看是否一致

通过dump PMS打印出的mapping关系对比,发现和xml配置的不一样。怀疑是xml配置位置的mapping关系并未overlay生效。
在项目源码搜索所有overlay该mapping数组的地方,找到了和dump出的mapping数据一致的overlay出的xml,在vendor下

对比了一下,发现问题根因:

最小背光
<integer name="config_screenBrightnessSettingMinimum">5integer>

最大背光
<integer name="config_screenBrightnessSettingMaximum">255integer>

framework下res的config中配置的config_screenBrightnessSettingMinimum为5,BSP配置的mapping表中的config_autoBrightnessLcdBacklightValues最小值为5,然而配置的xml是在device下面,通过编译时静态overlay去覆盖。而vendor下overlay的config_autoBrightnessLcdBacklightValues最小值为8,在nit值已经变到最小时,拟合的背光曲线上背光值为8,然而最小背光值config_screenBrightnessSettingMinimum为5,8>5导致无法到达配置的最小背光,亮度条也无法到达最左端。

究其根因,在于BSP同事在device下配置完成后,并未验证,而device下的overlay是静态overlay,而vendor下配置的mapping映射数组是动态overlay,优先级大于device,在运行时device下的配置并未生效,拟合的背光曲线还是用了vendor下错误的mapping数组,导致出现该问题

4. 修复问题

这个问题当时在使用Pixel原生机时也是必现,原因应该如出一辙。

当然,既然找到了原因,最终这个问题解决的方法也就很明了,将device下的配置的背光mapping映射数组的数据迁移到vendor下的mapping数组中,问题解决

[SUMMARY]

通过解决这个问题,了解了Android在背光曲线这块的逻辑,转载了一篇文章,写的挺好,大家有空可以看看,做个参考Android自动背光调节机制分析

你可能感兴趣的:(自动背光调节下亮度条无法到达最左端)