android 耗电优化剖析

现在智能手机的耗电量问题影响着大家的使用,对于我们“爪机党”来说,应用程序后台耗电更是不能容忍。最近发现手机即时飞行、后台服务基本全部停止还是比较耗电,一晚上20%左右,最终发现罪魁祸首是微信、墨迹、evernote等软件。OK,现在从技术角度讲解一下Android中的电源管理。

1. Android休眠状态会耗电吗?
一般情况下,Android手机进入休眠态之后(一般按下power键锁屏会进入,有特殊情况,后面讲到),手机的CPU会把时钟断掉,也就是cpu会完全停止,但是rtc模块、modem都还在后台运行着,另外ddr也会自动刷新,也就是说内存里的数据是不会丢失的。当再次按下电源键或者闹钟、电话到来时,cpu接收中断请求,会被唤醒,重新恢复现场,执行睡眠时的程序。
在休眠状态下,板级电流是很小的。

2. 为什么QQ、音乐播放时会比较耗电呢?
一方面QQ等软件由于需要联网,wifi、gprs都会耗费比较多的电流,另外还有一个重要的原因是此时CPU并没有休眠,Android中使用wake_lock来防止CPU进行休眠。比如qq、音乐等播放时,Android会往/sys/power/wake_lock设备节点写入PowerManagerService等字符串,用以防止CPU休眠,大家可以通过查看此节点看看后台有没有软件写入了wake_lock锁,如果有的话,那手机就不会休眠啦,肯定很耗电。

3. 由于rtc等模块会唤醒手机,而Android提供了编程接口,可以让应用程序在某段时间以后唤醒手机执行一定操作,比如微信会一分钟唤醒手机一次,这样产生的结果就是手机会频繁被唤醒,当然睡觉睡不好喽,因此即使你把后台服务关掉,飞行模式打开还是会照样耗电。
检查方法是在手机上运行bugreport命令,可以看看有一个叫做Alarm的Service,就是它会管理这种周期唤醒CPU的应用。可以看到下图

可以看到,google服务框架会在5天22个小时27分钟之后唤醒手机。

总结:网络,屏幕亮度会影响耗电量,另外不要忘了其实获取到wake_lock的应用程序、周期唤醒cpu的程序可能会是耗电大户哦,我发现的微信、墨迹天气、evernote等软件会周期唤醒cpu,它们都是为了通过网络进行数据更新,墨迹天气、evernote都提供了相应设置来禁止自动同步,但是微信设计比较垃圾,即使退出之后,cpu还会周期唤醒。