Android 系统 屏幕背光流程分析
- 概述
- 自动背光初始化
- 自动背光的初始化
概述
最近关于自动背光的问题报的比较多,多是背光不灵敏以及背光调节不正常的问题,并且自动背光也是直接和用户交互的一个模块,对于用户体验有着最直观的影响,所以在此分析一下关于自动背光模块的处理逻辑,以及小米对于自动背光所作的优化,关于后期优化方案,也希望大家能多多建议。
自动背光在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