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