Merge "Improve logging for NetworkStatsObservers"
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user