Merge changes from topic "ms52-movenetstats"

* changes:
  Expose MATCH_PROXY as a module-lib API.
  Add setPollForce to module API
  Move networkstats JNI to connectivity module
  [MS54.1] Move NetworkStats to updatable sources
  [MS62.1] Start NetworkStatsService from the module
This commit is contained in:
Lorenzo Colitti
2022-02-28 05:32:23 +00:00
committed by Gerrit Code Review
15 changed files with 100 additions and 45 deletions

View File

@@ -158,7 +158,6 @@ filegroup {
name: "framework-connectivity-tiramisu-sources", name: "framework-connectivity-tiramisu-sources",
srcs: [ srcs: [
":framework-connectivity-ethernet-sources", ":framework-connectivity-ethernet-sources",
":framework-connectivity-netstats-sources",
], ],
visibility: ["//frameworks/base"], visibility: ["//frameworks/base"],
} }
@@ -167,6 +166,7 @@ filegroup {
name: "framework-connectivity-tiramisu-updatable-sources", name: "framework-connectivity-tiramisu-updatable-sources",
srcs: [ srcs: [
":framework-connectivity-ipsec-sources", ":framework-connectivity-ipsec-sources",
":framework-connectivity-netstats-sources",
":framework-connectivity-nsd-sources", ":framework-connectivity-nsd-sources",
":framework-connectivity-tiramisu-internal-sources", ":framework-connectivity-tiramisu-internal-sources",
], ],
@@ -194,15 +194,12 @@ cc_library_shared {
"jni/onload.cpp", "jni/onload.cpp",
], ],
shared_libs: [ shared_libs: [
"libandroid",
"liblog", "liblog",
], "libnativehelper",
static_libs: [
"libnativehelper_compat_libc++",
], ],
stl: "none", stl: "none",
apex_available: [ apex_available: [
"com.android.tethering", "com.android.tethering",
// TODO: remove when ConnectivityT moves to APEX.
"//apex_available:platform",
], ],
} }

View File

@@ -27,7 +27,6 @@ import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.annotation.SystemService; import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.WorkerThread; import android.annotation.WorkerThread;
import android.app.usage.NetworkStats.Bucket; import android.app.usage.NetworkStats.Bucket;
import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage;
@@ -192,9 +191,13 @@ public class NetworkStatsManager {
} }
} }
/** @hide */ /**
* Set poll force flag to indicate that calling any subsequent query method will force a stats
* poll.
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@TestApi @SystemApi(client = MODULE_LIBRARIES)
public void setPollForce(boolean pollForce) { public void setPollForce(boolean pollForce) {
if (pollForce) { if (pollForce) {
mFlags |= FLAG_POLL_FORCE; mFlags |= FLAG_POLL_FORCE;

View File

@@ -18,6 +18,7 @@ package android.net;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.app.SystemServiceRegistry; import android.app.SystemServiceRegistry;
import android.app.usage.NetworkStatsManager;
import android.content.Context; import android.content.Context;
import android.net.nsd.INsdManager; import android.net.nsd.INsdManager;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
@@ -57,5 +58,15 @@ public final class ConnectivityFrameworkInitializerTiramisu {
return new IpSecManager(context, service); return new IpSecManager(context, service);
} }
); );
SystemServiceRegistry.registerContextAwareService(
Context.NETWORK_STATS_SERVICE,
NetworkStatsManager.class,
(context, serviceBinder) -> {
INetworkStatsService service =
INetworkStatsService.Stub.asInterface(serviceBinder);
return new NetworkStatsManager(context, service);
}
);
} }
} }

View File

@@ -184,14 +184,14 @@ public class NetworkIdentity {
public void dumpDebug(ProtoOutputStream proto, long tag) { public void dumpDebug(ProtoOutputStream proto, long tag) {
final long start = proto.start(tag); final long start = proto.start(tag);
proto.write(NetworkIdentityProto.TYPE, mType); proto.write(NetworkIdentityProto.TYPE_FIELD_NUMBER, mType);
// TODO: dump mRatType as well. // TODO: dump mRatType as well.
proto.write(NetworkIdentityProto.ROAMING, mRoaming); proto.write(NetworkIdentityProto.ROAMING_FIELD_NUMBER, mRoaming);
proto.write(NetworkIdentityProto.METERED, mMetered); proto.write(NetworkIdentityProto.METERED_FIELD_NUMBER, mMetered);
proto.write(NetworkIdentityProto.DEFAULT_NETWORK, mDefaultNetwork); proto.write(NetworkIdentityProto.DEFAULT_NETWORK_FIELD_NUMBER, mDefaultNetwork);
proto.write(NetworkIdentityProto.OEM_MANAGED_NETWORK, mOemManaged); proto.write(NetworkIdentityProto.OEM_MANAGED_NETWORK_FIELD_NUMBER, mOemManaged);
proto.end(start); proto.end(start);
} }

View File

@@ -212,7 +212,7 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
final long start = proto.start(tag); final long start = proto.start(tag);
for (NetworkIdentity ident : this) { for (NetworkIdentity ident : this) {
ident.dumpDebug(proto, NetworkIdentitySetProto.IDENTITIES); ident.dumpDebug(proto, NetworkIdentitySetProto.IDENTITIES_FIELD_NUMBER);
} }
proto.end(start); proto.end(start);

View File

@@ -732,19 +732,19 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
final long start = proto.start(tag); final long start = proto.start(tag);
for (Key key : getSortedKeys()) { for (Key key : getSortedKeys()) {
final long startStats = proto.start(NetworkStatsCollectionProto.STATS); final long startStats = proto.start(NetworkStatsCollectionProto.STATS_FIELD_NUMBER);
// Key // Key
final long startKey = proto.start(NetworkStatsCollectionStatsProto.KEY); final long startKey = proto.start(NetworkStatsCollectionStatsProto.KEY_FIELD_NUMBER);
key.ident.dumpDebug(proto, NetworkStatsCollectionKeyProto.IDENTITY); key.ident.dumpDebug(proto, NetworkStatsCollectionKeyProto.IDENTITY_FIELD_NUMBER);
proto.write(NetworkStatsCollectionKeyProto.UID, key.uid); proto.write(NetworkStatsCollectionKeyProto.UID_FIELD_NUMBER, key.uid);
proto.write(NetworkStatsCollectionKeyProto.SET, key.set); proto.write(NetworkStatsCollectionKeyProto.SET_FIELD_NUMBER, key.set);
proto.write(NetworkStatsCollectionKeyProto.TAG, key.tag); proto.write(NetworkStatsCollectionKeyProto.TAG_FIELD_NUMBER, key.tag);
proto.end(startKey); proto.end(startKey);
// Value // Value
final NetworkStatsHistory history = mStats.get(key); final NetworkStatsHistory history = mStats.get(key);
history.dumpDebug(proto, NetworkStatsCollectionStatsProto.HISTORY); history.dumpDebug(proto, NetworkStatsCollectionStatsProto.HISTORY_FIELD_NUMBER);
proto.end(startStats); proto.end(startStats);
} }

View File

@@ -915,17 +915,18 @@ public final class NetworkStatsHistory implements Parcelable {
public void dumpDebug(ProtoOutputStream proto, long tag) { public void dumpDebug(ProtoOutputStream proto, long tag) {
final long start = proto.start(tag); final long start = proto.start(tag);
proto.write(NetworkStatsHistoryProto.BUCKET_DURATION_MS, bucketDuration); proto.write(NetworkStatsHistoryProto.BUCKET_DURATION_MS_FIELD_NUMBER, bucketDuration);
for (int i = 0; i < bucketCount; i++) { for (int i = 0; i < bucketCount; i++) {
final long startBucket = proto.start(NetworkStatsHistoryProto.BUCKETS); final long startBucket = proto.start(NetworkStatsHistoryProto.BUCKETS_FIELD_NUMBER);
proto.write(NetworkStatsHistoryBucketProto.BUCKET_START_MS, bucketStart[i]); proto.write(NetworkStatsHistoryBucketProto.BUCKET_START_MS_FIELD_NUMBER,
dumpDebug(proto, NetworkStatsHistoryBucketProto.RX_BYTES, rxBytes, i); bucketStart[i]);
dumpDebug(proto, NetworkStatsHistoryBucketProto.RX_PACKETS, rxPackets, i); dumpDebug(proto, NetworkStatsHistoryBucketProto.RX_BYTES_FIELD_NUMBER, rxBytes, i);
dumpDebug(proto, NetworkStatsHistoryBucketProto.TX_BYTES, txBytes, i); dumpDebug(proto, NetworkStatsHistoryBucketProto.RX_PACKETS_FIELD_NUMBER, rxPackets, i);
dumpDebug(proto, NetworkStatsHistoryBucketProto.TX_PACKETS, txPackets, i); dumpDebug(proto, NetworkStatsHistoryBucketProto.TX_BYTES_FIELD_NUMBER, txBytes, i);
dumpDebug(proto, NetworkStatsHistoryBucketProto.OPERATIONS, operations, i); dumpDebug(proto, NetworkStatsHistoryBucketProto.TX_PACKETS_FIELD_NUMBER, txPackets, i);
dumpDebug(proto, NetworkStatsHistoryBucketProto.OPERATIONS_FIELD_NUMBER, operations, i);
proto.end(startBucket); proto.end(startBucket);
} }

View File

@@ -79,7 +79,8 @@ public final class NetworkTemplate implements Parcelable {
MATCH_WIFI, MATCH_WIFI,
MATCH_ETHERNET, MATCH_ETHERNET,
MATCH_BLUETOOTH, MATCH_BLUETOOTH,
MATCH_CARRIER MATCH_PROXY,
MATCH_CARRIER,
}) })
public @interface TemplateMatchRule{} public @interface TemplateMatchRule{}
@@ -104,9 +105,8 @@ public final class NetworkTemplate implements Parcelable {
/** Match rule to match bluetooth networks. */ /** Match rule to match bluetooth networks. */
public static final int MATCH_BLUETOOTH = 8; public static final int MATCH_BLUETOOTH = 8;
/** /**
* Match rule to match networks with {@link Connectivity#TYPE_PROXY} as the legacy network type. * Match rule to match networks with {@link ConnectivityManager#TYPE_PROXY} as the legacy
* * network type.
* @hide
*/ */
public static final int MATCH_PROXY = 9; public static final int MATCH_PROXY = 9;
/** /**

View File

@@ -40,6 +40,30 @@ filegroup {
], ],
} }
// For test code only.
filegroup {
name: "lib_networkStatsFactory_native",
srcs: [
"jni/com_android_server_net_NetworkStatsFactory.cpp",
],
path: "jni",
visibility: [
"//packages/modules/Connectivity:__subpackages__",
],
}
filegroup {
name: "services.connectivity-netstats-jni-sources",
srcs: [
"jni/com_android_server_net_NetworkStatsFactory.cpp",
"jni/com_android_server_net_NetworkStatsService.cpp",
],
path: "jni",
visibility: [
"//packages/modules/Connectivity:__subpackages__",
],
}
// Nsd related libraries. // Nsd related libraries.
filegroup { filegroup {
@@ -88,7 +112,6 @@ filegroup {
name: "services.connectivity-tiramisu-sources", name: "services.connectivity-tiramisu-sources",
srcs: [ srcs: [
":services.connectivity-ethernet-sources", ":services.connectivity-ethernet-sources",
":services.connectivity-netstats-sources",
], ],
path: "src", path: "src",
visibility: ["//frameworks/base/services/core"], visibility: ["//frameworks/base/services/core"],
@@ -98,6 +121,7 @@ filegroup {
name: "services.connectivity-tiramisu-updatable-sources", name: "services.connectivity-tiramisu-updatable-sources",
srcs: [ srcs: [
":services.connectivity-ipsec-sources", ":services.connectivity-ipsec-sources",
":services.connectivity-netstats-sources",
":services.connectivity-nsd-sources", ":services.connectivity-nsd-sources",
], ],
path: "src", path: "src",

View File

@@ -54,6 +54,10 @@ import java.util.concurrent.ConcurrentHashMap;
* @hide * @hide
*/ */
public class NetworkStatsFactory { public class NetworkStatsFactory {
static {
System.loadLibrary("service-connectivity");
}
private static final String TAG = "NetworkStatsFactory"; private static final String TAG = "NetworkStatsFactory";
private static final boolean USE_NATIVE_PARSING = true; private static final boolean USE_NATIVE_PARSING = true;

View File

@@ -471,9 +471,11 @@ public class NetworkStatsRecorder {
public void dumpDebugLocked(ProtoOutputStream proto, long tag) { public void dumpDebugLocked(ProtoOutputStream proto, long tag) {
final long start = proto.start(tag); final long start = proto.start(tag);
if (mPending != null) { if (mPending != null) {
proto.write(NetworkStatsRecorderProto.PENDING_TOTAL_BYTES, mPending.getTotalBytes()); proto.write(NetworkStatsRecorderProto.PENDING_TOTAL_BYTES_FIELD_NUMBER,
mPending.getTotalBytes());
} }
getOrLoadCompleteLocked().dumpDebug(proto, NetworkStatsRecorderProto.COMPLETE_HISTORY); getOrLoadCompleteLocked().dumpDebug(proto,
NetworkStatsRecorderProto.COMPLETE_HISTORY_FIELD_NUMBER);
proto.end(start); proto.end(start);
} }

View File

@@ -63,6 +63,7 @@ import static com.android.net.module.util.NetworkStatsUtils.LIMIT_GLOBAL_ALERT;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.TargetApi;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.usage.NetworkStatsManager; import android.app.usage.NetworkStatsManager;
@@ -103,6 +104,7 @@ import android.net.netstats.provider.INetworkStatsProvider;
import android.net.netstats.provider.INetworkStatsProviderCallback; import android.net.netstats.provider.INetworkStatsProviderCallback;
import android.net.netstats.provider.NetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProvider;
import android.os.Binder; import android.os.Binder;
import android.os.Build;
import android.os.DropBoxManager; import android.os.DropBoxManager;
import android.os.Environment; import android.os.Environment;
import android.os.Handler; import android.os.Handler;
@@ -169,7 +171,12 @@ import java.util.concurrent.TimeUnit;
* Collect and persist detailed network statistics, and provide this data to * Collect and persist detailed network statistics, and provide this data to
* other system services. * other system services.
*/ */
@TargetApi(Build.VERSION_CODES.TIRAMISU)
public class NetworkStatsService extends INetworkStatsService.Stub { public class NetworkStatsService extends INetworkStatsService.Stub {
static {
System.loadLibrary("service-connectivity");
}
static final String TAG = "NetworkStats"; static final String TAG = "NetworkStats";
static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG); static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE); static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);
@@ -2120,12 +2127,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// TODO Right now it writes all history. Should it limit to the "since-boot" log? // TODO Right now it writes all history. Should it limit to the "since-boot" log?
dumpInterfaces(proto, NetworkStatsServiceDumpProto.ACTIVE_INTERFACES, mActiveIfaces); dumpInterfaces(proto, NetworkStatsServiceDumpProto.ACTIVE_INTERFACES_FIELD_NUMBER,
dumpInterfaces(proto, NetworkStatsServiceDumpProto.ACTIVE_UID_INTERFACES, mActiveUidIfaces); mActiveIfaces);
mDevRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.DEV_STATS); dumpInterfaces(proto, NetworkStatsServiceDumpProto.ACTIVE_UID_INTERFACES_FIELD_NUMBER,
mXtRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.XT_STATS); mActiveUidIfaces);
mUidRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.UID_STATS); mDevRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.DEV_STATS_FIELD_NUMBER);
mUidTagRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.UID_TAG_STATS); mXtRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.XT_STATS_FIELD_NUMBER);
mUidRecorder.dumpDebugLocked(proto, NetworkStatsServiceDumpProto.UID_STATS_FIELD_NUMBER);
mUidTagRecorder.dumpDebugLocked(proto,
NetworkStatsServiceDumpProto.UID_TAG_STATS_FIELD_NUMBER);
proto.flush(); proto.flush();
} }
@@ -2135,8 +2145,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
for (int i = 0; i < ifaces.size(); i++) { for (int i = 0; i < ifaces.size(); i++) {
final long start = proto.start(tag); final long start = proto.start(tag);
proto.write(NetworkInterfaceProto.INTERFACE, ifaces.keyAt(i)); proto.write(NetworkInterfaceProto.INTERFACE_FIELD_NUMBER, ifaces.keyAt(i));
ifaces.valueAt(i).dumpDebug(proto, NetworkInterfaceProto.IDENTITIES); ifaces.valueAt(i).dumpDebug(proto, NetworkInterfaceProto.IDENTITIES_FIELD_NUMBER);
proto.end(start); proto.end(start);
} }

View File

@@ -23,7 +23,9 @@ import static android.telephony.TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NS
import static android.telephony.TelephonyManager.NETWORK_TYPE_LTE; import static android.telephony.TelephonyManager.NETWORK_TYPE_LTE;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyCallback; import android.telephony.TelephonyCallback;
import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyDisplayInfo;
@@ -43,6 +45,7 @@ import java.util.concurrent.Executor;
/** /**
* Helper class that watches for events that are triggered per subscription. * Helper class that watches for events that are triggered per subscription.
*/ */
@TargetApi(Build.VERSION_CODES.TIRAMISU)
public class NetworkStatsSubscriptionsMonitor extends public class NetworkStatsSubscriptionsMonitor extends
SubscriptionManager.OnSubscriptionsChangedListener { SubscriptionManager.OnSubscriptionsChangedListener {