欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

使用网络流量工具收集网络流量数据

网络流量工具已弃用。如果您使用的是 Android Studio 3.0 或更高版本,则应使用 Network Profiler 检查您的应用通过网络传输数据的方式和时间。

应用产生的网络流量会对运行应用的设备的电池续航时间产生重大影响。为了优化该流量,您需要对其进行测量并确定其来源。网络请求可能直接来自用户操作,来自您自己的应用代码的请求,或者来自与您的应用通信的服务器。

您可以通过网络流量工具(DDMS 工具的一部分)查看应用通过网络传输数据的方式和时间。

本节课向您介绍如何通过标记源代码对网络请求进行测量和分类,然后介绍如何部署、测试和可视化应用的网络流量。

标记网络请求

应用会出于多种原因使用设备上的网络硬件。要正确优化应用对网络资源的使用,您必须了解应用使用网络的频率及其原因。为了进行性能分析,您应该将网络硬件的使用细分为以下几类:

  • 用户发起的网络请求 - 用户发起的请求,例如用户请求新闻应用中的更新报道列表。
  • 应用发起的网络请求 - 在 Android 应用代码内发起并且不用于立即满足用户操作的请求,例如应用请求在新闻应用中缓存未读报道文本。
  • 服务器发起的网络请求 - 服务器向应用发出的不用于立即满足用户操作的请求,例如关于新闻应用中有新报道的通知。

以下过程将向您演示如何使用常量标记应用的源代码,以便将流量归类为上述三种请求类型之一。网络流量工具用不同颜色表示每种类型的流量,因此您可以分别可视化和优化每种流量数据流。本文介绍的方法会根据应用中您标识为用户、应用或服务器来源的线程执行来报告网络流量。

  1. 在应用开发项目中,定义三个常量来表示不同类型的网络使用行为:

    Kotlin

        const val USER_INITIATED: Int = 0x1000
        const val APP_INITIATED: Int = 0x2000
        const val SERVER_INITIATED: Int = 0x3000
        

    Java

        public static final int USER_INITIATED = 0x1000;
        public static final int APP_INITIATED = 0x2000;
        public static final int SERVER_INITIATED =0x3000;
        
  2. 查找应用中的网络代码,具体的操作是搜索具有此用途的最常用类:
    1. 在 Android Studio 中,依次选择 Edit > Find > Find in Path
    2. 将以下字符串粘贴到 Text to find 字段中:
      extends GcmTaskService|extends JobService|extends AbstractThreadedSyncAdapter|HttpUrlConnection|Volley|Glide|HttpClient
    3. 勾选 Regular expression
    4. 勾选 File mask(s) 并输入 *.java
    5. 点击 Find 按钮。
  3. 根据您在上一步中的结果,向应用中使用网络资源的每个执行线程添加 setThreadStatsTag(int) 方法,以标记应用对网络流量的使用行为,如下面的代码示例所示。

    Kotlin

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

    Java

        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 标识为测试版本。

注意:这种对来自您的应用的网络流量进行标记的方法取决于您使用的 API 访问和管理网络套接字的方式。某些网络库可能不允许 TrafficStats 实用程序标记来自您的应用的流量。

要详细了解如何使用网络流量工具标记和跟踪网络流量,请参阅 DDMS 中的详细网络使用情况

配置网络测试编译类型

运行性能测试时,您的 APK 应尽可能接近正式版。要在网络测试中实现这一点,请创建 network-test 编译类型,而不要使用 debug 编译类型。

  1. 在 Android Studio 中打开您的应用。
  2. 通过修改项目的 build.gradle 文件为您的网络测试创建可调试的编译类型,如以下代码示例所示:
        android {
            ...
            buildTypes {
                debug {
                    // debuggable true is default for the debug buildType
                }
                network-test {
                    debuggable true
                }
            }
            ...
        }
        

部署网络测试 APK

要部署由上一步中配置的 network-test 编译类型生成的 APK,请执行以下操作:

  1. 检查测试设备是否启用了开发者选项。有关如何勾选和启用此选项的信息,请参阅使用硬件设备
  2. 使用 USB 线将测试设备连接到开发计算机。
  3. 在 Android Studio 中,选择窗口左边的 Build Variants
  4. 点击 Sync Project with Gradle Files 按钮,在 Build Variants 列表中填充应用模块的 network-test
  5. 从列表中选择 network-test
  6. 依次选择 Run > Debug,将应用的可调试版本部署到您的设备上。

运行 Network Traffic 工具

Android Studio 中的 Network Traffic 工具可帮助您实时了解应用如何在运行期间使用网络资源。

要提高测试的可重复性,您应清除应用数据,从应用的已知初始状态开始。以下过程中的一个步骤介绍了如何清除所有应用数据,包括以前缓存的数据和网络数据。此步骤会将您的应用恢复为初始状态,此时应用必须重新缓存之前缓存的所有数据。请不要跳过该步骤。

要启动 Network Traffic 工具并可视化网络请求,请执行以下操作:

  1. 要启动 Network Traffic 工具,请启动 Android Studio 并启动 Android Device Monitor。 系统询问时,允许传入的网络连接。
  2. 在 Android Device Monitor 窗口中,点击顶部的 DDMS 按钮,然后选择 Network Statistics 标签。如果您没有看到此标签,请拓宽窗口,然后依次选择 Window > Reset Perspective
  3. Devices 标签中,从设备上的可调试应用列表中选择要调试的应用,然后点击 Network Statistics 标签中的 Start 按钮。

    注意:系统可能会提示您在设备上 Allow USB Debugging。选择 OK 以允许继续进行调试。

  4. 使用以下 adb 命令清除您的应用数据:
        adb shell pm clear package.name.of.app
        
  5. 启动您的应用并运行针对应用的主要用例的测试计划。测试计划还应留出应用空闲时间(即用户不与应用互动的时间),以便发生应用发起和服务器发起的网络访问。
  6. 清除应用数据并重新运行测试计划,以重复测试。您应重复测试几次,以验证性能数据的可重复性。

标记网络流量会在 Network Traffic 工具中用不同的颜色标注每种网络流量,有助于直观地区分每个请求类别,如图 1 所示。

图 1. 针对三个类别标记的网络流量。