diff options
| -rw-r--r-- | cmds/statsd/src/atoms.proto | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/stats/pull/StatsPullAtomService.java | 206 |
2 files changed, 83 insertions, 127 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index f9711c3ce763..5f2f546388a0 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -4589,6 +4589,8 @@ message MobileBytesTransfer { optional int64 tx_bytes = 4; optional int64 tx_packets = 5; + + optional int32 rat_type = 6; } /** @@ -4611,6 +4613,8 @@ message MobileBytesTransferByFgBg { optional int64 tx_bytes = 5; optional int64 tx_packets = 6; + + optional int32 rat_type = 7; } /** 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 e133c0fa7435..5e1be51bfed6 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -18,6 +18,7 @@ package com.android.server.stats.pull; import static android.app.AppOpsManager.OP_FLAG_SELF; import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXY; +import static android.app.usage.NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN; import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.os.Debug.getIonHeapsSizeKb; @@ -34,6 +35,9 @@ import static com.android.server.stats.pull.ProcfsMemoryUtil.getProcessCmdlines; import static com.android.server.stats.pull.ProcfsMemoryUtil.readCmdlineFromProcfs; import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; +import static java.util.concurrent.TimeUnit.MICROSECONDS; + +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; @@ -61,12 +65,13 @@ import android.hardware.fingerprint.FingerprintManager; import android.hardware.health.V2_0.IHealth; import android.net.ConnectivityManager; import android.net.INetworkStatsService; +import android.net.INetworkStatsSession; import android.net.Network; import android.net.NetworkRequest; import android.net.NetworkStats; +import android.net.NetworkTemplate; import android.net.wifi.WifiManager; import android.os.BatteryStats; -import android.os.BatteryStatsInternal; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -200,7 +205,8 @@ public class StatsPullAtomService extends SystemService { private final Object mNetworkStatsLock = new Object(); @GuardedBy("mNetworkStatsLock") - private INetworkStatsService mNetworkStatsService; + @Nullable + private INetworkStatsSession mNetworkStatsSession; private final Object mThermalLock = new Object(); @GuardedBy("mThermalLock") @@ -289,13 +295,13 @@ public class StatsPullAtomService extends SystemService { try { switch (atomTag) { case FrameworkStatsLog.WIFI_BYTES_TRANSFER: - return pullWifiBytesTransfer(atomTag, data); + return pullWifiBytesTransfer(atomTag, data, false); case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG: - return pullWifiBytesTransferBackground(atomTag, data); + return pullWifiBytesTransfer(atomTag, data, true); case FrameworkStatsLog.MOBILE_BYTES_TRANSFER: - return pullMobileBytesTransfer(atomTag, data); + return pullMobileBytesTransfer(atomTag, data, false); case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: - return pullMobileBytesTransferBackground(atomTag, data); + return pullMobileBytesTransfer(atomTag, data, true); case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER: return pullBluetoothBytesTransfer(atomTag, data); case FrameworkStatsLog.KERNEL_WAKELOCK: @@ -574,26 +580,35 @@ public class StatsPullAtomService extends SystemService { registerBatteryCycleCount(); } - private INetworkStatsService getINetworkStatsService() { + /** + * Return the {@code INetworkStatsSession} object that holds the necessary properties needed + * for the subsequent queries to {@link com.android.server.net.NetworkStatsService}. Or + * null if the service or binder cannot be obtained. + */ + @Nullable + private INetworkStatsSession getNetworkStatsSession() { synchronized (mNetworkStatsLock) { - if (mNetworkStatsService == null) { - mNetworkStatsService = INetworkStatsService.Stub.asInterface( - ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); - if (mNetworkStatsService != null) { - try { - mNetworkStatsService.asBinder().linkToDeath(() -> { - synchronized (mNetworkStatsLock) { - mNetworkStatsService = null; - } - }, /* flags */ 0); - } catch (RemoteException e) { - Slog.e(TAG, "linkToDeath with NetworkStatsService failed", e); - mNetworkStatsService = null; - } - } + if (mNetworkStatsSession != null) return mNetworkStatsSession; + + final INetworkStatsService networkStatsService = + INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + if (networkStatsService == null) return null; + try { + networkStatsService.asBinder().linkToDeath(() -> { + synchronized (mNetworkStatsLock) { + mNetworkStatsSession = null; + } + }, /* flags */ 0); + mNetworkStatsSession = networkStatsService.openSessionForUsageStats( + FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN, mContext.getOpPackageName()); + } catch (RemoteException e) { + Slog.e(TAG, "Cannot get NetworkStats session", e); + mNetworkStatsSession = null; } - return mNetworkStatsService; + + return mNetworkStatsSession; } } @@ -698,42 +713,38 @@ public class StatsPullAtomService extends SystemService { ); } - int pullWifiBytesTransfer(int atomTag, List<StatsEvent> pulledData) { - INetworkStatsService networkStatsService = getINetworkStatsService(); - if (networkStatsService == null) { - Slog.e(TAG, "NetworkStats Service is not available!"); - return StatsManager.PULL_SKIP; + private int pullWifiBytesTransfer( + int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) { + final NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard(); + final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg); + if (stats != null) { + addNetworkStats(atomTag, pulledData, stats, withFgbg); + return StatsManager.PULL_SUCCESS; } - long token = Binder.clearCallingIdentity(); - try { - // TODO(b/148402814): Consider caching the following call to get BatteryStatsInternal. - BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); - String[] ifaces = bs.getWifiIfaces(); - if (ifaces.length == 0) { - return StatsManager.PULL_SKIP; - } - // Combine all the metrics per Uid into one record. - NetworkStats stats = networkStatsService.getDetailedUidStats(ifaces).groupedByUid(); - addNetworkStats(atomTag, pulledData, stats, false); - } catch (RemoteException e) { - Slog.e(TAG, "Pulling netstats for wifi bytes has error", e); - return StatsManager.PULL_SKIP; - } finally { - Binder.restoreCallingIdentity(token); + return StatsManager.PULL_SKIP; + } + + private int pullMobileBytesTransfer( + int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) { + final NetworkTemplate template = NetworkTemplate.buildTemplateMobileWildcard(); + final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg); + if (stats != null) { + addNetworkStats(atomTag, pulledData, stats, withFgbg); + return StatsManager.PULL_SUCCESS; } - return StatsManager.PULL_SUCCESS; + return StatsManager.PULL_SKIP; } - private void addNetworkStats( - int tag, List<StatsEvent> ret, NetworkStats stats, boolean withFGBG) { + private void addNetworkStats(int atomTag, @NonNull List<StatsEvent> ret, + @NonNull NetworkStats stats, boolean withFgbg) { int size = stats.size(); - NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling + final NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling for (int j = 0; j < size; j++) { stats.getValues(j, entry); StatsEvent.Builder e = StatsEvent.newBuilder(); - e.setAtomId(tag); + e.setAtomId(atomTag); e.writeInt(entry.uid); - if (withFGBG) { + if (withFgbg) { e.writeInt(entry.set); } e.writeLong(entry.rxBytes); @@ -744,11 +755,27 @@ public class StatsPullAtomService extends SystemService { } } + @Nullable private NetworkStats getUidNetworkStatsSinceBoot( + @NonNull NetworkTemplate template, boolean withFgbg) { + + final long elapsedMillisSinceBoot = SystemClock.elapsedRealtime(); + final long currentTimeInMillis = MICROSECONDS.toMillis(SystemClock.currentTimeMicro()); + try { + final NetworkStats stats = getNetworkStatsSession().getSummaryForAllUid(template, + currentTimeInMillis - elapsedMillisSinceBoot, currentTimeInMillis, false); + return withFgbg ? rollupNetworkStatsByFgbg(stats) : stats.groupedByUid(); + } catch (RemoteException | NullPointerException e) { + Slog.e(TAG, "Pulling netstats for " + template + + " fgbg= " + withFgbg + " bytes has error", e); + } + return null; + } + /** * Allows rollups per UID but keeping the set (foreground/background) slicing. * Adapted from groupedByUid in frameworks/base/core/java/android/net/NetworkStats.java */ - private NetworkStats rollupNetworkStatsByFGBG(NetworkStats stats) { + @NonNull private NetworkStats rollupNetworkStatsByFgbg(@NonNull NetworkStats stats) { final NetworkStats ret = new NetworkStats(stats.getElapsedRealtime(), 1); final NetworkStats.Entry entry = new NetworkStats.Entry(); @@ -758,7 +785,7 @@ public class StatsPullAtomService extends SystemService { entry.roaming = NetworkStats.ROAMING_ALL; int size = stats.size(); - NetworkStats.Entry recycle = new NetworkStats.Entry(); // Used for retrieving values + final NetworkStats.Entry recycle = new NetworkStats.Entry(); // Used for retrieving values for (int i = 0; i < size; i++) { stats.getValues(i, recycle); @@ -790,31 +817,6 @@ public class StatsPullAtomService extends SystemService { ); } - int pullWifiBytesTransferBackground(int atomTag, List<StatsEvent> pulledData) { - INetworkStatsService networkStatsService = getINetworkStatsService(); - if (networkStatsService == null) { - Slog.e(TAG, "NetworkStats Service is not available!"); - return StatsManager.PULL_SKIP; - } - long token = Binder.clearCallingIdentity(); - try { - BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); - String[] ifaces = bs.getWifiIfaces(); - if (ifaces.length == 0) { - return StatsManager.PULL_SKIP; - } - NetworkStats stats = rollupNetworkStatsByFGBG( - networkStatsService.getDetailedUidStats(ifaces)); - addNetworkStats(atomTag, pulledData, stats, true); - } catch (RemoteException e) { - Slog.e(TAG, "Pulling netstats for wifi bytes w/ fg/bg has error", e); - return StatsManager.PULL_SKIP; - } finally { - Binder.restoreCallingIdentity(token); - } - return StatsManager.PULL_SUCCESS; - } - private void registerMobileBytesTransfer() { int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() @@ -828,31 +830,6 @@ public class StatsPullAtomService extends SystemService { ); } - int pullMobileBytesTransfer(int atomTag, List<StatsEvent> pulledData) { - INetworkStatsService networkStatsService = getINetworkStatsService(); - if (networkStatsService == null) { - Slog.e(TAG, "NetworkStats Service is not available!"); - return StatsManager.PULL_SKIP; - } - long token = Binder.clearCallingIdentity(); - try { - BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); - String[] ifaces = bs.getMobileIfaces(); - if (ifaces.length == 0) { - return StatsManager.PULL_SKIP; - } - // Combine all the metrics per Uid into one record. - NetworkStats stats = networkStatsService.getDetailedUidStats(ifaces).groupedByUid(); - addNetworkStats(atomTag, pulledData, stats, false); - } catch (RemoteException e) { - Slog.e(TAG, "Pulling netstats for mobile bytes has error", e); - return StatsManager.PULL_SKIP; - } finally { - Binder.restoreCallingIdentity(token); - } - return StatsManager.PULL_SUCCESS; - } - private void registerMobileBytesTransferBackground() { int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG; PullAtomMetadata metadata = new PullAtomMetadata.Builder() @@ -866,31 +843,6 @@ public class StatsPullAtomService extends SystemService { ); } - int pullMobileBytesTransferBackground(int atomTag, List<StatsEvent> pulledData) { - INetworkStatsService networkStatsService = getINetworkStatsService(); - if (networkStatsService == null) { - Slog.e(TAG, "NetworkStats Service is not available!"); - return StatsManager.PULL_SKIP; - } - long token = Binder.clearCallingIdentity(); - try { - BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); - String[] ifaces = bs.getMobileIfaces(); - if (ifaces.length == 0) { - return StatsManager.PULL_SKIP; - } - NetworkStats stats = rollupNetworkStatsByFGBG( - networkStatsService.getDetailedUidStats(ifaces)); - addNetworkStats(atomTag, pulledData, stats, true); - } catch (RemoteException e) { - Slog.e(TAG, "Pulling netstats for mobile bytes w/ fg/bg has error", e); - return StatsManager.PULL_SKIP; - } finally { - Binder.restoreCallingIdentity(token); - } - return StatsManager.PULL_SUCCESS; - } - private void registerBluetoothBytesTransfer() { int tagId = FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() |