一. 问题描述
1.1 现象
手机自动亮度失效,调节亮度条屏幕闪烁
1.2 JIRA
1.3 结论
1.android.hardware.light@2.0-service转换亮度值出问题,导致调节屏幕亮度异常
2.kernel设置的最大亮度值有问题,导致无法调大最大亮度
二. 问题分析
2.1 基础学习
在分析之前我们得大概知道自动亮度的流程整个流程,设置亮度主要通过slpi, android.hardware.sensors@1.0-service,system_server,android.hardware.light@2.0-service,kernel来五部分来共同完成。
1.slpi部分,这部分主要是光感循环读取数据,然后通过pb_send_sensor_stream_event/pb_send_event将数据发生给子系统,子系统最后会通过qmi接口将数据传给android.hardware.sensors@1.0-service。
2.android.hardware.sensors@1.0-service拿到数据后会继续传递给system_server. 这部分的具体传递过程这里就不说了,可以看一下我以前画的流程图:https://blog.youkuaiyun.com/aa787282301/article/details/84665319。
3.System_server是拿到sensor 传递过来的lux数据后会进行一系列的计算,然后得出当前的亮度值,传递给android.hardware.light@2.0-service进程。
4.android.hardware.light@2.0-service进程会把亮度值写到kernel的brightnes设备节点。
5.kernel拿到亮度值后,就去改变屏幕的亮度。
2.2 详细分析
2.2.1 闪烁问题分析
有了2.1的知识基础后我们也分进程来排查问题就好了:
1.slpi的排查可以直接在上传数据的时候打印出对应的lux值,然后看看是否符合预期,例如:
TCS3701_SPRINTF(LOW, sns_fw_printf, "TCS3701 pb_send_sensor_stream_event: lux: %f\n", report_data[0]);
pb_send_sensor_stream_event(instance,
&state->als_info.als_suid,
sns_get_system_time(),
SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_EVENT,
SNS_STD_SENSOR_SAMPLE_STATUS_ACCURACY_HIGH,
report_data,
ALS_EVENT_SIZE,
state->encoded_als_event_len);
然后我们直接用qxdm来看lux值是不是符合预期的,如果lux值是正确的,那我们就继续看其他进程。本节说的问题并不是tcs3701数据采集有问题,这里就不详细分析了。
2.android.hardware.sensors@1.0-service进程拿到slpi的数据后不会进过特别多的处理,会继续传递给system_server,一般情况下不会有问题。
3.system_server拿到值lux值后会做比较多的处理,过程比较复杂,我们直接看到最后,就是它要设置的亮度值:
private void setDisplayBrightness(int brightness) {
if (DEBUG) {
Slog.d(TAG, "setDisplayBrightness("
+ "id=" + displayId + ", brightness=" + brightness + ")");
}
Trace.traceBegin(Trace.TRACE_TAG_POWER, "setDisplayBrightness("
+ "id=" + displayId + ", brightness=" + brightness + ")");
try {
mBacklight.setBrightness(brightness);
Trace.traceCounter(Trace.TRACE_TAG_POWER,
"ScreenBrightness", brightness);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
}
这里是通过mBacklight.setBrightness(brightness)来进行设置亮度,我们将DEBUG改为true,然后用手电筒照射手机,看看这里的日志是否正常:
01-01 00:06:47.649 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=95)
01-01 00:06:47.679 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=81)
01-01 00:06:47.699 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=61)
01-01 00:06:47.726 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=52)
01-01 00:06:47.743 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=43)
01-01 00:06:47.770 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=36)
01-01 00:06:47.816 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=30)
01-01 00:06:47.836 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=28)
01-01 00:06:47.863 1517 2429 D LocalDisplayAdapter: setDisplayBrightness(id=0, brightness=27)
01-01 00:06:47.876 1517 2429 D LocalDisplayAdapter: setDisplayBr