Add method to NetworkStatsService for UID stats.
Useful for clients such as BatteryStats which currently rely on NetworkStatsFactory. Data at that stage is incomplete as it does not account for tethering, VT data and corresponding 464xlat corrections. Test: runtest frameworks-net, CTS tests pass. Change-Id: I763b77f601c827fd2963204694fb5b45425cc791
This commit is contained in:
@@ -44,6 +44,16 @@ interface INetworkStatsService {
|
||||
|
||||
/** Return data layer snapshot of UID network usage. */
|
||||
NetworkStats getDataLayerSnapshotForUid(int uid);
|
||||
|
||||
/** Get a detailed snapshot of stats since boot for all UIDs.
|
||||
*
|
||||
* <p>Results will not always be limited to stats on requiredIfaces when specified: stats for
|
||||
* interfaces stacked on the specified interfaces, or for interfaces on which the specified
|
||||
* interfaces are stacked on, will also be included.
|
||||
* @param requiredIfaces Interface names to get data for, or {@link NetworkStats#INTERFACES_ALL}.
|
||||
*/
|
||||
NetworkStats getDetailedUidStats(in String[] requiredIfaces);
|
||||
|
||||
/** Return set of any ifaces associated with mobile networks since boot. */
|
||||
String[] getMobileIfaces();
|
||||
|
||||
|
||||
@@ -64,6 +64,9 @@ public class NetworkStats implements Parcelable {
|
||||
/** Debug {@link #set} value when the VPN stats are moved out of a vpn UID. */
|
||||
public static final int SET_DBG_VPN_OUT = 1002;
|
||||
|
||||
/** Include all interfaces when filtering */
|
||||
public static final String[] INTERFACES_ALL = null;
|
||||
|
||||
/** {@link #tag} value for total data across all tags. */
|
||||
// TODO: Rename TAG_NONE to TAG_ALL.
|
||||
public static final int TAG_NONE = 0;
|
||||
@@ -359,23 +362,27 @@ public class NetworkStats implements Parcelable {
|
||||
capacity = newLength;
|
||||
}
|
||||
|
||||
iface[size] = entry.iface;
|
||||
uid[size] = entry.uid;
|
||||
set[size] = entry.set;
|
||||
tag[size] = entry.tag;
|
||||
metered[size] = entry.metered;
|
||||
roaming[size] = entry.roaming;
|
||||
defaultNetwork[size] = entry.defaultNetwork;
|
||||
rxBytes[size] = entry.rxBytes;
|
||||
rxPackets[size] = entry.rxPackets;
|
||||
txBytes[size] = entry.txBytes;
|
||||
txPackets[size] = entry.txPackets;
|
||||
operations[size] = entry.operations;
|
||||
setValues(size, entry);
|
||||
size++;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
private void setValues(int i, Entry entry) {
|
||||
iface[i] = entry.iface;
|
||||
uid[i] = entry.uid;
|
||||
set[i] = entry.set;
|
||||
tag[i] = entry.tag;
|
||||
metered[i] = entry.metered;
|
||||
roaming[i] = entry.roaming;
|
||||
defaultNetwork[i] = entry.defaultNetwork;
|
||||
rxBytes[i] = entry.rxBytes;
|
||||
rxPackets[i] = entry.rxPackets;
|
||||
txBytes[i] = entry.txBytes;
|
||||
txPackets[i] = entry.txPackets;
|
||||
operations[i] = entry.operations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return specific stats entry.
|
||||
*/
|
||||
@@ -824,6 +831,39 @@ public class NetworkStats implements Parcelable {
|
||||
return stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only keep entries that match all specified filters.
|
||||
*
|
||||
* <p>This mutates the original structure in place. After this method is called,
|
||||
* size is the number of matching entries, and capacity is the previous capacity.
|
||||
* @param limitUid UID to filter for, or {@link #UID_ALL}.
|
||||
* @param limitIfaces Interfaces to filter for, or {@link #INTERFACES_ALL}.
|
||||
* @param limitTag Tag to filter for, or {@link #TAG_ALL}.
|
||||
*/
|
||||
public void filter(int limitUid, String[] limitIfaces, int limitTag) {
|
||||
if (limitUid == UID_ALL && limitTag == TAG_ALL && limitIfaces == INTERFACES_ALL) {
|
||||
return;
|
||||
}
|
||||
|
||||
Entry entry = new Entry();
|
||||
int nextOutputEntry = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
entry = getValues(i, entry);
|
||||
final boolean matches =
|
||||
(limitUid == UID_ALL || limitUid == entry.uid)
|
||||
&& (limitTag == TAG_ALL || limitTag == entry.tag)
|
||||
&& (limitIfaces == INTERFACES_ALL
|
||||
|| ArrayUtils.contains(limitIfaces, entry.iface));
|
||||
|
||||
if (matches) {
|
||||
setValues(nextOutputEntry, entry);
|
||||
nextOutputEntry++;
|
||||
}
|
||||
}
|
||||
|
||||
size = nextOutputEntry;
|
||||
}
|
||||
|
||||
public void dump(String prefix, PrintWriter pw) {
|
||||
pw.print(prefix);
|
||||
pw.print("NetworkStats: elapsedRealtime="); pw.println(elapsedRealtime);
|
||||
|
||||
Reference in New Issue
Block a user