android网络耗电优化

一,减小网络功耗

应用程序的网络请求是造成电池耗尽的主要原因,因为他们打开耗电的移动数据或Wi-Fi无线电。除了发送和接收数据包所需的功率之外,这些无线电只要打开并保持清醒,就会消耗额外的功率。
每15秒一个简单的网络请求就可以使移动无线电持续不断地快速耗尽电池电量。
本课程将向您展示如何标记应用程序的源代码,根据它们的启动方式对网络请求进行分类,可视化和着色。
从那里,每个类别都可以确定您的应用程序的哪些区域可以提高电池使用效率。

二,性能优化

1,收集网络流量数据

应用程序生成的网络流量可能会对正在运行的设备的电池寿命产生重大影响。
为了优化流量,您需要测量并确定其来源。
网络请求可以直接来自用户操作,来自您自己的应用程序代码的请求或来自与您的应用程序通信的服务器。

网络流量工具Network Traffic tool(DDMS工具的一部分)使您能够查看应用程序如何以及何时通过网络传输数据。

本课程向您展示如何通过标记源代码来衡量和分类网络请求,然后向您展示如何部署,测试和可视化您的应用的网络流量。

标记网络请求

应用程序出于各种原因在设备上使用网络硬件。
为了正确优化应用程序对网络资源的使用,您必须了解您的应用程序使用网络的频率以及原因。
出于性能分析的目的,您应该将网络硬件的使用分为以下几类:
- 用户发起的网络请求 用户发起的请求,例如用户在新闻应用程序中请求更新的文章列表。
- app发起的网络请求 在Android应用程序代码中发起的请求不会立即满足用户的操作,例如在新闻应用程序中缓存未读文章的应用程序请求。
- 服务器发起的网络请求 服务器向您的应用程序发起的请求不是用来立即满足用户操作的,例如通知新闻应用程序中新近可用的文章。

此过程向您展示了如何使用常量标记应用程序的源代码,以将流量分类为这三种请求类型之一。“网络流量”工具代表不同颜色的每种类型的流量,因此您可以分别可视化和优化每个流量流。这里描述的技术根据您的应用程序中的线程执行情况报告网络流量,您将其识别为用户,应用程序或服务器源。

1,在您的应用程序的开发项目中,定义三个常量来表示不同类型的网络使用情况:

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED =0x3000;

2,通过搜索用于此目的的最常用的类,在您的应用程序中查找网络代码
a.In Android Studio, choose Edit > Find > Find in Path.
b.Paste the following string into the Text to find field:
extends GcmTaskService|extends JobService|extends AbstractThreadedSyncAdapter|HttpUrlConnection|Volley|Glide|HttpClient
c.Check Regular expression.
d.Check File mask(s) and type *.java.
e.Click the Find button.
3,根据在上一步中的发现,通过将setThreadStatsTag(int)方法添加到您的应用程序中使用网络资源的每个执行线程来标记您的应用程序对网络流量的使用,如以下代码示例所示。

if (BuildConfig.NETWORK-TEST && Build.VERSION.SDK_INT >= 14) {
    try {
        TrafficStats.setThreadStatsTag(USER_INITIATED);
        // make network request using HttpClient.execute()
    } finally {
        TrafficStats.clearThreadStatsTag();
    }
}

注意:根据用于生成APK的构建类型,通过包含此代码来确保标记不会进入生产代码。

在上面的示例中,BuildConfig.NETWORK-TEST字段将此APK标识为测试版本。

运行Network Traffic Tool

Android Studio中的“网络流量”工具可帮助您了解您的应用在运行时如何实时使用网络资源。
为了提高测试的可重复性,您应该通过清除应用程序数据来为应用程序启动一个已知的初始状态。以下过程包括一个步骤,向您显示如何清除所有应用程序数据,包括以前缓存的数据和网络数据。这一步使您的应用程序返回到必须重新缓存所有以前缓存的数据的状态。不要跳过此步骤。

启动“网络流量”工具并可视化网络请求:
1,通过启动Android Studio并选择Tools > Android > Android Device Monitor来启动网络流量工具。当提示时,允许传入的网络连接。
2,在“Android设备监视器”窗口中,单击顶部的“DDMS”按钮,然后选择“网络统计信息”选项卡。如果看不到此选项卡,则展开窗口,然后尝试“窗口”>“重置透视图”。
3,在设备选项卡中选择您的应用程序,从设备上的可调试应用程序列表中进行调试,然后单击网络统计选项卡中的开始按钮。

注意:您可能会提示您在设备上允许USB调试。选择确定以允许调试继续。

4,使用以下adb命令清除您的应用程序数据:

adb shell pm clear package.name.of.app

5,启动您的应用程序并运行一个测试计划,以执行您的应用程序的主要用例。您的计划还应允许应用程序空闲时间,用户不与应用程序进行交互,以允许应用程序发起的和服务器启动的网络访问发生。
6,通过清除应用程序数据并重新运行测试计划来重复测试。您应该重复测试几次来验证性能数据的可重复性。

对网络流量使用标记有助于您通过在“网络流量”工具中为每个网络流量生成不同的颜色来区分每个请求类别,如图所示。

2,分析网络流量数据

分析应用网络流量

应用程序对网络资源的有效使用的特点是网络硬件未被占用的重要时期。
在移动设备上,启动无线电发送或接收数据以及使移动无线电长时间保持活动的成本很高。如果您的应用程序正在有效地访问网络,您应该看到它通过网络进行的通信紧密地组合在一起,间隔时间很长,应用程序没有连接请求。

图1显示了由网络流量工具测量的来自应用程序的欠佳的网络流量。
该应用程序正在频繁的网络请求。
这种流量有很少的休息时间,无线电可以切换到备用,低功耗模式。
这个应用程序的网络访问行为很可能会使无线电长时间持续,这是电池效率低下的问题。

图2显示了一个最佳的网络流量模式。
应用程序以突发形式发送网络请求,由无线通信的长时间间隔分开,无线电可以切换到待机状态。
这个图表显示了与图1相同的工作量,但是请求已经被转移和分组以允许无线电在大部分时间处于待机状态。


如果您的应用的网络流量与图2中的图表类似,则表示状态良好!
恭喜!您可能希望通过检查优化通用网络使用中描述的技术来进一步提高联网效率。如果您的应用的网络流量看起来更像图1中的图表,那么现在是时候更加注意您的应用访问网络的方式了。
您应该首先分析您的应用正在生成的网络流量类型。

分析网络类型

在上一课中,您为不同的流量类型标记了您的应用程序代码,并使用“网络流量”工具收集应用程序中的数据并生成一个活动图,如下图所示。


“网络流量”工具根据您在上一课中创建的标签着色流量。
颜色基于您在应用程序代码中定义的流量类型常量。
请参阅您的应用程序代码,以确认哪些常量代表用户,应用程序或服务器启动的流量。

分析用户请求的网络流量

用户发起的网络活动可以在用户使用您的应用执行特定活动时有效地组合在一起,或者在用户请求获得您的应用所需的附加信息时不均匀分布。
您分析用户启动的网络流量的目标是查找频繁使用网络的模式,并尝试创建或增加网络未访问的时间段。

用户请求的不可预测性使得在您的应用中优化这种类型的网络使用具有挑战性。另外,用户在使用应用程序时期望得到快速响应,因此延迟对效率的要求会导致用户体验变差。一般来说,当用户直接与您的应用程序进行交互时,您应该优先考虑对用户进行快速响应,以便高效地使用网络。

以下是一些优化用户启动的网络流量的方法:
- 提前获取网络数据 - 当用户在您的应用中执行操作时,应用程序会预测下一个用户操作可能需要哪些数据,并在一个连接中批量提取,并持有该数据,直到用户请求为止。
- 监听网络变化 - 在执行更新之前检查网络连接性或侦听连接更改。
- 减少连接数量 - 让服务器的api允许批量下载数据

分析应用发起的网络流量

由您的应用程序代码启动的网络活动通常是您可以对有效使用网络带宽产生重大影响的领域。在分析您的应用程序的网络活动时,查找不活动的时间段并确定是否可以增加。如果您从应用程序中看到一致的网络访问模式,请查找方法来隔离这些访问,以允许设备无线电切换到低功耗模式。
以下是一些优化应用发起的网络流量的方法:
- 批量和计划网络请求 - 延迟您的应用程序的网络请求,以便它们可以一起处理,并有利于延长电池寿命。
- 允许系统检查连接 - 避免运行应用程序的电池成本而只是为了检查网络连接,当您的应用程序睡眠时让系统运行检查。

选择批处理和调度API:
Android为您的应用程序提供三种不同的API来批量和调度网络请求。
对于大多数操作,这些技术在功能上是等同的。
下表中列出了这些API,其中最推荐的是第一个。

分析服务器发起的网络流量

由与您的应用程序通信的服务器启动的网络活动通常也是您可以对高效使用网络带宽产生重大影响的领域。
在分析来自服务器连接的网络活动时,查找不活动的时间段并确定它们是否可以增加。如果您从服务器上看到一致的网络活动模式,请寻找方法来隔离此活动,以允许设备无线电切换到低功耗模式。
以下是优化应用发起的网络流量的方法:
Use GCM for Server Updates - Consider using the Google Cloud Messaging service for server side updates instead of polling.

3,常规网络优化

 数据压缩

  • GZIP
  • 使用 Protocol Buffers 或者 FlatBuffers

在本地进行缓存

优化预取缓存大小

根据本地文件系统大小和当前网络连接优化预取缓存大小。
您可以使用连接管理器来确定哪些类型的网络(Wi-Fi,LTE,HSPAP,EDGE,GPRS)处于活动状态,并修改预取例程以最大限度地减少电池负载。

你可能感兴趣的:(android)