[DU01]Remove INetworkManagementService from NetworkStatsService
NetworkStatsService is using INetworkManagementService APIs, which cannot be accessed after moving into the mainline module. So, replace and remove those hidden API usages. Bug: 209738761 Test: atest NetworkStatsServiceTest Change-Id: I5740f6d8a54e9a06c6dbb93203cb4c954383c3c8
This commit is contained in:
@@ -44,6 +44,7 @@ import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
|
|||||||
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
|
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
|
||||||
import static android.net.TrafficStats.KB_IN_BYTES;
|
import static android.net.TrafficStats.KB_IN_BYTES;
|
||||||
import static android.net.TrafficStats.MB_IN_BYTES;
|
import static android.net.TrafficStats.MB_IN_BYTES;
|
||||||
|
import static android.net.TrafficStats.UID_TETHERING;
|
||||||
import static android.net.TrafficStats.UNSUPPORTED;
|
import static android.net.TrafficStats.UNSUPPORTED;
|
||||||
import static android.os.Trace.TRACE_TAG_NETWORK;
|
import static android.os.Trace.TRACE_TAG_NETWORK;
|
||||||
import static android.provider.Settings.Global.NETSTATS_AUGMENT_ENABLED;
|
import static android.provider.Settings.Global.NETSTATS_AUGMENT_ENABLED;
|
||||||
@@ -70,7 +71,7 @@ import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
|
|||||||
import static android.text.format.DateUtils.SECOND_IN_MILLIS;
|
import static android.text.format.DateUtils.SECOND_IN_MILLIS;
|
||||||
|
|
||||||
import static com.android.net.module.util.NetworkCapabilitiesUtils.getDisplayTransport;
|
import static com.android.net.module.util.NetworkCapabilitiesUtils.getDisplayTransport;
|
||||||
import static com.android.server.NetworkManagementService.LIMIT_GLOBAL_ALERT;
|
import static com.android.net.module.util.NetworkStatsUtils.LIMIT_GLOBAL_ALERT;
|
||||||
import static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats;
|
import static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats;
|
||||||
import static com.android.server.NetworkManagementSocketTagger.setKernelCounterSet;
|
import static com.android.server.NetworkManagementSocketTagger.setKernelCounterSet;
|
||||||
|
|
||||||
@@ -89,7 +90,6 @@ import android.content.pm.PackageManager;
|
|||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.DataUsageRequest;
|
import android.net.DataUsageRequest;
|
||||||
import android.net.INetd;
|
import android.net.INetd;
|
||||||
import android.net.INetworkManagementEventObserver;
|
|
||||||
import android.net.INetworkStatsService;
|
import android.net.INetworkStatsService;
|
||||||
import android.net.INetworkStatsSession;
|
import android.net.INetworkStatsSession;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
@@ -106,6 +106,7 @@ import android.net.NetworkStatsCollection;
|
|||||||
import android.net.NetworkStatsHistory;
|
import android.net.NetworkStatsHistory;
|
||||||
import android.net.NetworkTemplate;
|
import android.net.NetworkTemplate;
|
||||||
import android.net.TelephonyNetworkSpecifier;
|
import android.net.TelephonyNetworkSpecifier;
|
||||||
|
import android.net.TetherStatsParcel;
|
||||||
import android.net.TetheringManager;
|
import android.net.TetheringManager;
|
||||||
import android.net.TrafficStats;
|
import android.net.TrafficStats;
|
||||||
import android.net.UnderlyingNetworkInfo;
|
import android.net.UnderlyingNetworkInfo;
|
||||||
@@ -120,12 +121,12 @@ import android.os.Handler;
|
|||||||
import android.os.HandlerExecutor;
|
import android.os.HandlerExecutor;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.INetworkManagementService;
|
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.os.Messenger;
|
import android.os.Messenger;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceSpecificException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
@@ -148,6 +149,7 @@ import android.util.proto.ProtoOutputStream;
|
|||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.util.FileRotator;
|
import com.android.internal.util.FileRotator;
|
||||||
|
import com.android.net.module.util.BaseNetdUnsolicitedEventListener;
|
||||||
import com.android.net.module.util.BestClock;
|
import com.android.net.module.util.BestClock;
|
||||||
import com.android.net.module.util.BinderUtils;
|
import com.android.net.module.util.BinderUtils;
|
||||||
import com.android.net.module.util.CollectionUtils;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
@@ -208,7 +210,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
private static final String TAG_NETSTATS_ERROR = "netstats_error";
|
private static final String TAG_NETSTATS_ERROR = "netstats_error";
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final INetworkManagementService mNetworkManager;
|
|
||||||
private final NetworkStatsFactory mStatsFactory;
|
private final NetworkStatsFactory mStatsFactory;
|
||||||
private final AlarmManager mAlarmManager;
|
private final AlarmManager mAlarmManager;
|
||||||
private final Clock mClock;
|
private final Clock mClock;
|
||||||
@@ -223,6 +224,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
private final ContentObserver mContentObserver;
|
private final ContentObserver mContentObserver;
|
||||||
private final ContentResolver mContentResolver;
|
private final ContentResolver mContentResolver;
|
||||||
|
|
||||||
|
protected INetd mNetd;
|
||||||
|
private final AlertObserver mAlertObserver = new AlertObserver();
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static final String ACTION_NETWORK_STATS_POLL =
|
public static final String ACTION_NETWORK_STATS_POLL =
|
||||||
"com.android.server.action.NETWORK_STATS_POLL";
|
"com.android.server.action.NETWORK_STATS_POLL";
|
||||||
@@ -405,15 +409,16 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NetworkStatsService create(Context context,
|
/** Creates a new NetworkStatsService */
|
||||||
INetworkManagementService networkManager) {
|
public static NetworkStatsService create(Context context) {
|
||||||
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||||
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||||
PowerManager.WakeLock wakeLock =
|
PowerManager.WakeLock wakeLock =
|
||||||
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||||
final INetd netd = INetd.Stub.asInterface(
|
final INetd netd = INetd.Stub.asInterface(
|
||||||
(IBinder) context.getSystemService(Context.NETD_SERVICE));
|
(IBinder) context.getSystemService(Context.NETD_SERVICE));
|
||||||
final NetworkStatsService service = new NetworkStatsService(context, networkManager,
|
final NetworkStatsService service = new NetworkStatsService(context,
|
||||||
|
INetd.Stub.asInterface((IBinder) context.getSystemService(Context.NETD_SERVICE)),
|
||||||
alarmManager, wakeLock, getDefaultClock(),
|
alarmManager, wakeLock, getDefaultClock(),
|
||||||
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(netd),
|
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(netd),
|
||||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
||||||
@@ -426,14 +431,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
// This must not be called outside of tests, even within the same package, as this constructor
|
// This must not be called outside of tests, even within the same package, as this constructor
|
||||||
// does not register the local service. Use the create() helper above.
|
// does not register the local service. Use the create() helper above.
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
NetworkStatsService(Context context, INetworkManagementService networkManager,
|
NetworkStatsService(Context context, INetd netd, AlarmManager alarmManager,
|
||||||
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
PowerManager.WakeLock wakeLock, Clock clock, NetworkStatsSettings settings,
|
||||||
NetworkStatsSettings settings, NetworkStatsFactory factory,
|
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
|
||||||
NetworkStatsObservers statsObservers, File systemDir, File baseDir,
|
File baseDir, @NonNull Dependencies deps) {
|
||||||
@NonNull Dependencies deps) {
|
|
||||||
mContext = Objects.requireNonNull(context, "missing Context");
|
mContext = Objects.requireNonNull(context, "missing Context");
|
||||||
mNetworkManager = Objects.requireNonNull(networkManager,
|
mNetd = Objects.requireNonNull(netd, "missing Netd");
|
||||||
"missing INetworkManagementService");
|
|
||||||
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
||||||
mClock = Objects.requireNonNull(clock, "missing Clock");
|
mClock = Objects.requireNonNull(clock, "missing Clock");
|
||||||
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
||||||
@@ -507,6 +510,26 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
new NetworkStatsManagerInternalImpl());
|
new NetworkStatsManagerInternalImpl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Observer that watches for {@link INetdUnsolicitedEventListener} alerts.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public class AlertObserver extends BaseNetdUnsolicitedEventListener {
|
||||||
|
@Override
|
||||||
|
public void onQuotaLimitReached(@NonNull String alertName, @NonNull String ifName) {
|
||||||
|
PermissionUtils.enforceNetworkStackPermission(mContext);
|
||||||
|
|
||||||
|
if (LIMIT_GLOBAL_ALERT.equals(alertName)) {
|
||||||
|
// kick off background poll to collect network stats unless there is already
|
||||||
|
// such a call pending; UID stats are handled during normal polling interval.
|
||||||
|
if (!mHandler.hasMessages(MSG_PERFORM_POLL_REGISTER_ALERT)) {
|
||||||
|
mHandler.sendEmptyMessageDelayed(MSG_PERFORM_POLL_REGISTER_ALERT,
|
||||||
|
mSettings.getPollDelay());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void systemReady() {
|
public void systemReady() {
|
||||||
synchronized (mStatsLock) {
|
synchronized (mStatsLock) {
|
||||||
mSystemReady = true;
|
mSystemReady = true;
|
||||||
@@ -552,9 +575,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
mContext.registerReceiver(mShutdownReceiver, shutdownFilter);
|
mContext.registerReceiver(mShutdownReceiver, shutdownFilter);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mNetworkManager.registerObserver(mAlertObserver);
|
mNetd.registerUnsolicitedEventListener(mAlertObserver);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException | ServiceSpecificException e) {
|
||||||
// ignored; service lives in system_server
|
Log.wtf(TAG, "Error registering event listener :", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// schedule periodic pall alarm based on {@link NetworkStatsSettings#getPollInterval()}.
|
// schedule periodic pall alarm based on {@link NetworkStatsSettings#getPollInterval()}.
|
||||||
@@ -642,13 +665,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register for a global alert that is delivered through {@link INetworkManagementEventObserver}
|
* Register for a global alert that is delivered through {@link AlertObserver}
|
||||||
* or {@link NetworkStatsProviderCallback#onAlertReached()} once a threshold amount of data has
|
* or {@link NetworkStatsProviderCallback#onAlertReached()} once a threshold amount of data has
|
||||||
* been transferred.
|
* been transferred.
|
||||||
*/
|
*/
|
||||||
private void registerGlobalAlert() {
|
private void registerGlobalAlert() {
|
||||||
try {
|
try {
|
||||||
mNetworkManager.setGlobalAlert(mGlobalAlertBytes);
|
mNetd.bandwidthSetGlobalAlert(mGlobalAlertBytes);
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
Log.w(TAG, "problem registering for global alert: " + e);
|
Log.w(TAG, "problem registering for global alert: " + e);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -1226,26 +1249,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Observer that watches for {@link INetworkManagementService} alerts.
|
|
||||||
*/
|
|
||||||
private final INetworkManagementEventObserver mAlertObserver = new BaseNetworkObserver() {
|
|
||||||
@Override
|
|
||||||
public void limitReached(String limitName, String iface) {
|
|
||||||
// only someone like NMS should be calling us
|
|
||||||
PermissionUtils.enforceNetworkStackPermission(mContext);
|
|
||||||
|
|
||||||
if (LIMIT_GLOBAL_ALERT.equals(limitName)) {
|
|
||||||
// kick off background poll to collect network stats unless there is already
|
|
||||||
// such a call pending; UID stats are handled during normal polling interval.
|
|
||||||
if (!mHandler.hasMessages(MSG_PERFORM_POLL_REGISTER_ALERT)) {
|
|
||||||
mHandler.sendEmptyMessageDelayed(MSG_PERFORM_POLL_REGISTER_ALERT,
|
|
||||||
mSettings.getPollDelay());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle collapsed RAT type changed event.
|
* Handle collapsed RAT type changed event.
|
||||||
*/
|
*/
|
||||||
@@ -1957,13 +1960,29 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
*/
|
*/
|
||||||
// TODO: Remove this by implementing {@link NetworkStatsProvider} for non-offloaded
|
// TODO: Remove this by implementing {@link NetworkStatsProvider} for non-offloaded
|
||||||
// tethering stats.
|
// tethering stats.
|
||||||
private NetworkStats getNetworkStatsTethering(int how) throws RemoteException {
|
private @NonNull NetworkStats getNetworkStatsTethering(int how) throws RemoteException {
|
||||||
|
// We only need to return per-UID stats. Per-device stats are already counted by
|
||||||
|
// interface counters.
|
||||||
|
if (how != STATS_PER_UID) {
|
||||||
|
return new NetworkStats(SystemClock.elapsedRealtime(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
|
||||||
try {
|
try {
|
||||||
return mNetworkManager.getNetworkStatsTethering(how);
|
final TetherStatsParcel[] tetherStatsParcels = mNetd.tetherGetStats();
|
||||||
|
for (TetherStatsParcel tetherStats : tetherStatsParcels) {
|
||||||
|
try {
|
||||||
|
stats.combineValues(new NetworkStats.Entry(tetherStats.iface, UID_TETHERING,
|
||||||
|
SET_DEFAULT, TAG_NONE, tetherStats.rxBytes, tetherStats.rxPackets,
|
||||||
|
tetherStats.txBytes, tetherStats.txPackets, 0L));
|
||||||
|
} catch (ArrayIndexOutOfBoundsException e) {
|
||||||
|
throw new IllegalStateException("invalid tethering stats " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
Log.wtf(TAG, "problem reading network stats", e);
|
Log.wtf(TAG, "problem reading network stats", e);
|
||||||
return new NetworkStats(0L, 10);
|
|
||||||
}
|
}
|
||||||
|
return stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: It is copied from ConnectivityService, consider refactor these check permission
|
// TODO: It is copied from ConnectivityService, consider refactor these check permission
|
||||||
@@ -2045,7 +2064,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
|
|
||||||
@NonNull final INetworkStatsProvider mProvider;
|
@NonNull final INetworkStatsProvider mProvider;
|
||||||
@NonNull private final Semaphore mSemaphore;
|
@NonNull private final Semaphore mSemaphore;
|
||||||
@NonNull final INetworkManagementEventObserver mAlertObserver;
|
@NonNull final AlertObserver mAlertObserver;
|
||||||
@NonNull final CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> mStatsProviderCbList;
|
@NonNull final CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> mStatsProviderCbList;
|
||||||
|
|
||||||
@NonNull private final Object mProviderStatsLock = new Object();
|
@NonNull private final Object mProviderStatsLock = new Object();
|
||||||
@@ -2059,7 +2078,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
NetworkStatsProviderCallbackImpl(
|
NetworkStatsProviderCallbackImpl(
|
||||||
@NonNull String tag, @NonNull INetworkStatsProvider provider,
|
@NonNull String tag, @NonNull INetworkStatsProvider provider,
|
||||||
@NonNull Semaphore semaphore,
|
@NonNull Semaphore semaphore,
|
||||||
@NonNull INetworkManagementEventObserver alertObserver,
|
@NonNull AlertObserver alertObserver,
|
||||||
@NonNull CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> cbList)
|
@NonNull CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> cbList)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
mTag = tag;
|
mTag = tag;
|
||||||
@@ -2107,7 +2126,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
// This binder object can only have been obtained by a process that holds
|
// This binder object can only have been obtained by a process that holds
|
||||||
// NETWORK_STATS_PROVIDER. Thus, no additional permission check is required.
|
// NETWORK_STATS_PROVIDER. Thus, no additional permission check is required.
|
||||||
BinderUtils.withCleanCallingIdentity(() ->
|
BinderUtils.withCleanCallingIdentity(() ->
|
||||||
mAlertObserver.limitReached(LIMIT_GLOBAL_ALERT, null /* unused */));
|
mAlertObserver.onQuotaLimitReached(LIMIT_GLOBAL_ALERT, null /* unused */));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user