Merge "[DU01]Remove INetworkManagementService from NetworkStatsService"
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.TrafficStats.KB_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.os.Trace.TRACE_TAG_NETWORK;
|
||||
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 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.setKernelCounterSet;
|
||||
|
||||
@@ -89,7 +90,6 @@ import android.content.pm.PackageManager;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.DataUsageRequest;
|
||||
import android.net.INetd;
|
||||
import android.net.INetworkManagementEventObserver;
|
||||
import android.net.INetworkStatsService;
|
||||
import android.net.INetworkStatsSession;
|
||||
import android.net.Network;
|
||||
@@ -106,6 +106,7 @@ import android.net.NetworkStatsCollection;
|
||||
import android.net.NetworkStatsHistory;
|
||||
import android.net.NetworkTemplate;
|
||||
import android.net.TelephonyNetworkSpecifier;
|
||||
import android.net.TetherStatsParcel;
|
||||
import android.net.TetheringManager;
|
||||
import android.net.TrafficStats;
|
||||
import android.net.UnderlyingNetworkInfo;
|
||||
@@ -120,12 +121,12 @@ import android.os.Handler;
|
||||
import android.os.HandlerExecutor;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.IBinder;
|
||||
import android.os.INetworkManagementService;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceSpecificException;
|
||||
import android.os.SystemClock;
|
||||
import android.os.Trace;
|
||||
import android.os.UserHandle;
|
||||
@@ -148,6 +149,7 @@ import android.util.proto.ProtoOutputStream;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
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.BinderUtils;
|
||||
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 final Context mContext;
|
||||
private final INetworkManagementService mNetworkManager;
|
||||
private final NetworkStatsFactory mStatsFactory;
|
||||
private final AlarmManager mAlarmManager;
|
||||
private final Clock mClock;
|
||||
@@ -223,6 +224,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
private final ContentObserver mContentObserver;
|
||||
private final ContentResolver mContentResolver;
|
||||
|
||||
protected INetd mNetd;
|
||||
private final AlertObserver mAlertObserver = new AlertObserver();
|
||||
|
||||
@VisibleForTesting
|
||||
public static final String 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,
|
||||
INetworkManagementService networkManager) {
|
||||
/** Creates a new NetworkStatsService */
|
||||
public static NetworkStatsService create(Context context) {
|
||||
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||
PowerManager.WakeLock wakeLock =
|
||||
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||
final INetd netd = INetd.Stub.asInterface(
|
||||
(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(),
|
||||
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(netd),
|
||||
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
|
||||
// does not register the local service. Use the create() helper above.
|
||||
@VisibleForTesting
|
||||
NetworkStatsService(Context context, INetworkManagementService networkManager,
|
||||
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
||||
NetworkStatsSettings settings, NetworkStatsFactory factory,
|
||||
NetworkStatsObservers statsObservers, File systemDir, File baseDir,
|
||||
@NonNull Dependencies deps) {
|
||||
NetworkStatsService(Context context, INetd netd, AlarmManager alarmManager,
|
||||
PowerManager.WakeLock wakeLock, Clock clock, NetworkStatsSettings settings,
|
||||
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
|
||||
File baseDir, @NonNull Dependencies deps) {
|
||||
mContext = Objects.requireNonNull(context, "missing Context");
|
||||
mNetworkManager = Objects.requireNonNull(networkManager,
|
||||
"missing INetworkManagementService");
|
||||
mNetd = Objects.requireNonNull(netd, "missing Netd");
|
||||
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
||||
mClock = Objects.requireNonNull(clock, "missing Clock");
|
||||
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
||||
@@ -506,6 +509,26 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
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() {
|
||||
synchronized (mStatsLock) {
|
||||
mSystemReady = true;
|
||||
@@ -551,9 +574,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
mContext.registerReceiver(mShutdownReceiver, shutdownFilter);
|
||||
|
||||
try {
|
||||
mNetworkManager.registerObserver(mAlertObserver);
|
||||
} catch (RemoteException e) {
|
||||
// ignored; service lives in system_server
|
||||
mNetd.registerUnsolicitedEventListener(mAlertObserver);
|
||||
} catch (RemoteException | ServiceSpecificException e) {
|
||||
Log.wtf(TAG, "Error registering event listener :", e);
|
||||
}
|
||||
|
||||
// schedule periodic pall alarm based on {@link NetworkStatsSettings#getPollInterval()}.
|
||||
@@ -641,13 +664,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
|
||||
* been transferred.
|
||||
*/
|
||||
private void registerGlobalAlert() {
|
||||
try {
|
||||
mNetworkManager.setGlobalAlert(mGlobalAlertBytes);
|
||||
mNetd.bandwidthSetGlobalAlert(mGlobalAlertBytes);
|
||||
} catch (IllegalStateException e) {
|
||||
Log.w(TAG, "problem registering for global alert: " + 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.
|
||||
*/
|
||||
@@ -1957,13 +1960,29 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
*/
|
||||
// TODO: Remove this by implementing {@link NetworkStatsProvider} for non-offloaded
|
||||
// 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 {
|
||||
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) {
|
||||
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
|
||||
@@ -2045,7 +2064,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
|
||||
@NonNull final INetworkStatsProvider mProvider;
|
||||
@NonNull private final Semaphore mSemaphore;
|
||||
@NonNull final INetworkManagementEventObserver mAlertObserver;
|
||||
@NonNull final AlertObserver mAlertObserver;
|
||||
@NonNull final CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> mStatsProviderCbList;
|
||||
|
||||
@NonNull private final Object mProviderStatsLock = new Object();
|
||||
@@ -2059,7 +2078,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
NetworkStatsProviderCallbackImpl(
|
||||
@NonNull String tag, @NonNull INetworkStatsProvider provider,
|
||||
@NonNull Semaphore semaphore,
|
||||
@NonNull INetworkManagementEventObserver alertObserver,
|
||||
@NonNull AlertObserver alertObserver,
|
||||
@NonNull CopyOnWriteArrayList<NetworkStatsProviderCallbackImpl> cbList)
|
||||
throws RemoteException {
|
||||
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
|
||||
// NETWORK_STATS_PROVIDER. Thus, no additional permission check is required.
|
||||
BinderUtils.withCleanCallingIdentity(() ->
|
||||
mAlertObserver.limitReached(LIMIT_GLOBAL_ALERT, null /* unused */));
|
||||
mAlertObserver.onQuotaLimitReached(LIMIT_GLOBAL_ALERT, null /* unused */));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user