[MS30] Remove ServiceManager#getService dependency

Since TrafficStats is moving into the mainline module,
ServiceManager#getService can no longer be accessed.

This change use reflection to access getService, since
there is no offical way to get the service binder,
and TrafficStats is a static utility that doesn't have
the context to invoke Context#getSystemService.

This change also fixes minor lint errors.

Test: atest CtsNetTestCases:TrafficStatsTest
Bug: 204830222
Change-Id: I5caec42a71431b39f747fc791b8511d92e5cf7cc
This commit is contained in:
Junyu Lai
2021-12-28 16:18:43 +00:00
parent 6e782c7ad3
commit 3f7bb338bd

View File

@@ -17,6 +17,7 @@
package android.net; package android.net;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.annotation.TestApi; import android.annotation.TestApi;
@@ -27,8 +28,8 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context; import android.content.Context;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.os.Build; import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import com.android.server.NetworkManagementSocketTagger; import com.android.server.NetworkManagementSocketTagger;
@@ -36,6 +37,8 @@ import dalvik.system.SocketTagger;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.DatagramSocket; import java.net.DatagramSocket;
import java.net.Socket; import java.net.Socket;
import java.net.SocketException; import java.net.SocketException;
@@ -53,6 +56,7 @@ import java.net.SocketException;
* use {@link NetworkStatsManager} instead. * use {@link NetworkStatsManager} instead.
*/ */
public class TrafficStats { public class TrafficStats {
private static final String TAG = TrafficStats.class.getSimpleName();
/** /**
* The return value to indicate that the device does not support the statistic. * The return value to indicate that the device does not support the statistic.
*/ */
@@ -173,12 +177,25 @@ public class TrafficStats {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562)
private synchronized static INetworkStatsService getStatsService() { private synchronized static INetworkStatsService getStatsService() {
if (sStatsService == null) { if (sStatsService == null) {
sStatsService = INetworkStatsService.Stub.asInterface( sStatsService = getStatsBinder();
ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
} }
return sStatsService; return sStatsService;
} }
@Nullable
private static INetworkStatsService getStatsBinder() {
try {
final Method getServiceMethod = Class.forName("android.os.ServiceManager")
.getDeclaredMethod("getService", new Class[]{String.class});
final IBinder binder = (IBinder) getServiceMethod.invoke(
null, Context.NETWORK_STATS_SERVICE);
return INetworkStatsService.Stub.asInterface(binder);
} catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException
| InvocationTargetException e) {
throw new NullPointerException("Cannot get INetworkStatsService: " + e);
}
}
/** /**
* Snapshot of {@link NetworkStats} when the currently active profiling * Snapshot of {@link NetworkStats} when the currently active profiling
* session started, or {@code null} if no session active. * session started, or {@code null} if no session active.