Android NDK开发详解连接性之排查网络问题

本文详细介绍了如何通过AndroidNDK监控和分析网络流量,包括用户、应用和服务器发起的流量,以及如何使用TrafficStats和BatteryHistorian工具来优化网络使用,提升电池续航。
摘要由CSDN通过智能技术生成


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

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

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

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

在这里插入图片描述

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

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

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

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

多个线程对同一套接字的并发访问将使用套接字在发送或接收网络数据包时具有的任何标记(可能不同于用户写入或读取数据的时间,因为缓冲和重新传输)。
注意 :用于标记来自应用的网络流量的方法取决于您使用的 API 访问和管理网络套接字的方式。某些网络库可能不允许 TrafficStats 实用程序标记来自您的应用的流量。

例如,您可以定义常量来表示不同类型的网络流量,如以下代码示例所示:
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();
    }
}

注意 :运行性能测试时,您的 APK 应尽可能接近正式版 build。为了做到这一点,您可能需要创建一个与调试 build 类型分开的新可调试 build 类型。如需详细了解如何创建 build 类型,请参阅配置 build 类型。

分析网络流量类型

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

分析用户发起的流量

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

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

有关优化用户发起的流量的建议,请参阅优化用户发起的请求。
注意 :请留意用户活动测试数据中的网络活动分组偏差。如果您通过网络测试计划运行了一组用户场景,则用户发起的网络访问图表可能以不切实际的方式组合在一起,可能导致您针对实际不会发生的用户行为进行优化。确保用户网络测试场景反映了应用的真实使用情况。

分析应用发起的流量

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

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

分析服务器发起的流量

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

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

使用 Battery Historian 直观呈现网络流量效应

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

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-11-10。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值