diff options
| -rw-r--r-- | services/core/java/com/android/server/stats/pull/StatsPullAtomService.java | 83 | ||||
| -rw-r--r-- | services/core/java/com/android/server/stats/pull/netstats/NetworkStatsExt.java | 11 |
2 files changed, 88 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 8023fd42edfa..a7b9e95d44d1 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -25,7 +25,16 @@ import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import static android.net.NetworkIdentity.OEM_PAID; +import static android.net.NetworkIdentity.OEM_PRIVATE; +import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; +import static android.net.NetworkStats.METERED_ALL; +import static android.net.NetworkStats.ROAMING_ALL; +import static android.net.NetworkTemplate.MATCH_ETHERNET; +import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD; +import static android.net.NetworkTemplate.MATCH_WIFI_WILDCARD; import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; +import static android.net.NetworkTemplate.OEM_MANAGED_ALL; import static android.net.NetworkTemplate.buildTemplateMobileWildcard; import static android.net.NetworkTemplate.buildTemplateMobileWithRatType; import static android.net.NetworkTemplate.buildTemplateWifiWildcard; @@ -435,6 +444,7 @@ public class StatsPullAtomService extends SystemService { case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: case FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED: case FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER: + case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER: synchronized (mDataBytesTransferLock) { return pullDataBytesTransferLocked(atomTag, data); } @@ -867,6 +877,8 @@ public class StatsPullAtomService extends SystemService { FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED)); mNetworkStatsBaselines.addAll( collectNetworkStatsSnapshotForAtom(FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER)); + mNetworkStatsBaselines.addAll( + collectNetworkStatsSnapshotForAtom(FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER)); // Listen to subscription changes to record historical subscriptions that activated before // pulling, this is used by {@code DATA_USAGE_BYTES_TRANSFER}. @@ -879,6 +891,7 @@ public class StatsPullAtomService extends SystemService { registerMobileBytesTransferBackground(); registerBytesTransferByTagAndMetered(); registerDataUsageBytesTransfer(); + registerOemManagedBytesTransfer(); } /** @@ -1057,7 +1070,7 @@ public class StatsPullAtomService extends SystemService { new int[] {TRANSPORT_WIFI, TRANSPORT_CELLULAR}, /*slicedByFgbg=*/false, /*slicedByTag=*/true, /*slicedByMetered=*/true, TelephonyManager.NETWORK_TYPE_UNKNOWN, - /*subInfo=*/null)); + /*subInfo=*/null, OEM_MANAGED_ALL)); } break; } @@ -1067,6 +1080,10 @@ public class StatsPullAtomService extends SystemService { } break; } + case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER: { + ret.addAll(getDataUsageBytesTransferSnapshotForOemManaged()); + break; + } default: throw new IllegalArgumentException("Unknown atomTag " + atomTag); } @@ -1094,7 +1111,7 @@ public class StatsPullAtomService extends SystemService { final NetworkStatsExt diff = new NetworkStatsExt( item.stats.subtract(baseline.stats).removeEmptyEntries(), item.transports, item.slicedByFgbg, item.slicedByTag, item.slicedByMetered, item.ratType, - item.subInfo); + item.subInfo, item.oemManaged); // If no diff, skip. if (diff.stats.size() == 0) continue; @@ -1106,6 +1123,9 @@ public class StatsPullAtomService extends SystemService { case FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER: addDataUsageBytesTransferAtoms(diff, pulledData); break; + case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER: + addOemDataUsageBytesTransferAtoms(diff, pulledData); + break; default: addNetworkStats(atomTag, pulledData, diff); } @@ -1177,6 +1197,49 @@ public class StatsPullAtomService extends SystemService { } } + private void addOemDataUsageBytesTransferAtoms(@NonNull NetworkStatsExt statsExt, + @NonNull List<StatsEvent> pulledData) { + final NetworkStats.Entry entry = new NetworkStats.Entry(); // for recycling + final int oemManaged = statsExt.oemManaged; + for (final int transport : statsExt.transports) { + for (int i = 0; i < statsExt.stats.size(); i++) { + statsExt.stats.getValues(i, entry); + pulledData.add(FrameworkStatsLog.buildStatsEvent( + FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER, entry.uid, (entry.set > 0), + oemManaged, transport, entry.rxBytes, entry.rxPackets, entry.txBytes, + entry.txPackets)); + } + } + } + + @NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() { + final int[] transports = new int[] {MATCH_ETHERNET, MATCH_MOBILE_WILDCARD, + MATCH_WIFI_WILDCARD}; + final int[] oemManagedTypes = new int[] {OEM_PAID | OEM_PRIVATE, OEM_PAID, OEM_PRIVATE}; + + final List<NetworkStatsExt> ret = new ArrayList<>(); + + for (final int transport : transports) { + for (final int oemManaged : oemManagedTypes) { + /* A null subscriberId will set wildcard=true, since we aren't trying to select a + specific ssid or subscriber. */ + final NetworkTemplate template = new NetworkTemplate(transport, + /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, + oemManaged); + final NetworkStats stats = getUidNetworkStatsSnapshotForTemplate(template, true); + if (stats != null) { + ret.add(new NetworkStatsExt(sliceNetworkStatsByUidTagAndMetered(stats), + new int[] {transport}, /*slicedByFgbg=*/true, /*slicedByTag=*/true, + /*slicedByMetered=*/true, TelephonyManager.NETWORK_TYPE_UNKNOWN, + /*subInfo=*/null, oemManaged)); + } + } + } + + return ret; + } + /** * Create a snapshot of NetworkStats for a given transport. */ @@ -1229,7 +1292,8 @@ public class StatsPullAtomService extends SystemService { if (stats != null) { ret.add(new NetworkStatsExt(sliceNetworkStatsByFgbg(stats), new int[] {TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true, - /*slicedByTag=*/false, /*slicedByMetered=*/false, ratType, subInfo)); + /*slicedByTag=*/false, /*slicedByMetered=*/false, ratType, subInfo, + OEM_MANAGED_ALL)); } } return ret; @@ -1374,6 +1438,19 @@ public class StatsPullAtomService extends SystemService { ); } + private void registerOemManagedBytesTransfer() { + int tagId = FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER; + PullAtomMetadata metadata = new PullAtomMetadata.Builder() + .setAdditiveFields(new int[] {5, 6, 7, 8}) + .build(); + mStatsManager.setPullAtomCallback( + tagId, + metadata, + BackgroundThread.getExecutor(), + mStatsCallbackImpl + ); + } + private void registerBluetoothBytesTransfer() { int tagId = FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() diff --git a/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsExt.java b/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsExt.java index 06c81ee5e2be..7dbba0d4337d 100644 --- a/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsExt.java +++ b/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsExt.java @@ -16,6 +16,8 @@ package com.android.server.stats.pull.netstats; +import static android.net.NetworkTemplate.OEM_MANAGED_ALL; + import android.annotation.NonNull; import android.annotation.Nullable; import android.net.NetworkStats; @@ -37,17 +39,18 @@ public class NetworkStatsExt { public final boolean slicedByTag; public final boolean slicedByMetered; public final int ratType; + public final int oemManaged; @Nullable public final SubInfo subInfo; public NetworkStatsExt(@NonNull NetworkStats stats, int[] transports, boolean slicedByFgbg) { this(stats, transports, slicedByFgbg, /*slicedByTag=*/false, /*slicedByMetered=*/false, - TelephonyManager.NETWORK_TYPE_UNKNOWN, /*subInfo=*/null); + TelephonyManager.NETWORK_TYPE_UNKNOWN, /*subInfo=*/null, OEM_MANAGED_ALL); } public NetworkStatsExt(@NonNull NetworkStats stats, int[] transports, boolean slicedByFgbg, boolean slicedByTag, boolean slicedByMetered, int ratType, - @Nullable SubInfo subInfo) { + @Nullable SubInfo subInfo, int oemManaged) { this.stats = stats; // Sort transports array so that we can test for equality without considering order. @@ -59,6 +62,7 @@ public class NetworkStatsExt { this.slicedByMetered = slicedByMetered; this.ratType = ratType; this.subInfo = subInfo; + this.oemManaged = oemManaged; } /** @@ -67,6 +71,7 @@ public class NetworkStatsExt { public boolean hasSameSlicing(@NonNull NetworkStatsExt other) { return Arrays.equals(transports, other.transports) && slicedByFgbg == other.slicedByFgbg && slicedByTag == other.slicedByTag && slicedByMetered == other.slicedByMetered - && ratType == other.ratType && Objects.equals(subInfo, other.subInfo); + && ratType == other.ratType && Objects.equals(subInfo, other.subInfo) + && oemManaged == other.oemManaged; } } |