待机电流问题处理,分为无法待机和待机电流平均值高两种情况,请分类参考
一、 无法进入待机的情况
1:能够明显的查看到wakelock的存在
cat /sys/power/wake_lock 或者 dumpsys power均可查看wakelock状态,一般情况下可以根据wakelock的名称来定位阻塞待机流程的模块。例如:“PowerManagerService.wakelock”
这种锁是客户端申请用来阻塞CPU进入休眠的,此种情况也是导致无法休眠的主要原因。ACC OFF时没有及时的释放wakelock资源,我们自己开发的应用以及服务收到ACC OFF状态后需要完成处理逻辑后释放wakelock,第三方应用需要我们强制停止他们的运行,因为它们不遵循我们的ACC逻辑。第三方应用造成无法待机的情况也是最多的。
“GPS” GPS模块正在工作,无法进入休眠。需要ACC OFF时GPS是否有正常关闭“PowerManagerService.Display”
显示屏工作状态,无法进入休眠,正常的android系统不会出现这种问题,yunos修改过powermanagerservice逻辑,有可能出现此种情况。
2:通过查看wakelock节点,无法查看到wakelock的存在
此种情况不能直观的查看到问题的所在,需要飞串口查看系统LOG来分析定位问题的所在
Logcat -s PowerManagerService 可以查看当前系统申请/释放wakelock的信息
如果应用或者服务不停的申请/释放wakelock会出现节点中无法看到wakelock的存在,但是系统就是不能进入休眠状态。这时候可以用上面的LOG来定位问题,根据wakelock名称可以定位大概的问题所在,如果是APP直接申请的wakelock可以根据名称直接确定是APP的问题,但是如果是通过Binder调用的方式产生的wakelock,还需要分析全局LOG来确定是哪个APP产生的并且配合用KILL进程方式来确定。如果还不能确定问题所在,只能在powermanagerservice服务的NATIVE层中添加LOG,打印调用者的PID(IPCThreadState::self->getCallingPid())来分析, 多数的情况可能还是要分析全局log看分析问题。
二、待机电流平均值高的情况
此种情况下,设备是能够正常进入待机状态的,但是由于某些外部的因素导致设备频繁唤醒或者进入待机低电流时间过长,而引起的平均电流值过高的的问题
1:进入低电流状态时间过长
出现此种现象的时候,多数情况下都是MODEM引起,这个时候CPU一般都是休眠了(通过串口无法输入或者通过串口查看log),MODEM进入低电流模式有自己的工作方式,特别是4G信号状态下花费的时间比较长。
2:频繁唤醒
APP设置了alarm导致设备唤醒:
Logcat -s AlarmManager 可以查看alarm唤醒系统的信息 只有RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP 两种类型的alarm可以在待机状态下唤醒系统
Modem接收到服务器推送或者基站数据导致设备唤醒:
通过log可以看到是中断唤醒的系统,可以在log中过滤interrupt字段查询,Modem接收到数据后会通过中断唤醒CPU。当然,如果是基站数据唤醒的系统,我们是无法控制的。
3:通过dumpsys power 来查看是否有电源锁
4:待机电流下不来的原因:
1、查看force_usb_device是否设置为1,待机状态下force_usb_device=1才对,路径/sys/class/KT0806/KT0806/
force_usb_device