diff options
author | Irina Dumitrescu <irinaid@google.com> | 2018-06-08 14:51:12 +0100 |
---|---|---|
committer | Irina Dumitrescu <irinaid@google.com> | 2018-06-20 16:23:58 +0100 |
commit | 24ed35cd83b0a71fab33c140e9c5cc64cc5031db (patch) | |
tree | 8eb08edb4a642629d485dace5b590ac28cb8d51a | |
parent | fd3618a971cfd690dbeddfb502fce076566ff498 (diff) |
Add dpm force-network-logs command to force network logs retrieval.
This is useful because logs are batched every 1.5-2hrs if there are
not enough logs to fill up a batch. The command is throttled at
10 seconds as a spam prevention measure.
Bug: 62251154
Test: in adb shell run dpm force-network-logs. Observe a new batch
being created in the phone directory
/storage/emulated/0/Android/data/com.afwsamples.testdpc/files/. Also
observe a fresh batch is being displayed on the phone in the TestDPC
app, under "Retrieve network logs".
Change-Id: I5ff9d5c78497ea81533b5248816b4d6e160d338f
7 files changed, 89 insertions, 1 deletions
diff --git a/cmds/dpm/src/com/android/commands/dpm/Dpm.java b/cmds/dpm/src/com/android/commands/dpm/Dpm.java index 7c1a5557a1e9..376b13cd371e 100644 --- a/cmds/dpm/src/com/android/commands/dpm/Dpm.java +++ b/cmds/dpm/src/com/android/commands/dpm/Dpm.java @@ -46,6 +46,7 @@ public final class Dpm extends BaseCommand { private static final String COMMAND_SET_PROFILE_OWNER = "set-profile-owner"; private static final String COMMAND_REMOVE_ACTIVE_ADMIN = "remove-active-admin"; private static final String COMMAND_CLEAR_FREEZE_PERIOD_RECORD = "clear-freeze-period-record"; + private static final String COMMAND_FORCE_NETWORK_LOGS = "force-network-logs"; private static final String COMMAND_FORCE_SECURITY_LOGS = "force-security-logs"; private IDevicePolicyManager mDevicePolicyManager; @@ -84,6 +85,9 @@ public final class Dpm extends BaseCommand { "feature development to prevent triggering restriction on setting freeze " + "periods.\n" + "\n" + + "dpm " + COMMAND_FORCE_NETWORK_LOGS + ": makes all network logs available to " + + "the DPC and triggers DeviceAdminReceiver.onNetworkLogsAvailable() if needed.\n" + + "\n" + "dpm " + COMMAND_FORCE_SECURITY_LOGS + ": makes all security logs available to " + "the DPC and triggers DeviceAdminReceiver.onSecurityLogsAvailable() if needed."); } @@ -114,6 +118,9 @@ public final class Dpm extends BaseCommand { case COMMAND_CLEAR_FREEZE_PERIOD_RECORD: runClearFreezePeriodRecord(); break; + case COMMAND_FORCE_NETWORK_LOGS: + runForceNetworkLogs(); + break; case COMMAND_FORCE_SECURITY_LOGS: runForceSecurityLogs(); break; @@ -122,6 +129,18 @@ public final class Dpm extends BaseCommand { } } + private void runForceNetworkLogs() throws RemoteException, InterruptedException { + while (true) { + final long toWait = mDevicePolicyManager.forceNetworkLogs(); + if (toWait == 0) { + break; + } + System.out.println("We have to wait for " + toWait + " milliseconds..."); + Thread.sleep(toWait); + } + System.out.println("Success"); + } + private void runForceSecurityLogs() throws RemoteException, InterruptedException { while (true) { final long toWait = mDevicePolicyManager.forceSecurityLogs(); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ff38c1f37007..7ba444729bfc 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -8300,6 +8300,22 @@ public class DevicePolicyManager { } /** + * Makes all accumulated network logs available to DPC in a new batch. + * Only callable by ADB. If throttled, returns time to wait in milliseconds, otherwise 0. + * @hide + */ + public long forceNetworkLogs() { + if (mService == null) { + return -1; + } + try { + return mService.forceNetworkLogs(); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** * Forces a batch of security logs to be fetched from logd and makes it available for DPC. * Only callable by ADB. If throttled, returns time to wait in milliseconds, otherwise 0. * @hide diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 37508cdc1119..e3b160fd6fe1 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -347,6 +347,7 @@ interface IDevicePolicyManager { boolean isSecurityLoggingEnabled(in ComponentName admin); ParceledListSlice retrieveSecurityLogs(in ComponentName admin); ParceledListSlice retrievePreRebootSecurityLogs(in ComponentName admin); + long forceNetworkLogs(); long forceSecurityLogs(); boolean isUninstallInQueue(String packageName); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index 1c9782fa5565..84de6b4b5281 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -152,6 +152,11 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { } @Override + public long forceNetworkLogs() { + return 0; + } + + @Override public long forceSecurityLogs() { return 0; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 414cf478f84d..20147d2a2eb6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -10694,7 +10694,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } } - return false; } @@ -12282,6 +12281,20 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + @Override + public long forceNetworkLogs() { + enforceShell("forceNetworkLogs"); + synchronized (getLockObject()) { + if (!isNetworkLoggingEnabledInternalLocked()) { + throw new IllegalStateException("logging is not available"); + } + if (mNetworkLogger != null) { + return mNetworkLogger.forceBatchFinalization(); + } + return 0; + } + } + /** Pauses security and network logging if there are unaffiliated users on the device */ private void maybePauseDeviceWideLoggingLocked() { if (!areAllUsersAffiliatedWithDeviceLocked()) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java index 0967652fb215..4514492c6ed0 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java @@ -187,4 +187,8 @@ final class NetworkLogger { List<NetworkEvent> retrieveLogs(long batchToken) { return mNetworkLoggingHandler.retrieveFullLogBatch(batchToken); } + + long forceBatchFinalization() { + return mNetworkLoggingHandler.forceBatchFinalization(); + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java index f91f959d9938..0a7070ffe4f6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java @@ -16,6 +16,8 @@ package com.android.server.devicepolicy; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + import android.app.AlarmManager; import android.app.AlarmManager.OnAlarmListener; import android.app.admin.DeviceAdminReceiver; @@ -33,6 +35,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; /** * A Handler class for managing network logging on a background thread. @@ -60,6 +63,12 @@ final class NetworkLoggingHandler extends Handler { /** Delay after which older batches get discarded after a retrieval. */ private static final long RETRIEVED_BATCH_DISCARD_DELAY_MS = 5 * 60 * 1000; // 5m + /** Throttle batch finalization to 10 seconds.*/ + private static final long FORCE_FETCH_THROTTLE_NS = TimeUnit.SECONDS.toNanos(10); + /** Timestamp of the last call to finalise a batch. Used for throttling forced finalization.*/ + @GuardedBy("this") + private long mLastFinalizationNanos = -1; + /** Do not call into mDpm with locks held */ private final DevicePolicyManagerService mDpm; private final AlarmManager mAlarmManager; @@ -155,6 +164,26 @@ final class NetworkLoggingHandler extends Handler { + "ms from now."); } + /** + * Forces batch finalisation. Throttled to 10 seconds per batch finalisation. + * @return the number of milliseconds to wait until batch finalisation can be forced. + */ + long forceBatchFinalization() { + Bundle notificationExtras; + synchronized (this) { + final long toWaitNanos = + mLastFinalizationNanos + FORCE_FETCH_THROTTLE_NS - System.nanoTime(); + if (toWaitNanos > 0) { + return NANOSECONDS.toMillis(toWaitNanos) + 1; // Round up. + } + notificationExtras = finalizeBatchAndBuildDeviceOwnerMessageLocked(); + } + if (notificationExtras != null) { + notifyDeviceOwner(notificationExtras); + } + return 0; + } + synchronized void pause() { Slog.d(TAG, "Paused network logging"); mPaused = true; @@ -192,6 +221,7 @@ final class NetworkLoggingHandler extends Handler { @GuardedBy("this") /** @returns extras if a message should be sent to the device owner */ private Bundle finalizeBatchAndBuildDeviceOwnerMessageLocked() { + mLastFinalizationNanos = System.nanoTime(); Bundle notificationExtras = null; if (mNetworkEvents.size() > 0) { // Assign ids to the events. |