在生产版本跑老化时出现sensor项全部失败的问题,重启后概率性恢复。
老化通过framework接口getDefaultSensor获取,如果返回值为null,则该项失败,确认是sensor问题。
通过导出android log,搜索关键字num_sensors
发现num_sensors=0
,sensor没有挂载上,重启后概率恢复。
出现该情况时,终端输入
dumpsys sensorservice
出现下述打印:
No Sensors on the device
devInitCheck : 0
通常情况下,当system boot起来时,首先start sensors-hal 然后start sensorservice,在start sensorservice时get_sensors_list。
但是当问题发生时,sensors-hal 没起来(ap log里没有相关init部分),只有sensorservice start,所以 get sensor list 是 0。是时序出现问题了。
进行以下尝试
1. 尝试延长sensorservice启动时间。
修改sensorservice启动时间,参考路径
vendor/qcom/proprietary / sensors-see/sensors-hal/framework/sensor_factory.cpp
static const int MANDATORY_SENSOR_WAIT_TIME_SEC = 20;
压测,失败。
2. 怀疑sensor在hal层未起来,然而hal层无log,需要进行场景复现。
增加hal层初始化的相关log打印,更改老化apk使其在首次测试失败时停止测试。
在场景复现的时候,进行如下操作:
ps -ef |grep sensor
找到sensor hidl的pid,kill掉后查看log,发现hal层是有相关初始化的,但是kill掉后再dumpsys sensorservice 还是为0。
绕过hal层使能acc以及其他器件,即执行命令
adb shell ssc_drva_test -sensor=accel -duration=20 -sample_rate=100
全部pass,表明adsp侧sensor已经起来了。
3. 将sensor service.rc从1.0改为2.0
修改vendor/xxx/libhardware/sensors/1.0/vendor.xxx.hardware.sensors@1.0-service.rc
group system wakelock input
capabilities BLOCK_SUSPEND
rlimit rtprio 10 10
压测,失败。
4.提高开机时sensor服务启动的优先级
修改vendor/xxx/libhardware/sensors/1.0/vendor.xxx.hardware.sensors@1.0-service.rc
class main
压测pass。
后续
将class main
改为class core
后会出现另一种sensor挂载不上的情况:刷版本后(同一版本)小概率会挂载不上,重启不会恢复正常,重刷版本会恢复正常。该情况下,persist/sensors/sensors_list.txt里边只有一个resampler
,绕过hal层使能acc,即执行命令
adb shell ssc_drva_test -sensor=accel -duration=20 -sample_rate=100
若pass则表明adsp侧sensor已经起来了,修改为class main
后挂测不再复现,但问题根因未知。
根因知晓后将更新该篇文章。