diff --git a/service-t/src/com/android/server/net/NetworkStatsObservers.java b/service-t/src/com/android/server/net/NetworkStatsObservers.java index fdfc893f57..d974a3b434 100644 --- a/service-t/src/com/android/server/net/NetworkStatsObservers.java +++ b/service-t/src/com/android/server/net/NetworkStatsObservers.java @@ -18,6 +18,7 @@ package com.android.server.net; import static android.app.usage.NetworkStatsManager.MIN_THRESHOLD_BYTES; +import android.annotation.NonNull; import android.app.usage.NetworkStatsManager; import android.content.Context; import android.content.pm.PackageManager; @@ -38,6 +39,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.util.ArrayMap; +import android.util.IndentingPrintWriter; import android.util.Log; import android.util.SparseArray; @@ -52,6 +54,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ class NetworkStatsObservers { private static final String TAG = "NetworkStatsObservers"; + private static final boolean LOG = true; private static final boolean LOGV = false; private static final int MSG_REGISTER = 1; @@ -77,13 +80,15 @@ class NetworkStatsObservers { * * @return the normalized request wrapped within {@link RequestInfo}. */ - public DataUsageRequest register(Context context, DataUsageRequest inputRequest, - IUsageCallback callback, int callingUid, @NetworkStatsAccess.Level int accessLevel) { + public DataUsageRequest register(@NonNull Context context, + @NonNull DataUsageRequest inputRequest, @NonNull IUsageCallback callback, + int callingPid, int callingUid, @NonNull String callingPackage, + @NetworkStatsAccess.Level int accessLevel) { DataUsageRequest request = buildRequest(context, inputRequest, callingUid); - RequestInfo requestInfo = buildRequestInfo(request, callback, callingUid, - accessLevel); + RequestInfo requestInfo = buildRequestInfo(request, callback, callingPid, callingUid, + callingPackage, accessLevel); - if (LOGV) Log.v(TAG, "Registering observer for " + request); + if (LOG) Log.d(TAG, "Registering observer for " + requestInfo); getHandler().sendMessage(mHandler.obtainMessage(MSG_REGISTER, requestInfo)); return request; } @@ -172,7 +177,7 @@ class NetworkStatsObservers { RequestInfo requestInfo; requestInfo = mDataUsageRequests.get(request.requestId); if (requestInfo == null) { - if (LOGV) Log.v(TAG, "Trying to unregister unknown request " + request); + if (LOG) Log.d(TAG, "Trying to unregister unknown request " + request); return; } if (Process.SYSTEM_UID != callingUid && requestInfo.mCallingUid != callingUid) { @@ -180,7 +185,7 @@ class NetworkStatsObservers { return; } - if (LOGV) Log.v(TAG, "Unregistering " + request); + if (LOG) Log.d(TAG, "Unregistering " + requestInfo); mDataUsageRequests.remove(request.requestId); requestInfo.unlinkDeathRecipient(); requestInfo.callCallback(NetworkStatsManager.CALLBACK_RELEASED); @@ -214,18 +219,19 @@ class NetworkStatsObservers { } private RequestInfo buildRequestInfo(DataUsageRequest request, IUsageCallback callback, - int callingUid, @NetworkStatsAccess.Level int accessLevel) { + int callingPid, int callingUid, @NonNull String callingPackage, + @NetworkStatsAccess.Level int accessLevel) { if (accessLevel <= NetworkStatsAccess.Level.USER) { - return new UserUsageRequestInfo(this, request, callback, callingUid, - accessLevel); + return new UserUsageRequestInfo(this, request, callback, callingPid, + callingUid, callingPackage, accessLevel); } else { // Safety check in case a new access level is added and we forgot to update this if (accessLevel < NetworkStatsAccess.Level.DEVICESUMMARY) { throw new IllegalArgumentException( "accessLevel " + accessLevel + " is less than DEVICESUMMARY."); } - return new NetworkUsageRequestInfo(this, request, callback, callingUid, - accessLevel); + return new NetworkUsageRequestInfo(this, request, callback, callingPid, + callingUid, callingPackage, accessLevel); } } @@ -237,18 +243,22 @@ class NetworkStatsObservers { private final NetworkStatsObservers mStatsObserver; protected final DataUsageRequest mRequest; private final IUsageCallback mCallback; + protected final int mCallingPid; protected final int mCallingUid; + protected final String mCallingPackage; protected final @NetworkStatsAccess.Level int mAccessLevel; protected NetworkStatsRecorder mRecorder; protected NetworkStatsCollection mCollection; RequestInfo(NetworkStatsObservers statsObserver, DataUsageRequest request, - IUsageCallback callback, int callingUid, - @NetworkStatsAccess.Level int accessLevel) { + IUsageCallback callback, int callingPid, int callingUid, + @NonNull String callingPackage, @NetworkStatsAccess.Level int accessLevel) { mStatsObserver = statsObserver; mRequest = request; mCallback = callback; + mCallingPid = callingPid; mCallingUid = callingUid; + mCallingPackage = callingPackage; mAccessLevel = accessLevel; try { @@ -269,7 +279,8 @@ class NetworkStatsObservers { @Override public String toString() { - return "RequestInfo from uid:" + mCallingUid + return "RequestInfo from pid/uid:" + mCallingPid + "/" + mCallingUid + + "(" + mCallingPackage + ")" + " for " + mRequest + " accessLevel:" + mAccessLevel; } @@ -338,9 +349,10 @@ class NetworkStatsObservers { private static class NetworkUsageRequestInfo extends RequestInfo { NetworkUsageRequestInfo(NetworkStatsObservers statsObserver, DataUsageRequest request, - IUsageCallback callback, int callingUid, - @NetworkStatsAccess.Level int accessLevel) { - super(statsObserver, request, callback, callingUid, accessLevel); + IUsageCallback callback, int callingPid, int callingUid, + @NonNull String callingPackage, @NetworkStatsAccess.Level int accessLevel) { + super(statsObserver, request, callback, callingPid, callingUid, callingPackage, + accessLevel); } @Override @@ -380,9 +392,10 @@ class NetworkStatsObservers { private static class UserUsageRequestInfo extends RequestInfo { UserUsageRequestInfo(NetworkStatsObservers statsObserver, DataUsageRequest request, - IUsageCallback callback, int callingUid, - @NetworkStatsAccess.Level int accessLevel) { - super(statsObserver, request, callback, callingUid, accessLevel); + IUsageCallback callback, int callingPid, int callingUid, + @NonNull String callingPackage, @NetworkStatsAccess.Level int accessLevel) { + super(statsObserver, request, callback, callingPid, callingUid, + callingPackage, accessLevel); } @Override @@ -448,4 +461,10 @@ class NetworkStatsObservers { mCurrentTime = currentTime; } } + + public void dump(IndentingPrintWriter pw) { + for (int i = 0; i < mDataUsageRequests.size(); i++) { + pw.println(mDataUsageRequests.valueAt(i)); + } + } } diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index 82b1fb5ad8..217a9a6ce6 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -1279,13 +1279,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub { Objects.requireNonNull(request.template, "NetworkTemplate is null"); Objects.requireNonNull(callback, "callback is null"); - int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); @NetworkStatsAccess.Level int accessLevel = checkAccessLevel(callingPackage); DataUsageRequest normalizedRequest; final long token = Binder.clearCallingIdentity(); try { normalizedRequest = mStatsObservers.register(mContext, - request, callback, callingUid, accessLevel); + request, callback, callingPid, callingUid, callingPackage, accessLevel); } finally { Binder.restoreCallingIdentity(token); } @@ -2098,6 +2099,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } }); pw.decreaseIndent(); + pw.println(); + + pw.println("Stats Observers:"); + pw.increaseIndent(); + mStatsObservers.dump(pw); + pw.decreaseIndent(); + pw.println(); pw.println("Dev stats:"); pw.increaseIndent(); diff --git a/tests/unit/java/com/android/server/net/NetworkStatsObserversTest.java b/tests/unit/java/com/android/server/net/NetworkStatsObserversTest.java index 5f9d1ff19f..13a85e875d 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsObserversTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsObserversTest.java @@ -86,11 +86,19 @@ public class NetworkStatsObserversTest { private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1); private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2); + private static final int PID_SYSTEM = 1234; + private static final int PID_RED = 1235; + private static final int PID_BLUE = 1236; + private static final int UID_RED = UserHandle.PER_USER_RANGE + 1; private static final int UID_BLUE = UserHandle.PER_USER_RANGE + 2; private static final int UID_GREEN = UserHandle.PER_USER_RANGE + 3; private static final int UID_ANOTHER_USER = 2 * UserHandle.PER_USER_RANGE + 4; + private static final String PACKAGE_SYSTEM = "android"; + private static final String PACKAGE_RED = "RED"; + private static final String PACKAGE_BLUE = "BLUE"; + private static final long WAIT_TIMEOUT_MS = 500; private static final long THRESHOLD_BYTES = 2 * MB_IN_BYTES; private static final long BASE_BYTES = 7 * MB_IN_BYTES; @@ -131,14 +139,15 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdTooLowBytes); final DataUsageRequest requestByApp = mStatsObservers.register(mContext, inputRequest, - mUsageCallback, UID_RED, NetworkStatsAccess.Level.DEVICE); + mUsageCallback, PID_RED , UID_RED, PACKAGE_RED, NetworkStatsAccess.Level.DEVICE); assertTrue(requestByApp.requestId > 0); assertTrue(Objects.equals(sTemplateWifi, requestByApp.template)); assertEquals(thresholdTooLowBytes, requestByApp.thresholdInBytes); // Verify the threshold requested by system uid won't be overridden. final DataUsageRequest requestBySystem = mStatsObservers.register(mContext, inputRequest, - mUsageCallback, Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + mUsageCallback, PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, + NetworkStatsAccess.Level.DEVICE); assertTrue(requestBySystem.requestId > 0); assertTrue(Objects.equals(sTemplateWifi, requestBySystem.template)); assertEquals(1, requestBySystem.thresholdInBytes); @@ -151,7 +160,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, highThresholdBytes); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateWifi, request.template)); assertEquals(highThresholdBytes, request.thresholdInBytes); @@ -163,13 +172,13 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, THRESHOLD_BYTES); DataUsageRequest request1 = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request1.requestId > 0); assertTrue(Objects.equals(sTemplateWifi, request1.template)); assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes); DataUsageRequest request2 = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request2.requestId > request1.requestId); assertTrue(Objects.equals(sTemplateWifi, request2.template)); assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes); @@ -189,7 +198,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -209,7 +218,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - UID_RED, NetworkStatsAccess.Level.DEVICE); + PID_RED, UID_RED, PACKAGE_RED, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -237,7 +246,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -261,7 +270,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -291,7 +300,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); + PID_SYSTEM, Process.SYSTEM_UID, PACKAGE_SYSTEM, NetworkStatsAccess.Level.DEVICE); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -322,7 +331,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - UID_RED, NetworkStatsAccess.Level.DEFAULT); + PID_RED, UID_RED, PACKAGE_SYSTEM , NetworkStatsAccess.Level.DEFAULT); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -355,7 +364,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - UID_BLUE, NetworkStatsAccess.Level.DEFAULT); + PID_BLUE, UID_BLUE, PACKAGE_BLUE, NetworkStatsAccess.Level.DEFAULT); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -387,7 +396,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - UID_BLUE, NetworkStatsAccess.Level.USER); + PID_BLUE, UID_BLUE, PACKAGE_BLUE, NetworkStatsAccess.Level.USER); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); @@ -420,7 +429,7 @@ public class NetworkStatsObserversTest { DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES); DataUsageRequest request = mStatsObservers.register(mContext, inputRequest, mUsageCallback, - UID_RED, NetworkStatsAccess.Level.USER); + PID_RED, UID_RED, PACKAGE_RED, NetworkStatsAccess.Level.USER); assertTrue(request.requestId > 0); assertTrue(Objects.equals(sTemplateImsi1, request.template)); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);