简单的说,当用户按power键,使得手机进入灭屏休眠状态,Android系统其实是做了前面说的一些工作:关闭屏幕、触摸屏、传感器、dump当前用户态和内核态程序运行上下文到内存或者硬盘、关闭CPU供电,当然为了支持语音通讯,modern等蜂窝信令还是工作的。 这种情况下,应用要唤醒CPU,只有两种可能: a)通过服务器主动PUSH数据,通过网络设备激活CPU; b)设置alarm硬件闹钟唤醒CPU; 这里我们重点分析第二种情况。首先来看看什么是alarm硬件闹钟。Google官方提供的解释是:Android提供的alarm services可以帮助应用开发者能够在将来某一指定的时刻去执行任务。当时间到达的时候,Android系统会通过一个Intent广播通知应用去完成这一指定任务。即便CPU休眠,也不影响alarm services的服务,这种情况下可以选择唤醒CPU。 显然唤醒CPU是有电量消耗的,CPU被唤醒的次数越多,耗电量会越大。现在很多应用为了维持心跳、拉取数据、主动PUSH会不同程度地注册alarm服务,导致Android系统被频繁唤醒。这就是为什么雷军说Android手机在安装了TOP100的应用后,待机时间会大大缩短的重要原因。 比较简单评测CPU唤醒次数的方法是看dumpsys alarm,这里会详细记录从开机到当前的各个进程和服务唤醒CPU的次数和时间。通过对比唤醒次数和唤醒时间可以帮助我们分析后台进程和服务的耗电情况。Dumpsys alarm的输出看起来像这样: 其中544代表唤醒次数,38684ms代表唤醒时间。更详细的alarm services相关资料请参考Google官方定义: http://developer.android.com/reference/android/app/AlarmManager.html 4)Wake locks持有时间过长会导致耗电增加: Wake locks是一种锁机制,有些文献翻译成唤醒锁。简单说,前面讲的灭屏CPU休眠还需要做一个判断,就是看是否还有任何应用持有wake locks。如果有,CPU将不会休眠。有些应用不合理地申请wake locks,或者申请了忘记释放,都会导致手机无法休眠,耗电增加。 关于wake locks的网络文章也比较多,也可以参考Google官方文献: http://developer.android.com/reference/android/os/PowerManager.WakeLock.html 原始数据: 测试方法:硬件设备提供稳压电源替代手机电池供电,在不同场景下记录手机平均电流。 测试设备:Monsoon公司的Power Monitor TRMT000141 测试机型: |