某一时刻某个场景下
我们有时候需要在某一特定场景下查看某个sensor被什么apk调用。
比如在sim卡热插拔时,发现acc被唤醒(软件排查发现:依次去掉每个sensor器件的编译),这会导致在sim卡热插拔后功耗过高。
再比如在停止计步时,发现acc上报数据的频率变快,这会导致停止计步后待机底电流过高。
某个sensor
就像上边的例子,我们首先得确认是哪个sensor导致的功耗过高。
一个最直接且有效的方法就是,在编译sensor驱动的地方去掉该sensor的编译,依次进行排查。
(有时候注释掉这个sensor可能会导致所有的sensor挂载不上的情况,所以建议最好直接删除后出固件再push到机器中)
寻找对应的上层apk
这时候我们需要场景复现。在特定场景下,进行如下操作。
1
2adb shell dumpsys sensorservice
adb shell dumpsys sensorservice
显示所有注册的传感器,如果注册了wake up sensor
,可以在这里看到它
需要知道的一点是,如果注册了accel wake up sensor, 设备几乎不会进入休眠状态.
此外,如果注册了某个wakeup sensor(比如motion detect sensor), 在对应时间点的 sensor-hal log 里会报告该sensor的event
在Mode : NORMAL
部分找到对应的sensor被什么package调用,比如:
1
2
3
4
5Connection Number: 9 Operating Mode: NORMAL fm333 | WakeLockRefCount 0 | uid 1000 | cache size 0 | max cache size 0 pedometer_wrist Non-wakeup 0x00000005 | status: active | pending flush events 0
可以看到是包 fm333 调用了计步(计步是调用acc的)。
在Previous Registrations
部分找到对应的pid,比如:
1
2
302:26:17 + 0x00000014 pid= 1653 uid= 1000 package=fm333 samplingPeriod=-1474836us batchingPeriod=0us 02:26:17 + 0x00000005 pid= 1653 uid= 1000 package=fm333 samplingPeriod=1000000us batchingPeriod=0us
可以看到pid= 1653。
这时候,我们再执行
1
2adb shell ps -A | grep 1653
可以看到:
1
2system 1653 445 844944 44096 SyS_epoll_wait 0 S com.xxxxxx.wearable.sport
可以看到是com.xxxxxx.wearable.sport在调用计步。
查找对应的apk:
1
2pm list package -f | grep "sport"
可以看到:
1
2package:/system/priv-app/Sport/Sport.apk=com.xxxxxx.wearable.sport
这样我们就找到了调用该sensor的上层apk以及其对应的路径。
最后
以上就是长情柚子最近收集整理的关于[Android][sensor]确认sensor唤醒源:查看某一时刻\某个场景下,某个sensor被哪个上层apk调用某一时刻\某个场景下某个sensor寻找对应的上层apk的全部内容,更多相关[Android][sensor]确认sensor唤醒源:查看某一时刻\某个场景下,某个sensor被哪个上层apk调用某一时刻\某个场景下某个sensor寻找对应内容请搜索靠谱客的其他文章。
发表评论 取消回复