网络问题排查

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

本主题将向您展示如何监控和分类网络流量,并提供有关识别和解决问题的指导。

使用网络分析器监控请求

使用 网络分析器 追踪应用的网络请求。您可以监控应用如何以及何时传输数据,并相应地优化底层代码。



图 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() 值自动标记套接字。该库还在通过活动保持池回收时标记和取消标记套接字,如下面的代码示例所示

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云消息传递 (FCM) 是一种轻量级机制,用于将数据从服务器传输到特定的应用实例。使用 FCM,您的服务器可以通知在特定设备上运行的应用有新数据可用。

有关优化服务器发起的流量的建议,请参阅优化服务器发起的请求

使用Battery Historian可视化网络流量的影响

Battery Historian 是一款可视化设备一段时间内电池消耗情况的工具。您可以使用此工具分析网络活动如何影响电池消耗。例如,Battery Historian 可以显示您的应用是否比您预期的更频繁地使用蜂窝无线电。有关使用 Battery Historian 的更多信息,请参阅使用 Batterystats 和 Battery Historian 分析电池使用情况