[SM07] Make combine subtype configurable from Settings
Note that enabling/disabling would not take effect until device
reboot. This will be addressed in follow-up patch.
Test: 1. atest NetworkStatsServieTest SettingsBackupTest
2. adb shell settings put global netstats_combine_subtype_enabled 1|0
Bug: 146415925
Change-Id: Ic94da540afa479ed18f1b6fbda4ae3216c37476b
Merged-In: Ic94da540afa479ed18f1b6fbda4ae3216c37476b
(cherry picked from commit c4f77ac90bf2e48a655ad19b162fe74a23bf3fb0)
diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java
index 2cf3531..0948a4d 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -40,13 +40,6 @@
public class NetworkIdentity implements Comparable<NetworkIdentity> {
private static final String TAG = "NetworkIdentity";
- /**
- * When enabled, combine all {@link #mSubType} together under
- * {@link #SUBTYPE_COMBINED}.
- */
- // TODO: make this flag configurable through settings. See http://b/146415925
- public static final boolean COMBINE_SUBTYPE_ENABLED = false;
-
public static final int SUBTYPE_COMBINED = -1;
final int mType;
@@ -61,7 +54,7 @@
int type, int subType, String subscriberId, String networkId, boolean roaming,
boolean metered, boolean defaultNetwork) {
mType = type;
- mSubType = COMBINE_SUBTYPE_ENABLED ? SUBTYPE_COMBINED : subType;
+ mSubType = subType;
mSubscriberId = subscriberId;
mNetworkId = networkId;
mRoaming = roaming;
@@ -93,7 +86,7 @@
final StringBuilder builder = new StringBuilder("{");
builder.append("type=").append(getNetworkTypeName(mType));
builder.append(", subType=");
- if (COMBINE_SUBTYPE_ENABLED) {
+ if (mSubType == SUBTYPE_COMBINED) {
builder.append("COMBINED");
} else {
builder.append(mSubType);
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index ff4407a..d8264b3 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -27,7 +27,6 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
import static android.net.ConnectivityManager.isNetworkTypeMobile;
-import static android.net.NetworkIdentity.COMBINE_SUBTYPE_ENABLED;
import static android.net.NetworkIdentity.SUBTYPE_COMBINED;
import static android.net.NetworkStack.checkNetworkStackPermission;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
@@ -52,6 +51,7 @@
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.os.Trace.TRACE_TAG_NETWORK;
import static android.provider.Settings.Global.NETSTATS_AUGMENT_ENABLED;
+import static android.provider.Settings.Global.NETSTATS_COMBINE_SUBTYPE_ENABLED;
import static android.provider.Settings.Global.NETSTATS_DEV_BUCKET_DURATION;
import static android.provider.Settings.Global.NETSTATS_DEV_DELETE_AGE;
import static android.provider.Settings.Global.NETSTATS_DEV_PERSIST_BYTES;
@@ -240,12 +240,20 @@
* Settings that can be changed externally.
*/
public interface NetworkStatsSettings {
- public long getPollInterval();
- public long getPollDelay();
- public boolean getSampleEnabled();
- public boolean getAugmentEnabled();
+ long getPollInterval();
+ long getPollDelay();
+ boolean getSampleEnabled();
+ boolean getAugmentEnabled();
+ /**
+ * When enabled, all mobile data is reported under {@link NetworkIdentity#SUBTYPE_COMBINED}.
+ * When disabled, mobile data is broken down by a granular subtype representative of the
+ * actual subtype. {@see NetworkTemplate#getCollapsedRatType}.
+ * Enabling this decreases the level of detail but saves performance, disk space and
+ * amount of data logged.
+ */
+ boolean getCombineSubtypeEnabled();
- public static class Config {
+ class Config {
public final long bucketDuration;
public final long rotateAgeMillis;
public final long deleteAgeMillis;
@@ -257,16 +265,16 @@
}
}
- public Config getDevConfig();
- public Config getXtConfig();
- public Config getUidConfig();
- public Config getUidTagConfig();
+ Config getDevConfig();
+ Config getXtConfig();
+ Config getUidConfig();
+ Config getUidTagConfig();
- public long getGlobalAlertBytes(long def);
- public long getDevPersistBytes(long def);
- public long getXtPersistBytes(long def);
- public long getUidPersistBytes(long def);
- public long getUidTagPersistBytes(long def);
+ long getGlobalAlertBytes(long def);
+ long getDevPersistBytes(long def);
+ long getXtPersistBytes(long def);
+ long getUidPersistBytes(long def);
+ long getUidTagPersistBytes(long def);
}
private final Object mStatsLock = new Object();
@@ -509,9 +517,10 @@
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
mSettings.getPollInterval(), pollIntent);
- // TODO: listen to changes from all subscriptions.
+ // TODO: 1. listen to changes from all subscriptions.
+ // 2. listen to settings changed to support dynamically enable/disable.
// watch for networkType changes
- if (!COMBINE_SUBTYPE_ENABLED) {
+ if (!mSettings.getCombineSubtypeEnabled()) {
mTeleManager.listen(mPhoneListener, LISTEN_SERVICE_STATE);
}
@@ -535,9 +544,7 @@
mContext.unregisterReceiver(mUserReceiver);
mContext.unregisterReceiver(mShutdownReceiver);
- if (!COMBINE_SUBTYPE_ENABLED) {
- mTeleManager.listen(mPhoneListener, LISTEN_NONE);
- }
+ mTeleManager.listen(mPhoneListener, LISTEN_NONE);
final long currentTime = mClock.millis();
@@ -1265,12 +1272,14 @@
mLastNetworkStates = states;
+ final boolean combineSubtypeEnabled = mSettings.getCombineSubtypeEnabled();
final ArraySet<String> mobileIfaces = new ArraySet<>();
for (NetworkState state : states) {
if (state.networkInfo.isConnected()) {
final boolean isMobile = isNetworkTypeMobile(state.networkInfo.getType());
final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, state.network);
- final int subType = getSubTypeForState(state);
+ final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED
+ : getSubTypeForState(state);
final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state,
isDefault, subType);
@@ -1334,13 +1343,11 @@
}
/**
- * If combine subtype is not enabled. For networks with {@code TRANSPORT_CELLULAR}, get
- * subType that obtained through {@link PhoneStateListener}. Otherwise, return 0 given that
- * other networks with different transport types do not actually fill this value.
+ * For networks with {@code TRANSPORT_CELLULAR}, get subType that was obtained through
+ * {@link PhoneStateListener}. Otherwise, return 0 given that other networks with different
+ * transport types do not actually fill this value.
*/
private int getSubTypeForState(@NonNull NetworkState state) {
- if (COMBINE_SUBTYPE_ENABLED) return SUBTYPE_COMBINED;
-
if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
return 0;
}
@@ -1702,6 +1709,12 @@
return;
}
+ pw.println("Configs:");
+ pw.increaseIndent();
+ pw.printPair(NETSTATS_COMBINE_SUBTYPE_ENABLED, mSettings.getCombineSubtypeEnabled());
+ pw.println();
+ pw.decreaseIndent();
+
pw.println("Active interfaces:");
pw.increaseIndent();
for (int i = 0; i < mActiveIfaces.size(); i++) {
@@ -2130,6 +2143,10 @@
return getGlobalBoolean(NETSTATS_AUGMENT_ENABLED, true);
}
@Override
+ public boolean getCombineSubtypeEnabled() {
+ return getGlobalBoolean(NETSTATS_COMBINE_SUBTYPE_ENABLED, false);
+ }
+ @Override
public Config getDevConfig() {
return new Config(getGlobalLong(NETSTATS_DEV_BUCKET_DURATION, HOUR_IN_MILLIS),
getGlobalLong(NETSTATS_DEV_ROTATE_AGE, 15 * DAY_IN_MILLIS),