From d7fda53855502d32ab0160b609a10ed4e9faab78 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Mon, 6 Apr 2020 18:19:46 -0700 Subject: Send puller registration signal to statsd Bug: 153384066 Test: m -j Change-Id: Idd2465d52e6720d7bce26ecc7998721b9d9790e3 --- apex/statsd/aidl/android/os/IStatsd.aidl | 13 +++++++++---- .../java/com/android/server/stats/StatsManagerService.java | 1 + cmds/statsd/src/StatsService.cpp | 8 ++++++++ cmds/statsd/src/StatsService.h | 5 +++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl index d5b5949cd032..db80650b8c1c 100644 --- a/apex/statsd/aidl/android/os/IStatsd.aidl +++ b/apex/statsd/aidl/android/os/IStatsd.aidl @@ -182,10 +182,15 @@ interface IStatsd { */ void sendAppBreadcrumbAtom(int label, int state); - /** - * Registers a puller callback function that, when invoked, pulls the data - * for the specified atom tag. - */ + /** + * Tell the stats daemon that all the pullers registered during boot have been sent. + */ + oneway void allPullersFromBootRegistered(); + + /** + * Registers a puller callback function that, when invoked, pulls the data + * for the specified atom tag. + */ oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownMillis, long timeoutMillis,in int[] additiveFields, IPullAtomCallback pullerCallback); diff --git a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java index 58c78da5cea7..90764b0bd426 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java @@ -600,6 +600,7 @@ public class StatsManagerService extends IStatsManagerService.Stub { statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownMillis(), value.getTimeoutMillis(), value.getAdditiveFields(), value.getCallback()); } + statsd.allPullersFromBootRegistered(); } // Pre-condition: the Binder calling identity has already been cleared diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 9169eb1778d9..d51bf77e3c21 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -1215,6 +1215,14 @@ Status StatsService::sendAppBreadcrumbAtom(int32_t label, int32_t state) { return Status::ok(); } +Status StatsService::allPullersFromBootRegistered() { + ENFORCE_UID(AID_SYSTEM); + + VLOG("StatsService::allPullersFromBootRegistered was called"); + + return Status::ok(); +} + Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownMillis, int64_t timeoutMillis, const std::vector& additiveFields, diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index 114c84f953c8..ca01eeba8096 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -164,6 +164,11 @@ public: */ virtual Status sendAppBreadcrumbAtom(int32_t label, int32_t state) override; + /** + * Binder call to notify statsd that all pullers from boot have been registered. + */ + virtual Status allPullersFromBootRegistered(); + /** * Binder call to register a callback function for a pulled atom. */ -- cgit v1.2.3-59-g8ed1b From d8f533060d882b09f953d280f5045a13342204f6 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Mon, 6 Apr 2020 18:09:55 -0700 Subject: Send boot completed to statsd Bug: 153384066 Test: m -j Change-Id: I3f91241851a93d0869dad210bc278b3a1ba6b762 --- apex/statsd/aidl/android/os/IStatsd.aidl | 5 +++ .../com/android/server/stats/StatsCompanion.java | 3 ++ .../server/stats/StatsCompanionService.java | 48 ++++++++++++++++++++++ cmds/statsd/src/StatsService.cpp | 8 ++++ cmds/statsd/src/StatsService.h | 1 + 5 files changed, 65 insertions(+) diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl index db80650b8c1c..80308d26a430 100644 --- a/apex/statsd/aidl/android/os/IStatsd.aidl +++ b/apex/statsd/aidl/android/os/IStatsd.aidl @@ -30,6 +30,11 @@ interface IStatsd { */ oneway void systemRunning(); + /** + * Tell the stats daemon that the android system has finished booting. + */ + oneway void bootCompleted(); + /** * Tell the stats daemon that the StatsCompanionService is up and running. * Two-way binder call so that caller knows message received. diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java index c1ba73f03c06..dc477a5590ea 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java @@ -87,6 +87,9 @@ public class StatsCompanion { if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) { mStatsCompanionService.systemReady(); } + if (phase == PHASE_BOOT_COMPLETED) { + mStatsCompanionService.bootCompleted(); + } } } diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index aad51124c8d2..7162229ad0e3 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -112,6 +112,18 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private final HashMap mDeletedFiles = new HashMap<>(); private final CompanionHandler mHandler; + // Flag that is set when PHASE_BOOT_COMPLETED is triggered in the StatsCompanion lifecycle. This + // and the flag mSentBootComplete below is used for synchronization to ensure that the boot + // complete signal is only ever sent once to statsd. Two signals are needed because + // #sayHiToStatsd can be called from both statsd and #onBootPhase + // PHASE_THIRD_PARTY_APPS_CAN_START. + @GuardedBy("sStatsdLock") + private boolean mBootCompleted = false; + // Flag that is set when IStatsd#bootCompleted is called. This flag ensures that boot complete + // signal is only ever sent once. + @GuardedBy("sStatsdLock") + private boolean mSentBootComplete = false; + public StatsCompanionService(Context context) { super(); mContext = context; @@ -704,6 +716,19 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver)); final long token = Binder.clearCallingIdentity(); + + // Used so we can call statsd.bootComplete() outside of the lock. + boolean shouldSendBootComplete = false; + synchronized (sStatsdLock) { + if (mBootCompleted && !mSentBootComplete) { + mSentBootComplete = true; + shouldSendBootComplete = true; + } + } + if (shouldSendBootComplete) { + statsd.bootCompleted(); + } + try { // Pull the latest state of UID->app name, version mapping when // statsd starts. @@ -765,6 +790,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { mContext.unregisterReceiver(receiver); } statsdNotReadyLocked(); + mSentBootComplete = false; } } } @@ -774,6 +800,28 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { mStatsManagerService.statsdNotReady(); } + void bootCompleted() { + IStatsd statsd = getStatsdNonblocking(); + synchronized (sStatsdLock) { + mBootCompleted = true; + if (mSentBootComplete) { + // do not send a boot complete a second time. + return; + } + if (statsd == null) { + // Statsd is not yet ready. + // Delay the boot completed ping to {@link #sayHiToStatsd()} + return; + } + mSentBootComplete = true; + } + try { + statsd.bootCompleted(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to notify statsd that boot completed"); + } + } + @Override protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index d51bf77e3c21..dd1d40083a6b 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -1054,6 +1054,14 @@ Status StatsService::statsCompanionReady() { return Status::ok(); } +Status StatsService::bootCompleted() { + ENFORCE_UID(AID_SYSTEM); + + VLOG("StatsService::bootCompleted was called"); + + return Status::ok(); +} + void StatsService::Startup() { mConfigManager->Startup(); mProcessor->LoadActiveConfigsFromDisk(); diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index ca01eeba8096..23d4c1bd199d 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -64,6 +64,7 @@ public: virtual Status systemRunning(); virtual Status statsCompanionReady(); + virtual Status bootCompleted(); virtual Status informAnomalyAlarmFired(); virtual Status informPollAlarmFired(); virtual Status informAlarmForSubscriberTriggeringFired(); -- cgit v1.2.3-59-g8ed1b