diff options
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.cpp | 12 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.h | 5 | ||||
| -rw-r--r-- | core/java/android/os/IStatsManager.aidl | 7 | ||||
| -rw-r--r-- | core/java/android/util/StatsManager.java | 29 |
5 files changed, 51 insertions, 3 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 50a8ea4717cb..16404e47ebec 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4332,6 +4332,7 @@ package android.util { public final class StatsManager { method public boolean addConfiguration(java.lang.String, byte[], java.lang.String, java.lang.String); method public byte[] getData(java.lang.String); + method public byte[] getMetadata(); method public boolean removeConfiguration(java.lang.String); } diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index eb3ea0ba0d13..0e9cd3b2a148 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -715,6 +715,18 @@ Status StatsService::getData(const String16& key, vector<uint8_t>* output) { } } +Status StatsService::getMetadata(vector<uint8_t>* output) { + IPCThreadState* ipc = IPCThreadState::self(); + VLOG("StatsService::getMetadata with Pid %i, Uid %i", ipc->getCallingPid(), + ipc->getCallingUid()); + if (checkCallingPermission(String16(kPermissionDump))) { + StatsdStats::getInstance().dumpStats(output, false); // Don't reset the counters. + return Status::ok(); + } else { + return Status::fromExceptionCode(binder::Status::EX_SECURITY); + } +} + Status StatsService::addConfiguration(const String16& key, const vector <uint8_t>& config, const String16& package, const String16& cls, diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index 007227e325f7..03bc6d93ee03 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -76,6 +76,11 @@ public: virtual Status getData(const String16& key, vector<uint8_t>* output) override; /** + * Binder call for clients to get metadata across all configs in statsd. + */ + virtual Status getMetadata(vector<uint8_t>* output) override; + + /** * Binder call to let clients send a configuration and indicate they're interested when they * should requestData for this configuration. */ diff --git a/core/java/android/os/IStatsManager.aidl b/core/java/android/os/IStatsManager.aidl index b814b46a3182..c8c428e9417b 100644 --- a/core/java/android/os/IStatsManager.aidl +++ b/core/java/android/os/IStatsManager.aidl @@ -69,11 +69,16 @@ interface IStatsManager { /** * Fetches data for the specified configuration key. Returns a byte array representing proto - * wire-encoded of ConfigMetricsReport. + * wire-encoded of ConfigMetricsReportList. */ byte[] getData(in String key); /** + * Fetches metadata across statsd. Returns byte array representing wire-encoded proto. + */ + byte[] getMetadata(); + + /** * Sets a configuration with the specified config key and subscribes to updates for this * configuration key. Broadcasts will be sent if this configuration needs to be collected. * The configuration must be a wire-encoded StatsDConfig. The caller specifies the name of the diff --git a/core/java/android/util/StatsManager.java b/core/java/android/util/StatsManager.java index 2bcd863cd409..26a3c361e8c1 100644 --- a/core/java/android/util/StatsManager.java +++ b/core/java/android/util/StatsManager.java @@ -93,10 +93,11 @@ public final class StatsManager { } /** - * Clients can request data with a binder call. + * Clients can request data with a binder call. This getter is destructive and also clears + * the retrieved metrics from statsd memory. * * @param configKey Configuration key to retrieve data from. - * @return Serialized ConfigMetricsReport proto. Returns null on failure. + * @return Serialized ConfigMetricsReportList proto. Returns null on failure. */ @RequiresPermission(Manifest.permission.DUMP) public byte[] getData(String configKey) { @@ -115,6 +116,30 @@ public final class StatsManager { } } + /** + * Clients can request metadata for statsd. Will contain stats across all configurations but not + * the actual metrics themselves (metrics must be collected via {@link #getData(String)}. + * This getter is not destructive and will not reset any metrics/counters. + * + * @return Serialized StatsdStatsReport proto. Returns null on failure. + */ + @RequiresPermission(Manifest.permission.DUMP) + public byte[] getMetadata() { + synchronized (this) { + try { + IStatsManager service = getIStatsManagerLocked(); + if (service == null) { + Slog.d(TAG, "Failed to find statsd when getting metadata"); + return null; + } + return service.getMetadata(); + } catch (RemoteException e) { + Slog.d(TAG, "Failed to connecto statsd when getting metadata"); + return null; + } + } + } + private class StatsdDeathRecipient implements IBinder.DeathRecipient { @Override public void binderDied() { |