排查网络问题

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

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

使用 Network Profiler 监控请求

使用 Network Profiler 跟踪您的应用的网络请求。您可以监控应用传输数据的方式和时间,并相应地优化底层代码。



图 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 分析电池用量