S01E01 Understanding Battery Drain on Android
在电气工程领域,硬件从电池获得电能并执行任务的过程,称为放电。
在同一时间段里,你设备的动作消耗电量可能不同,消耗方式也可能不同。例如,Nexus 5在飞行模式,待机时长多达一个月。但是在实际使用时,待机时间远小于此。
那么,App的那些任务消耗了设备最多的电量?
此问题并不容易回答,在硬件层级上对电量消耗进行监视是不可行的,因为运行监控设备会导致额外的电量消耗。因此大多数设备并未这样做。
实际的做法是,在Android设备上附加第三方硬件(独立供电,不需消耗手机电源)。
Nexus 5在待机模式时,实际上耗电量并不大。
当手机被唤醒并且屏幕点亮时,我们可以在电量监控里看到巨大的涨幅。
(打开LED屏幕,屏幕绘制,然后CPU工作,GPU按要求绘制屏幕等操作)
这与App唤醒设备完全不同,如果通过Wakelock、alarm manager、Job Scheduler的API。如果设备处于sleep状态被上述API唤醒,你会首先看到电量消耗的小高峰,随即,会有一点电量消耗用于执行任务。需要指出的是,一旦工作结束,设备立刻会回到sleep状态。
设备进入Sleep状态非常重要,这会显著减少电量消耗。如果设备未能成功进入Sleep状态,电量将迅速耗尽。
当手机在移动网络中时,每当设备试图通过移动网络发送数据时,首先,设备唤醒产生一个急速的耗电高峰;随后,发送一个部署包并接收一个数据包,会较高值的耗电高峰;由于手机网络的请求价格昂贵,所以硬件会在任务结束之后短期保持awake状态,以备更多的数据包从网络发送过来。
伴随着Android L的发布,我们有一系列的工具可以帮助开发者优化App的电池消耗。
首先,用户可以在设备上查看单个App的电量消耗的详细数据,依次打开 Settings-Battery,选择App后,可以查看此App保持手机wake状态的时间,执行联网任务的时间。
其次,Google发布了全新的工具Battery Historian。它可以协助你观察App使用周期内的电量消耗,Battery Historian可为每个任务创建timeline,能很快观察出App某些动作的频次,如App打开移动网络的频率。这能为优化App电量消耗提供明确的目标。