排查网络问题

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

本主题介绍了如何监控网络流量并对其进行分类,并提供有关如何发现和解决问题的指导。

使用网络性能分析器监控请求

您可以使用网络性能分析器跟踪应用的网络请求。您可以监控应用传输数据的方式和时间,并适当优化底层代码。



图 1. 跟踪网络流量。网络流量模式表明,通过预提取请求或捆绑上传,可以显著提高效率。

通过监控数据传输的频率和每次连接期间传输的数据量,您可以找出应用中可以提高电池效率的区域。通常,您需要查找的是可以延迟的短期峰值。

为了更好地确定传输峰值的原因,借助 Traffic Stats API,您可以使用 TrafficStats.setThreadStatsTag() 标记给定线程内的套接字发生的数据传输。调用此函数不会自动标记特定线程的所有流量;必须将标记应用于套接字。

设置线程标记后,您可以使用 TrafficStats.tagSocket()TrafficStats.untagSocket() 手动标记和取消标记各个套接字。 如果在线程上打开套接字,或者如果服务器套接字接受连接,也会应用一个标记。

多个线程对同一套接字的并发访问将使用套接字发送或接收网络数据包时(该数据可能不同于用户写入或读取数据的时间,因为正在缓冲和重新传输)时具有的任何标记。

例如,您可以定义常量来表示不同类型的网络流量,如以下代码示例所示:

Kotlin

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

Java

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

然后,您可以相应地标记网络请求:

Kotlin

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

Java

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

HttpURLConnection 库会根据当前的 TrafficStats.getThreadStatsTag() 值自动标记套接字。该库还会在通过 keep-alive 池进行回收时标记和取消标记套接字,如以下代码示例所示:

Kotlin

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

Java

public class IdentifyTransferSpikeTask {
    @WorkerThread
    public void request(String url) {
        TrafficStats.setThreadStatsTag(APP_INITIATED);
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag();
    }
}

分析网络流量类型

在查看应用生成的网络流量时,您需要了解流量来源,以便对其进行适当优化。如果应用响应用户操作,则应用频繁生成网络活动可能完全合适,但如果应用不在前台或设备放在口袋或钱包中,则完全不合适。

分析用户发起的流量

当用户在您的应用内执行特定任务时,用户发起的网络流量可能会高效地组合在一起,而当用户请求应用需要获取的额外信息时,用户发起的网络流量则分布不均。分析用户发起的网络流量的目标是查找在一段时间内频繁使用网络的模式,并尝试通过将请求分组来降低网络使用频率。

由于用户请求具有不可预测性,您很难在应用中优化这种类型的网络使用。此外,当用户正在活跃地使用应用时,他们会希望应用能够快速响应,因此为提高效率而延迟请求可能会导致糟糕的用户体验。一般来说,当用户正在直接与您的应用互动时,您应优先考虑对用户的快速响应,而不是高效使用网络。

如需了解有关优化用户发起的流量的建议,请参阅优化用户发起的请求

分析应用发起的流量

通常,应用发起的网络流量会对网络带宽的使用效率产生重大影响。在分析应用的网络活动时,请查找无活动时段并确定是否可以增加这些时段。如果您发现应用对网络的访问呈现出一致的模式,请尝试批量处理此流量,让设备无线装置能够在活动期间切换回低功耗模式。

如需了解有关优化应用发起的流量的建议,请参阅优化应用发起的请求

分析服务器发起的流量

与应用通信的服务器发起的网络活动通常也会对网络带宽的使用效率造成重要影响。Firebase Cloud Messaging (FCM) 是一种轻量级机制,用于将数据从服务器传输到特定应用实例。借助 FCM,您的服务器可以通知在特定设备上运行的应用有新数据可用。

如需查看优化服务器发起的流量的建议,请参阅优化服务器发起的请求

使用 Battery Historian 直观呈现网络流量影响

Battery Historian 是一款工具,可直观呈现设备在一段时间内的耗电情况。您可以使用此工具分析网络活动对耗电量的影响。例如,Battery Historian 可以显示您的应用使用移动网络无线装置的频率是否高于您的预期。如需详细了解如何使用 Battery Historian,请参阅使用 Batterystats 和 Battery Historian 分析电池用量