【Android】(八) 按时间段流量统计源码分析

1 统计流程

//NetworkStats.java -> INetworkStatsSession.stub -> NetworkStatsCollection.java

startSummaryEnumeration() -> getSummaryForAllUid() -> getSummary()

startHistoryEnumeration() -> getHistoryIntervalForUid() -> getHistory()

startUserUidEnumeration() -> getHistoryIntervalForUid() -> getHistory()

NetworkStatsManager 中按照时间段统计网络流量的 API 中都是调用了 NetworkStats 中的以上三种函数。而这其中又调用了 INetworkStatsSession 中的以上两种函数。这两种函数分别又调用了 NetworkStatsCollection 中的函数。

大致可以看到,getSummary 和 getHistory 统计数据是根据 NetworkStatsCollection 中的 NetworkStatsHistory array 来累计的。

getSummary

public NetworkStats getSummary(NetworkTemplate template, long start, long end,
        @NetworkStatsAccess.Level int accessLevel, int callerUid) {
    final long now = System.currentTimeMillis();

    final NetworkStats stats = new NetworkStats(end - start, 24);

    // shortcut when we know stats will be empty
    if (start == end) return stats;

    final NetworkStats.Entry entry = new NetworkStats.Entry();
    NetworkStatsHistory.Entry historyEntry = null;

    for (int i = 0; i < mStats.size(); i++) {
        final Key key = mStats.keyAt(i);
        if (templateMatches(template, key.ident)
                && NetworkStatsAccess.isAccessibleToUser(key.uid, callerUid, accessLevel)
                && key.set < NetworkStats.SET_DEBUG_START) {
            final NetworkStatsHistory value = mStats.valueAt(i);
            historyEntry = value.getValues(start, end, now, historyEntry);

            entry.iface = IFACE_ALL;
            entry.uid = key.uid;
            entry.set = key.set;
            entry.tag = key.tag;
            entry.defaultNetwork = key.ident.areAllMembersOnDefaultNetwork() ?
                    DEFAULT_NETWORK_YES : DEFAULT_NETWORK_NO;
            entry.metered = key.ident.isAnyMemberMetered() ? METERED_YES : METERED_NO;
            entry.roaming = key.ident.isAnyMemberRoaming() ? ROAMING_YES : ROAMING_NO;
            entry.rxBytes = historyEntry.rxBytes;
            entry.rxPackets = historyEntry.rxPackets;
            entry.txBytes = histor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值