[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:
lifr
2021-12-13 16:15:51 +08:00
parent e57289e936
commit 1a9a70085e

View File

@@ -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