文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

电池和网络数据消耗是移动应用的开发者们需要面对的两大核心问题。 在移动技术中这一点尤其受到重视,因为智能手机的资源比较有限。在这边文章里我将把重点放在这两方面:电池续航的增加和网络数据的减少。 我将通过一些例子和技巧,说明如何节省电池消耗,并保持最低的网络流量消耗。

优化电池续航

耗费大部分电池电量的硬件部件是CPU、传感器和屏幕。其中传感器包括全球定位系统、 NFC、蓝牙等。

第 1 段(可获 1.2 积分)

在心中牢记这些,能够为开发者在开发中需要关注的要点轻松提供参考。把CPU使用、无线收发、网络操作尽可能缩减到最低的工作,在很多情况下实施起来确实有难度,但是为了制作出最顶级的优质应用,应该认真实行。

在以下的章节里,我会谈及几个对续航有影响的方面。 我会提到几个减小电池消耗的小技巧。

小心使用动画

显然动画需要CPU的重度处理,显然会耗费大量电量。根据Android开发文档, 绝大部分动画每秒30帧看起来就流畅了,所以让动画的帧率超过30帧是一种浪费CPU资源和电能的行为。

第 2 段(可获 1.78 积分)

文档里提及的另一个要点是让CPU在播放动画的间隔期进入休眠状态,原因是持续不断的动态画面播放会连续刷新设备的屏幕。我之前就已经提到,屏幕是主要的耗电设备。

来自本作者的更多文章

图像资源

在屏幕上渲染大尺寸的位图也会导致大的电量消耗。在屏幕上显示图像是不可避免的,不过不要使用过大的图像元素。

第 3 段(可获 1.34 积分)

如果Bitmap Assets 具有可以被裁切掉的透明像素,那就裁掉它们。裁掉不必要的像素 对提高性能和省电有帮助。

小心使用WakeLock

一个应用不仅仅是在它显示在屏幕上、接受用户交互时需要运行操作, 有些应用在手机处于睡眠状态时也需要执行一些操作<tasks>,但是在(真正的)<sleeping>状态下这些操作无法被运行。

为了让手机在<sleeping>状态下也可以运行操作,应用需要唤醒屏幕,这样就需要用到 WakeLocks

第 4 段(可获 1.34 积分)

WakeLocks 可以用来保持屏幕和CPU开启. WakeLocks的一个常见的例子是手游和视频播放程序在用户不操作它们的时候也保持开启。但是如果对WakeLocks使用不当, 设备会一直保持(不必要)的开启,浪费电量和资源。
请跟随这些规则和指示来正确使用WakeLocks。Android Developers官方文档.

电池优化策略

应用中的一些能够推迟的不太重要的任务可以推迟到充电时进行。将这些任务推迟到充电时进行对电池续航时间显然没有影响。

通常,这样的推迟适用于背景任务<background tasks>,例如对某些网络服务的数据同步。

第 5 段(可获 1.75 积分)

对于这些可以推迟的任务,Google推出的JobScheduler API是一个很好的解决方案。 这个API专为优化背景任务开发,通过将背景任务和其他应用的任务安排在一起进行来提高能效。如果你的app需要执行重度的任务,可以考虑一下使用这个API。

高效的网络通讯和电池续航的关系

我已经说了很多影响电池续航的因素,但是这些因素对续航的影响全都比不过网络操作,网络是坠耗电的,从网络操作中省电是很有必要的。

第 6 段(可获 1.36 积分)

要了解网络操作和电量的消耗的联系,我们必须首先理解网络操作是怎么使用系统资源的。网络操作通过无线收发器<Radio>进行,包括WiFi、3G或4G收发器。

为了节省能源,Android系统不会让这些收发器运行在最大功率状态, 否则电池续航将会快速减少。 为了验证这一点,先看下3G无线收发器的不同状态。

Radio States

  • 全功率 -网络收发器活跃运行,存在一些网络操作正在执行。
  • 低功率 - 使用一半电池电量的中间状态。
  • 待机 - 没有网络操作,电池消耗低。
第 7 段(可获 1.36 积分)

当一个设备没有网络操作任务的时候, 控制无线收发器的状态机会转入低功耗和待机状态来大大减小电量消耗。当网络连接建立之后,系统将无线收发器转入全功率运转模式。根据 Android Developers 官方文档, 无线收发器在使用时会一直保持全功率状态;使用完毕后全功率状态的保持时间<tail time>是5秒,其后保持12秒的低功耗状态,直到最终进入待机状态。

假设一个网络状态的操作需要1秒钟(大部分情况下确实是这样),为了完成1秒的网络操作,设备需要耗电18秒。你看,真是极大的浪费。

第 8 段(可获 1.68 积分)

在本文章的其余部分,我会提供一些有关网络操作省电的小建议和明智的方法。

批量/捆绑连接

之前说过,一个单独的网络连接要耗电18秒,实在是浪费。

如果把所有的网络连接操作捆绑在一起,一个紧跟另一个进行操作呢?显然,在这种情况下,无线收发器就不必因为单独的网络操作而在唤醒和休眠状态之间反复切换了,而是一直保持在唤醒状态,完成所有操作后进入待机模式。

第 9 段(可获 1.21 积分)

用脚趾头都能算出来,相比起进行单个操作需要18秒的耗电,进行一次捆绑的连续网络操作,无线收发器保持唤醒状态的时间要短得多了。

问题是网络操作要捆绑在一起,在无线收发器全功率运行的窗口时间执行。不是所有的网络操作的需求都能够拖后的。像这样捆绑网络操作的方式对于后台任务更有效率,JobScheduler API可以帮助优化后台任务的网络操作。JobScheduler API将来自于很多app的任务编组,来达到极大优化的资源占用率。

第 10 段(可获 1.2 积分)

预取数据

大部分情况下,预测用户在app里要做什么、将会需要什么数据存在难度。 但是如果有办法预测,尽可能将要用到的数据预取是个好主意,可以避免不必要的请求。


举个栗子, 如果你开发了一款带有缓存功能的音乐播放app,提前缓存下一首要播放的音乐就是个好主意,因为用户很可能会接着播放下一首歌嘛。

广告是消耗电能的一个因素

移动广告是很多app开发者的主要收入来源,但是广告是消耗电能的一个重要因素。广告需要占用网络资源和系统资源来显示彩色图片,甚至是视频。广告显示大量内容需要消耗大量网络带宽,结果就是消耗大量电量。

第 11 段(可获 1.78 积分)

广告可是最常见的app开发者赚钱的渠道之一,我可没有说不让你在移动app里放广告,但是可以不要太激进地依赖广告。在节约电量和得到收入之间的平衡的一个好办法是在你的应用里只放(适当的)几处广告。

用监视工具来分析电池消耗

为了更好地明晰电池消耗的因素,你需要一个工具来监视app的状态。 Android Studio 自带了一个监视工具,可以分析app的资源消耗。

根据上文提到的网络操作策略,你可以分析网络操作到底给电池电量消耗带来什么影响。下面的图片显示了好的和差的网络策略在network tasks里看起来是什么样的。

第 12 段(可获 1.63 积分)

一个很好的例子—— 对各种网络指标进行分组
Good example

Bad example
Bad example

第二张图片里显示的断断续续的网络操作显然体现了差的网络操作策略。

电池统计图工具(Battery historian)

Battery historian 是Google提供的另一个有用工具,它可以根据Android bug report 文件提供电池使用的分析。它能提供一个总体、详细的显示图表,可以显示哪个进程<processes>在消耗Android设备的电池电量。


下面的图表是Battery historian工具监视电池使用的一个示范。

battery-historian/

Battery Historian 是开源的,可以从GitHub上获取。

第 13 段(可获 1.09 积分)

总结

如果你正在构建一个需要大量的资源的大型应用,其中最关键的优化因素之一是对电池的优化。

我希望这篇文章里提到的这些提示技巧和指南,能在网络操作和电池优化方面给你提供一些参考,启发你找到关注点。

第 14 段(可获 0.71 积分)

文章评论