优化网络访问

使用无线电传输数据可能是您的应用消耗电池电量最多的来源之一。为了最大程度地减少与网络活动相关的电量消耗,了解您的连接模型将如何影响底层无线电硬件至关重要。

本部分介绍了无线电状态机,并解释了您的应用的连接模型如何与其互动。然后,本部分提供了几种技术,遵循这些技术将有助于最大程度地减少应用数据消耗对电池的影响。

无线电状态机

用户设备上的无线电具有内置的省电功能,有助于最大程度地减少其消耗的电池电量。完全激活时,无线电消耗大量电量,但在不活动或待机状态下,无线电消耗的电量非常少。

一个需要记住的重要因素是,无线电无法立即从待机状态完全激活。与“启动”无线电相关联的延迟时间。因此,电池会缓慢地从较高能量状态转换为较低能量状态,以便在不使用时节省电量,同时尝试最大程度地减少与“启动”无线电相关的延迟。

典型的 3G 网络无线电的状态机包含三种能量状态

  • 全功率:在连接活动时使用,允许设备以最高速率传输数据。
  • 低功率:中间状态,将电池电量消耗降低约 50%。
  • 待机:消耗电量最少的状态,在此状态下没有网络连接处于活动状态。

尽管低功耗和待机状态消耗的电池电量明显减少,但它们也给网络请求带来了显著的延迟。从低功耗状态恢复到全功率状态需要大约 1.5 秒,而从待机状态切换到全功率状态可能需要超过 2 秒。

为了最大程度地减少延迟,状态机使用延迟来推迟向较低能量状态的转换。图 1 使用了 AT&T 针对典型 3G 无线电的时序。


图 1. 典型的 3G 无线电状态机。

每台设备上的无线电状态机,特别是相关的转换延迟(“尾部时间”)和启动延迟,将根据所采用的无线电技术(3G、LTE、5G 等)而有所不同,并由设备运行所在的运营商网络定义和配置。

本页面描述了基于 AT&T 提供的数据的典型 3G 无线电的代表性状态机。但是,一般原则和由此产生的最佳实践适用于所有无线电实现。

这种方法对于典型的移动网页浏览特别有效,因为它可以在用户浏览网页时防止不必要的延迟。相对较低的尾部时间也确保了一旦浏览会话结束,无线电就可以进入较低的能量状态。

不幸的是,这种方法可能导致现代智能手机操作系统(如 Android)上的应用效率低下,因为应用在前台(延迟很重要)和后台(应优先考虑电池续航时间)都会运行。

应用如何影响无线电状态机

每次创建新的网络连接时,无线电都会转换为全功率状态。对于前面描述的典型 3G 无线电状态机,它将在传输期间保持全功率状态,外加 5 秒的尾部时间,然后进入低能量状态 12 秒。因此,对于典型的 3G 设备,每次数据传输会话都会导致无线电至少消耗 18 秒的电量。

实际上,这意味着一个每分钟执行三次一秒数据传输的应用将使无线电持续保持活动状态,在刚进入待机模式时就将其恢复到高功率状态。


图 2. 每分钟运行三次一秒传输的无线电相对功耗。图中不包括运行之间的“启动”延迟。

相比之下,如果同一个应用捆绑其数据传输,每分钟运行一次三秒的传输,这将使无线电每分钟总共只保持高功率状态 20 秒。这将使无线电每分钟有 40 秒处于待机状态,从而显著降低电池消耗。


图 3. 每分钟运行一次三秒传输的无线电相对功耗。

优化技术

既然您了解了网络访问如何影响电池续航时间,接下来让我们讨论一些有助于减少电池消耗,同时提供快速流畅用户体验的方法。

捆绑数据传输

如上一节所述,捆绑数据传输,以便更少次地传输更多数据,是提高电池效率的最佳方法之一。

当然,如果您的应用需要立即响应用户操作来接收或发送数据,这并不总是可行。您可以通过预测和预取数据来缓解此问题。其他场景,例如向服务器发送日志或分析数据,以及其他非紧急的应用启动的数据传输,非常适合进行批处理和捆绑。有关安排后台网络传输的提示,请参阅优化应用启动的任务

预取数据

预取数据是另一种有效方法,可以减少应用运行的独立数据传输会话数量。通过预取,当用户在您的应用中执行操作时,应用会预测下一系列用户操作最可能需要哪些数据,并在单个突发、通过单个连接、以全容量的方式获取这些数据。

通过预先加载传输,您可以减少下载数据所需的无线电激活次数。因此,您不仅可以节省电池续航时间,还可以提高延迟、降低所需的带宽并缩短下载时间。

预取还可以通过最大程度地减少等待下载完成才能执行操作或查看数据而导致的应用内延迟,从而改善用户体验。

下面是一个实际示例。

新闻阅读器

许多新闻应用试图通过以下方式减少带宽:仅在选择类别后下载头条新闻,仅在用户想要阅读时下载全文,以及仅在缩略图滚动到视野中时下载它们。

使用这种方法,无线电在用户滚动头条新闻、更改类别和阅读文章的大部分新闻阅读会话期间被迫保持活动状态。不仅如此,能量状态之间的不断切换会导致在切换类别或阅读文章时出现显著延迟。

更好的方法是在启动时预取合理数量的数据,首先是第一组新闻头条和缩略图,这确保了低延迟的启动时间,然后继续预取其余头条新闻和缩略图,以及至少来自主要头条新闻列表的每篇文章的文章文本。

另一种替代方案是预取所有头条新闻、缩略图、文章文本,甚至可能包括完整的文章图片,通常是在后台按预定时间表进行。这种方法存在消耗大量带宽和电池续航时间下载从未使用过的内容的风险,因此应谨慎实施。

额外注意事项

虽然预取数据有很多好处,但过度积极地使用预取也会带来增加电池消耗和带宽使用(以及下载配额)的风险,因为会下载未被使用的数据。同样重要的是要确保预取不会在应用等待预取完成时延迟应用启动。实际上,这可能意味着逐步处理数据,或者以优先顺序启动连续传输,以便先下载和处理应用启动所需的数据。

预取数据的积极程度取决于下载数据的大小以及数据被使用的可能性。根据前面描述的状态机,作为一个大致的指导,对于在当前用户会话中有 50% 几率被使用的数据,您通常可以预取大约 6 秒(大约 1-2 兆字节)的数据,之后下载未使用数据的潜在成本就会与不下载该数据的潜在节省相匹配。

一般来说,最好预取数据,以便您每 2 到 5 分钟才需要发起一次下载,且下载量约为 1 到 5 兆字节。

遵循此原则,大型下载(例如视频文件)应按固定间隔(每 2 到 5 分钟)分块下载,这样可以有效地只预取接下来几分钟内可能观看的视频数据。

一种解决方案是仅在连接到 Wi-Fi 时(可能仅在设备充电时)安排完整下载。 WorkManager API 正好支持这种用例,允许您限制后台工作,直到设备满足开发者指定的条件,例如充电和连接到 Wi-Fi。

在发出请求前检查连接性

搜索蜂窝信号是移动设备上最耗电的操作之一。对于用户发起的请求,最佳实践是首先使用 ConnectivityManager 检查连接,如监控连接状态和连接流量所示。如果没有网络,应用可以通过不强制无线电搜索来节省电池电量。然后可以在建立连接时将请求与其他请求一起安排和批量执行。

连接池

除了批处理和预取之外,还有一种可以帮助优化的策略,即连接池化应用的 network connection。

重用现有网络连接通常比启动新连接更有效。重用连接还允许网络更智能地应对拥塞和相关的网络数据问题。

HttpURLConnection 和大多数 HTTP 客户端(例如 OkHttp)默认启用连接池,并对多个请求重用同一连接。

总结和展望

在本节中,您了解了大量关于无线电的知识以及一些可以广泛应用于提供快速、响应式用户体验同时减少电池消耗的策略。

在下一节中,我们将详细介绍大多数应用共有的三种不同类型的网络互动。您将了解每种类型的驱动因素以及有效管理这些互动的新技术和 API。