android自动亮度失效问题调查

本文详细探讨了Android设备自动亮度失效的问题,包括屏幕闪烁和亮度调节限制。问题出现在android.hardware.light@2.0-service转换亮度值及kernel设置的最大亮度值。通过日志分析,发现宏定义错误导致闪烁,而kernel中的最大亮度限制导致亮度调节受限。解决方案是修改宏定义和kernel配置,以恢复正常亮度控制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 问题描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值