Android 系统7.0上 屏幕背光流程分析

Android 系统 屏幕背光流程分析

  1. 概述
  2. 自动背光初始化
  3. 自动背光的初始化

概述

最近关于自动背光的问题报的比较多,多是背光不灵敏以及背光调节不正常的问题,并且自动背光也是直接和用户交互的一个模块,对于用户体验有着最直观的影响,所以在此分析一下关于自动背光模块的处理逻辑,以及小米对于自动背光所作的优化,关于后期优化方案,也希望大家能多多建议。

自动背光在android系统中属于display显示相关模块,具体是和Lights和Power交互较多,Power控制其亮屏,灭屏,暗屏以及自动背光设置开关等,Lights负责背光灯的背光亮度值的变化。

自动背光的初始化

自动背光的主要控制功能是DisplayPowerController和AutomaticBrightnessController两个类结合起来工作的。DisplayPowerController属于Display模块,其控制设备屏幕亮灭,背光,与Power关系非常紧密,前面亮屏流程已经讲过PowerManagerService与Display的交互过程,这里重点分析屏幕亮度的控制这方面的控制逻辑。其复杂程度尤以自动亮度最甚。

首先分析DisplayPowerController,其初始化是在DisplayManagerService中的

private final class LocalService extends DisplayManagerInternal {
   
        @Override
        public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
                SensorManager sensorManager) {
            synchronized (mSyncRoot) {
                DisplayBlanker blanker = new DisplayBlanker() {
                    @Override
                    public void requestDisplayState(int state, int brightness) {
                        // The order of operations is important for legacy reasons.
                        if (state == Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness);
                        }

                        callbacks.onDisplayStateChange(state);

                        if (state != Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness);
                        }
                    }
                };
                mDisplayPowerController = new DisplayPowerController(
                        mContext, callbacks, handler, sensorManager, blanker);
            }
        }
        ....

initPowerManagement() 这个方法其实还是比较重要的,在看过我之前亮屏流程的文章大概就会知道,在该方法会有两个重要作用:1.回调到PowerManagerService中设置屏幕显示状态与Power状态到底层。2.向LightService里面去设置屏幕背光;
现在看到该方法里面在初始化时候,创建了DisplayPowerController这个重要类的对象。那么我们来开始分析其构造函数:

              mAutomaticBrightnessController = new AutomaticBrightnessController(this,
                        handler.getLooper(), sensorManager, screenAutoBrightnessSpline,
                        lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
                        mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
                        brighteningLightDebounce, darkeningLightDebounce,
                        autoBrightnessResetAmbientLuxAfterWarmUp,
                        ambientLightHorizon, autoBrightnessAdjustmentMaxGamma);
构造函数中并没有特殊的一些功能,只能简单介绍一下其各个参数的大概作用:
mBatteryStat :设置屏幕亮度时候,更新电池电量计算
mSensorManager :获取Lsensor 来调节背光
mWindowManagerPolicy:亮屏时候调用到window绘制屏幕
mBlanker:亮屏以及设置背光时候调用到DisplayPowerState的中介类对象
mScreenBrightnessDozeConfig:Doze状态配置亮度
mScreenBrightnessDimConfig:暗屏状态屏幕配置亮度
mScreenBrightnessDarkConfig:黑屏状态屏幕配置亮度
mScreenBrightnessRangeMaximum :屏幕最大亮度
screenBrightnessRangeMinimum:屏幕最低亮度
mUseSoftwareAutoBrightnessConfig:是否支持自动亮度
lightSensorWarmUpTimeConfig:Lsensor启动时间 0
screenAutoBrightnessSpline :光照/背光 mapping 对应值
lightSensorRate:sensor采集数据频率 250
brighteningLightDebounce:变亮防抖时间 4000
darkeningLightDebounce:变暗防抖时间 8000
autoBrightnessResetAmbientLuxAfterWarmUp:当sensor启动时重置环境光照值
ambientLightHorizon:环境光照采集时间阈值 10000
autoBrightnessAdjustmentMaxGamma :最大gamma值
在这里我们看到了计算自动亮度的主要类AutomaticBrightnessController。后面我们可以详细说明该类是如何计算自动亮度,从华为,小米,OV厂商来看,基本很少有厂商直接按照原生设计来使用,因为原生设计在自动亮度模块的缺陷其实比较多,也并不是很人性化,后面我即将讲到

在初始化之后其实重点要说明两个参数:
screenAutoBrightnessSpline,可以看到该参数直接是通过方法createAutoBrightnessSpline()直接返回的一个Spline对象


 int[] lux = resources.getIntArray(
                    com.android.internal.R.array.config_autoBrightnessLevels);
int[] screenBrightness = resources.getIntArray(                    com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);

Spline screenAutoBrightnessS
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值