DO NOT MERGE [DPM] DO uses batch token to retrieve network logs, and can retrieve the same batch many times
am: bbf352a2c1
Change-Id: I6df35873ec30044780fab02329bab327af8df161
This commit is contained in:
@@ -284,6 +284,27 @@ public class DeviceAdminReceiver extends BroadcastReceiver {
|
|||||||
public static final String ACTION_NETWORK_LOGS_AVAILABLE
|
public static final String ACTION_NETWORK_LOGS_AVAILABLE
|
||||||
= "android.app.action.NETWORK_LOGS_AVAILABLE";
|
= "android.app.action.NETWORK_LOGS_AVAILABLE";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@code long} containing a token of the current batch of network logs, that has to be used
|
||||||
|
* to retrieve the batch of logs by the device owner.
|
||||||
|
*
|
||||||
|
* @see #ACTION_NETWORK_LOGS_AVAILABLE
|
||||||
|
* @see DevicePolicyManager#retrieveNetworkLogs
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final String EXTRA_NETWORK_LOGS_TOKEN =
|
||||||
|
"android.app.extra.EXTRA_NETWORK_LOGS_TOKEN";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An {@code int} count representing a total count of network logs inside the current batch of
|
||||||
|
* network logs.
|
||||||
|
*
|
||||||
|
* @see #ACTION_NETWORK_LOGS_AVAILABLE
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final String EXTRA_NETWORK_LOGS_COUNT =
|
||||||
|
"android.app.extra.EXTRA_NETWORK_LOGS_COUNT";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A string containing the SHA-256 hash of the bugreport file.
|
* A string containing the SHA-256 hash of the bugreport file.
|
||||||
*
|
*
|
||||||
@@ -644,19 +665,22 @@ public class DeviceAdminReceiver extends BroadcastReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a new batch of network logs can be retrieved. This callback method will only ever
|
* Called each time a new batch of network logs can be retrieved. This callback method will only
|
||||||
* be called when network logging is enabled. The logs can only be retrieved while network
|
* ever be called when network logging is enabled. The logs can only be retrieved while network
|
||||||
* logging is enabled.
|
* logging is enabled.
|
||||||
*
|
*
|
||||||
* <p>This callback is only applicable to device owners.
|
* <p>This callback is only applicable to device owners.
|
||||||
*
|
*
|
||||||
* @param context The running context as per {@link #onReceive}.
|
* @param context The running context as per {@link #onReceive}.
|
||||||
* @param intent The received intent as per {@link #onReceive}.
|
* @param intent The received intent as per {@link #onReceive}.
|
||||||
|
* @param batchToken The token representing the current batch of network logs.
|
||||||
|
* @param networkLogsCount The total count of events in the current batch of network logs.
|
||||||
* @see DevicePolicyManager#retrieveNetworkLogs(ComponentName)
|
* @see DevicePolicyManager#retrieveNetworkLogs(ComponentName)
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public void onNetworkLogsAvailable(Context context, Intent intent) {
|
public void onNetworkLogsAvailable(Context context, Intent intent, long batchToken,
|
||||||
|
int networkLogsCount) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -714,7 +738,9 @@ public class DeviceAdminReceiver extends BroadcastReceiver {
|
|||||||
} else if (ACTION_SECURITY_LOGS_AVAILABLE.equals(action)) {
|
} else if (ACTION_SECURITY_LOGS_AVAILABLE.equals(action)) {
|
||||||
onSecurityLogsAvailable(context, intent);
|
onSecurityLogsAvailable(context, intent);
|
||||||
} else if (ACTION_NETWORK_LOGS_AVAILABLE.equals(action)) {
|
} else if (ACTION_NETWORK_LOGS_AVAILABLE.equals(action)) {
|
||||||
onNetworkLogsAvailable(context, intent);
|
long batchToken = intent.getLongExtra(EXTRA_NETWORK_LOGS_TOKEN, -1);
|
||||||
|
int networkLogsCount = intent.getIntExtra(EXTRA_NETWORK_LOGS_COUNT, 0);
|
||||||
|
onNetworkLogsAvailable(context, intent, batchToken, networkLogsCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6621,8 +6621,6 @@ public class DevicePolicyManager {
|
|||||||
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
|
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
|
||||||
* @param enabled whether network logging should be enabled or not.
|
* @param enabled whether network logging should be enabled or not.
|
||||||
* @throws {@link SecurityException} if {@code admin} is not a device owner.
|
* @throws {@link SecurityException} if {@code admin} is not a device owner.
|
||||||
* @throws {@link RemoteException} if network logging could not be enabled or disabled due to
|
|
||||||
* the logging service not being available
|
|
||||||
* @see #retrieveNetworkLogs
|
* @see #retrieveNetworkLogs
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
@@ -6655,7 +6653,10 @@ public class DevicePolicyManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by device owner to retrieve a new batch of network logging events.
|
* Called by device owner to retrieve the most recent batch of network logging events.
|
||||||
|
* A device owner has to provide a batchToken provided as part of
|
||||||
|
* {@link DeviceAdminReceiver#onNetworkLogsAvailable} callback. If the token doesn't match the
|
||||||
|
* token of the most recent available batch of logs, {@code null} will be returned.
|
||||||
*
|
*
|
||||||
* <p> {@link NetworkEvent} can be one of {@link DnsEvent} or {@link ConnectEvent}.
|
* <p> {@link NetworkEvent} can be one of {@link DnsEvent} or {@link ConnectEvent}.
|
||||||
*
|
*
|
||||||
@@ -6666,16 +6667,20 @@ public class DevicePolicyManager {
|
|||||||
* {@link DeviceAdminReceiver#onNetworkLogsAvailable}.
|
* {@link DeviceAdminReceiver#onNetworkLogsAvailable}.
|
||||||
*
|
*
|
||||||
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
|
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
|
||||||
|
* @param batchToken A token of the batch to retrieve
|
||||||
* @return A new batch of network logs which is a list of {@link NetworkEvent}. Returns
|
* @return A new batch of network logs which is a list of {@link NetworkEvent}. Returns
|
||||||
* {@code null} if there's no batch currently awaiting for retrieval or if logging is disabled.
|
* {@code null} if the batch represented by batchToken is no longer available or if
|
||||||
|
* logging is disabled.
|
||||||
* @throws {@link SecurityException} if {@code admin} is not a device owner.
|
* @throws {@link SecurityException} if {@code admin} is not a device owner.
|
||||||
|
* @see DeviceAdminReceiver#onNetworkLogsAvailable
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public List<NetworkEvent> retrieveNetworkLogs(@NonNull ComponentName admin) {
|
public @Nullable List<NetworkEvent> retrieveNetworkLogs(@NonNull ComponentName admin,
|
||||||
|
long batchToken) {
|
||||||
throwIfParentInstance("retrieveNetworkLogs");
|
throwIfParentInstance("retrieveNetworkLogs");
|
||||||
try {
|
try {
|
||||||
return mService.retrieveNetworkLogs(admin);
|
return mService.retrieveNetworkLogs(admin, batchToken);
|
||||||
} catch (RemoteException re) {
|
} catch (RemoteException re) {
|
||||||
throw re.rethrowFromSystemServer();
|
throw re.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -315,5 +315,5 @@ interface IDevicePolicyManager {
|
|||||||
|
|
||||||
void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled);
|
void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled);
|
||||||
boolean isNetworkLoggingEnabled(in ComponentName admin);
|
boolean isNetworkLoggingEnabled(in ComponentName admin);
|
||||||
List<NetworkEvent> retrieveNetworkLogs(in ComponentName admin);
|
List<NetworkEvent> retrieveNetworkLogs(in ComponentName admin, long batchToken);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -488,9 +488,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
* to listen for events.
|
* to listen for events.
|
||||||
*/
|
*/
|
||||||
if (Intent.ACTION_USER_STARTED.equals(action)
|
if (Intent.ACTION_USER_STARTED.equals(action)
|
||||||
&& userHandle == mOwners.getDeviceOwnerUserId()
|
&& userHandle == mOwners.getDeviceOwnerUserId()) {
|
||||||
&& isNetworkLoggingEnabledInternal()) {
|
synchronized (DevicePolicyManagerService.this) {
|
||||||
setNetworkLoggingActiveInternal(true);
|
if (isNetworkLoggingEnabledInternalLocked()) {
|
||||||
|
setNetworkLoggingActiveInternal(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (Intent.ACTION_BOOT_COMPLETED.equals(action)
|
if (Intent.ACTION_BOOT_COMPLETED.equals(action)
|
||||||
&& userHandle == mOwners.getDeviceOwnerUserId()
|
&& userHandle == mOwners.getDeviceOwnerUserId()
|
||||||
@@ -9433,7 +9436,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
Preconditions.checkNotNull(admin);
|
Preconditions.checkNotNull(admin);
|
||||||
ensureDeviceOwnerManagingSingleUser(admin);
|
ensureDeviceOwnerManagingSingleUser(admin);
|
||||||
|
|
||||||
if (enabled == isNetworkLoggingEnabledInternal()) {
|
if (enabled == isNetworkLoggingEnabledInternalLocked()) {
|
||||||
// already in the requested state
|
// already in the requested state
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -9474,11 +9477,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
Preconditions.checkNotNull(admin);
|
Preconditions.checkNotNull(admin);
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
|
getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
|
||||||
return isNetworkLoggingEnabledInternal();
|
return isNetworkLoggingEnabledInternalLocked();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized boolean isNetworkLoggingEnabledInternal() {
|
private boolean isNetworkLoggingEnabledInternalLocked() {
|
||||||
ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
|
ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
|
||||||
return (deviceOwner != null) && deviceOwner.isNetworkLoggingEnabled;
|
return (deviceOwner != null) && deviceOwner.isNetworkLoggingEnabled;
|
||||||
}
|
}
|
||||||
@@ -9489,7 +9492,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
* Ideally this would be done with ParceledList, however it only supports homogeneous types.
|
* Ideally this would be done with ParceledList, however it only supports homogeneous types.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public synchronized List<NetworkEvent> retrieveNetworkLogs(ComponentName admin) {
|
public synchronized List<NetworkEvent> retrieveNetworkLogs(ComponentName admin,
|
||||||
|
long batchToken) {
|
||||||
if (!mHasFeature) {
|
if (!mHasFeature) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -9499,6 +9503,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
if (mNetworkLogger == null) {
|
if (mNetworkLogger == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return isNetworkLoggingEnabledInternal() ? mNetworkLogger.retrieveLogs() : null;
|
return isNetworkLoggingEnabledInternalLocked()
|
||||||
|
? mNetworkLogger.retrieveLogs(batchToken)
|
||||||
|
: null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ final class NetworkLogger {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<NetworkEvent> retrieveLogs() {
|
List<NetworkEvent> retrieveLogs(long batchToken) {
|
||||||
return mNetworkLoggingHandler.retrieveFullLogBatch();
|
return mNetworkLoggingHandler.retrieveFullLogBatch(batchToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,11 +55,15 @@ final class NetworkLoggingHandler extends Handler {
|
|||||||
private final DevicePolicyManagerService mDpm;
|
private final DevicePolicyManagerService mDpm;
|
||||||
|
|
||||||
// threadsafe as it's Handler's thread confined
|
// threadsafe as it's Handler's thread confined
|
||||||
|
@GuardedBy("this")
|
||||||
private ArrayList<NetworkEvent> mNetworkEvents = new ArrayList<NetworkEvent>();
|
private ArrayList<NetworkEvent> mNetworkEvents = new ArrayList<NetworkEvent>();
|
||||||
|
|
||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
private ArrayList<NetworkEvent> mFullBatch;
|
private ArrayList<NetworkEvent> mFullBatch;
|
||||||
|
|
||||||
|
@GuardedBy("this")
|
||||||
|
private long currentFullBatchToken;
|
||||||
|
|
||||||
NetworkLoggingHandler(Looper looper, DevicePolicyManagerService dpm) {
|
NetworkLoggingHandler(Looper looper, DevicePolicyManagerService dpm) {
|
||||||
super(looper);
|
super(looper);
|
||||||
mDpm = dpm;
|
mDpm = dpm;
|
||||||
@@ -97,17 +101,21 @@ final class NetworkLoggingHandler extends Handler {
|
|||||||
scheduleBatchFinalization(BATCH_FINALIZATION_TIMEOUT_MS);
|
scheduleBatchFinalization(BATCH_FINALIZATION_TIMEOUT_MS);
|
||||||
// notify DO that there's a new non-empty batch waiting
|
// notify DO that there's a new non-empty batch waiting
|
||||||
if (mFullBatch.size() > 0) {
|
if (mFullBatch.size() > 0) {
|
||||||
mDpm.sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE,
|
currentFullBatchToken++;
|
||||||
/* extras */ null);
|
Bundle extras = new Bundle();
|
||||||
|
extras.putLong(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_TOKEN, currentFullBatchToken);
|
||||||
|
extras.putInt(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_COUNT, mFullBatch.size());
|
||||||
|
mDpm.sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE, extras);
|
||||||
} else {
|
} else {
|
||||||
mFullBatch = null;
|
mFullBatch = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized List<NetworkEvent> retrieveFullLogBatch() {
|
synchronized List<NetworkEvent> retrieveFullLogBatch(long batchToken) {
|
||||||
List<NetworkEvent> ret = mFullBatch;
|
if (batchToken != currentFullBatchToken) {
|
||||||
mFullBatch = null;
|
return null;
|
||||||
return ret;
|
}
|
||||||
|
return mFullBatch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user