Loading cmds/statsd/Android.mk +5 −2 Original line number Diff line number Diff line Loading @@ -21,9 +21,11 @@ statsd_common_src := \ src/statsd_config.proto \ src/FieldValue.cpp \ src/stats_log_util.cpp \ src/anomaly/AnomalyMonitor.cpp \ src/anomaly/AlarmMonitor.cpp \ src/anomaly/AlarmTracker.cpp \ src/anomaly/AnomalyTracker.cpp \ src/anomaly/DurationAnomalyTracker.cpp \ src/anomaly/subscriber_util.cpp \ src/condition/CombinationConditionTracker.cpp \ src/condition/condition_util.cpp \ src/condition/SimpleConditionTracker.cpp \ Loading Loading @@ -170,7 +172,8 @@ LOCAL_SRC_FILES := \ src/atom_field_options.proto \ src/atoms.proto \ src/stats_log.proto \ tests/AnomalyMonitor_test.cpp \ tests/AlarmMonitor_test.cpp \ tests/anomaly/AlarmTracker_test.cpp \ tests/anomaly/AnomalyTracker_test.cpp \ tests/ConfigManager_test.cpp \ tests/external/puller_util_test.cpp \ Loading cmds/statsd/src/StatsLogProcessor.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -66,11 +66,13 @@ const int FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS = 4; #define STATS_DATA_DIR "/data/misc/stats-data" StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor, const long timeBaseSec, const std::function<void(const ConfigKey&)>& sendBroadcast) : mUidMap(uidMap), mAnomalyMonitor(anomalyMonitor), mAnomalyAlarmMonitor(anomalyAlarmMonitor), mPeriodicAlarmMonitor(periodicAlarmMonitor), mSendBroadcast(sendBroadcast), mTimeBaseSec(timeBaseSec) { StatsPullerManager statsPullerManager; Loading @@ -82,10 +84,19 @@ StatsLogProcessor::~StatsLogProcessor() { void StatsLogProcessor::onAnomalyAlarmFired( const uint64_t timestampNs, unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet) { unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) { std::lock_guard<std::mutex> lock(mMetricsMutex); for (const auto& itr : mMetricsManagers) { itr.second->onAnomalyAlarmFired(timestampNs, anomalySet); itr.second->onAnomalyAlarmFired(timestampNs, alarmSet); } } void StatsLogProcessor::onPeriodicAlarmFired( const uint64_t timestampNs, unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) { std::lock_guard<std::mutex> lock(mMetricsMutex); for (const auto& itr : mMetricsManagers) { itr.second->onPeriodicAlarmFired(timestampNs, alarmSet); } } Loading Loading @@ -170,7 +181,9 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event) { void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) { std::lock_guard<std::mutex> lock(mMetricsMutex); VLOG("Updated configuration for key %s", key.ToString().c_str()); sp<MetricsManager> newMetricsManager = new MetricsManager(key, config, mTimeBaseSec, mUidMap); sp<MetricsManager> newMetricsManager = new MetricsManager(key, config, mTimeBaseSec, mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); auto it = mMetricsManagers.find(key); if (it == mMetricsManagers.end() && mMetricsManagers.size() > StatsdStats::kMaxConfigCount) { ALOGE("Can't accept more configs!"); Loading @@ -179,7 +192,6 @@ void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig if (newMetricsManager->isConfigValid()) { mUidMap->OnConfigUpdated(key); newMetricsManager->setAnomalyMonitor(mAnomalyMonitor); if (newMetricsManager->shouldAddUidMapListener()) { // We have to add listener after the MetricsManager is constructed because it's // not safe to create wp or sp from this pointer inside its constructor. Loading cmds/statsd/src/StatsLogProcessor.h +12 −4 Original line number Diff line number Diff line Loading @@ -34,7 +34,8 @@ namespace statsd { class StatsLogProcessor : public ConfigListener { public: StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor, StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& subscriberTriggerAlarmMonitor, const long timeBaseSec, const std::function<void(const ConfigKey&)>& sendBroadcast); virtual ~StatsLogProcessor(); Loading @@ -48,10 +49,15 @@ public: void onDumpReport(const ConfigKey& key, const uint64_t dumpTimeNs, vector<uint8_t>* outData); /* Tells MetricsManager that the alarms in anomalySet have fired. Modifies anomalySet. */ /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */ void onAnomalyAlarmFired( const uint64_t timestampNs, unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet); unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */ void onPeriodicAlarmFired( const uint64_t timestampNs, unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); /* Flushes data to disk. Data on memory will be gone after written to disk. */ void WriteDataToDisk(); Loading @@ -76,7 +82,9 @@ private: StatsPullerManager mStatsPullerManager; sp<AnomalyMonitor> mAnomalyMonitor; sp<AlarmMonitor> mAnomalyAlarmMonitor; sp<AlarmMonitor> mPeriodicAlarmMonitor; void onDumpReportLocked(const ConfigKey& key, const uint64_t dumpTimeNs, vector<uint8_t>* outData); Loading cmds/statsd/src/StatsService.cpp +79 −31 Original line number Diff line number Diff line Loading @@ -50,38 +50,62 @@ namespace statsd { constexpr const char* kPermissionDump = "android.permission.DUMP"; #define STATS_SERVICE_DIR "/data/misc/stats-service" // ====================================================================== /** * Watches for the death of the stats companion (system process). */ class CompanionDeathRecipient : public IBinder::DeathRecipient { public: CompanionDeathRecipient(const sp<AnomalyMonitor>& anomalyMonitor); CompanionDeathRecipient(const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor) : mAnomalyAlarmMonitor(anomalyAlarmMonitor), mPeriodicAlarmMonitor(periodicAlarmMonitor) {} virtual void binderDied(const wp<IBinder>& who); private: const sp<AnomalyMonitor> mAnomalyMonitor; sp<AlarmMonitor> mAnomalyAlarmMonitor; sp<AlarmMonitor> mPeriodicAlarmMonitor; }; CompanionDeathRecipient::CompanionDeathRecipient(const sp<AnomalyMonitor>& anomalyMonitor) : mAnomalyMonitor(anomalyMonitor) { } void CompanionDeathRecipient::binderDied(const wp<IBinder>& who) { ALOGW("statscompanion service died"); mAnomalyMonitor->setStatsCompanionService(nullptr); mAnomalyAlarmMonitor->setStatsCompanionService(nullptr); mPeriodicAlarmMonitor->setStatsCompanionService(nullptr); SubscriberReporter::getInstance().setStatsCompanionService(nullptr); } // ====================================================================== StatsService::StatsService(const sp<Looper>& handlerLooper) : mAnomalyMonitor(new AnomalyMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS)) { : mAnomalyAlarmMonitor(new AlarmMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, [](const sp<IStatsCompanionService>& sc, int64_t timeMillis) { if (sc != nullptr) { sc->setAnomalyAlarm(timeMillis); StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); } }, [](const sp<IStatsCompanionService>& sc) { if (sc != nullptr) { sc->cancelAnomalyAlarm(); StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); } })), mPeriodicAlarmMonitor(new AlarmMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, [](const sp<IStatsCompanionService>& sc, int64_t timeMillis) { if (sc != nullptr) { sc->setAlarmForSubscriberTriggering(timeMillis); StatsdStats::getInstance().noteRegisteredPeriodicAlarmChanged(); } }, [](const sp<IStatsCompanionService>& sc) { if (sc != nullptr) { sc->cancelAlarmForSubscriberTriggering(); StatsdStats::getInstance().noteRegisteredPeriodicAlarmChanged(); } })) { mUidMap = new UidMap(); StatsPuller::SetUidMap(mUidMap); mConfigManager = new ConfigManager(); mProcessor = new StatsLogProcessor(mUidMap, mAnomalyMonitor, getElapsedRealtimeSec(), [this](const ConfigKey& key) { mProcessor = new StatsLogProcessor(mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor, getElapsedRealtimeSec(), [this](const ConfigKey& key) { sp<IStatsCompanionService> sc = getStatsCompanionService(); auto receiver = mConfigManager->GetConfigReceiver(key); if (sc == nullptr) { Loading Loading @@ -615,7 +639,8 @@ status_t StatsService::cmd_dump_memory_info(FILE* out) { status_t StatsService::cmd_clear_puller_cache(FILE* out) { IPCThreadState* ipc = IPCThreadState::self(); VLOG("StatsService::cmd_clear_puller_cache with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid()); VLOG("StatsService::cmd_clear_puller_cache with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid()); if (checkCallingPermission(String16(kPermissionDump))) { int cleared = mStatsPullerManager.ForceClearPullerCache(); fprintf(out, "Puller removed %d cached data!\n", cleared); Loading Loading @@ -670,18 +695,40 @@ Status StatsService::informAnomalyAlarmFired() { return Status::fromExceptionCode(Status::EX_SECURITY, "Only system uid can call informAnomalyAlarmFired"); } uint64_t currentTimeSec = getElapsedRealtimeSec(); std::unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet = mAnomalyMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (anomalySet.size() > 0) { std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = mAnomalyAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (alarmSet.size() > 0) { VLOG("Found an anomaly alarm that fired."); mProcessor->onAnomalyAlarmFired(currentTimeSec * NS_PER_SEC, anomalySet); mProcessor->onAnomalyAlarmFired(currentTimeSec * NS_PER_SEC, alarmSet); } else { VLOG("Cannot find an anomaly alarm that fired. Perhaps it was recently cancelled."); } return Status::ok(); } Status StatsService::informAlarmForSubscriberTriggeringFired() { VLOG("StatsService::informAlarmForSubscriberTriggeringFired was called"); if (IPCThreadState::self()->getCallingUid() != AID_SYSTEM) { return Status::fromExceptionCode( Status::EX_SECURITY, "Only system uid can call informAlarmForSubscriberTriggeringFired"); } uint64_t currentTimeSec = time(nullptr); std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = mPeriodicAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (alarmSet.size() > 0) { VLOG("Found periodic alarm fired."); mProcessor->onPeriodicAlarmFired(currentTimeSec * NS_PER_SEC, alarmSet); } else { ALOGW("Cannot find an periodic alarm that fired. Perhaps it was recently cancelled."); } return Status::ok(); } Status StatsService::informPollAlarmFired() { VLOG("StatsService::informPollAlarmFired was called"); Loading Loading @@ -766,10 +813,11 @@ Status StatsService::statsCompanionReady() { "statscompanion unavailable despite it contacting statsd!"); } VLOG("StatsService::statsCompanionReady linking to statsCompanion."); IInterface::asBinder(statsCompanion)->linkToDeath(new CompanionDeathRecipient(mAnomalyMonitor)); mAnomalyMonitor->setStatsCompanionService(statsCompanion); IInterface::asBinder(statsCompanion)->linkToDeath( new CompanionDeathRecipient(mAnomalyAlarmMonitor, mPeriodicAlarmMonitor)); mAnomalyAlarmMonitor->setStatsCompanionService(statsCompanion); mPeriodicAlarmMonitor->setStatsCompanionService(statsCompanion); SubscriberReporter::getInstance().setStatsCompanionService(statsCompanion); return Status::ok(); } Loading cmds/statsd/src/StatsService.h +10 −3 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #define STATS_SERVICE_H #include "StatsLogProcessor.h" #include "anomaly/AnomalyMonitor.h" #include "anomaly/AlarmMonitor.h" #include "config/ConfigManager.h" #include "external/StatsPullerManager.h" #include "packages/UidMap.h" Loading Loading @@ -58,6 +58,8 @@ public: virtual Status statsCompanionReady(); virtual Status informAnomalyAlarmFired(); virtual Status informPollAlarmFired(); virtual Status informAlarmForSubscriberTriggeringFired(); virtual Status informAllUidData(const vector<int32_t>& uid, const vector<int64_t>& version, const vector<String16>& app); virtual Status informOnePackage(const String16& app, int32_t uid, int64_t version); Loading Loading @@ -244,9 +246,14 @@ private: sp<StatsLogProcessor> mProcessor; /** * The anomaly detector. * The alarm monitor for anomaly detection. */ const sp<AlarmMonitor> mAnomalyAlarmMonitor; /** * The alarm monitor for alarms to directly trigger subscriber. */ const sp<AnomalyMonitor> mAnomalyMonitor; const sp<AlarmMonitor> mPeriodicAlarmMonitor; /** * Whether this is an eng build. Loading Loading
cmds/statsd/Android.mk +5 −2 Original line number Diff line number Diff line Loading @@ -21,9 +21,11 @@ statsd_common_src := \ src/statsd_config.proto \ src/FieldValue.cpp \ src/stats_log_util.cpp \ src/anomaly/AnomalyMonitor.cpp \ src/anomaly/AlarmMonitor.cpp \ src/anomaly/AlarmTracker.cpp \ src/anomaly/AnomalyTracker.cpp \ src/anomaly/DurationAnomalyTracker.cpp \ src/anomaly/subscriber_util.cpp \ src/condition/CombinationConditionTracker.cpp \ src/condition/condition_util.cpp \ src/condition/SimpleConditionTracker.cpp \ Loading Loading @@ -170,7 +172,8 @@ LOCAL_SRC_FILES := \ src/atom_field_options.proto \ src/atoms.proto \ src/stats_log.proto \ tests/AnomalyMonitor_test.cpp \ tests/AlarmMonitor_test.cpp \ tests/anomaly/AlarmTracker_test.cpp \ tests/anomaly/AnomalyTracker_test.cpp \ tests/ConfigManager_test.cpp \ tests/external/puller_util_test.cpp \ Loading
cmds/statsd/src/StatsLogProcessor.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -66,11 +66,13 @@ const int FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS = 4; #define STATS_DATA_DIR "/data/misc/stats-data" StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor, const long timeBaseSec, const std::function<void(const ConfigKey&)>& sendBroadcast) : mUidMap(uidMap), mAnomalyMonitor(anomalyMonitor), mAnomalyAlarmMonitor(anomalyAlarmMonitor), mPeriodicAlarmMonitor(periodicAlarmMonitor), mSendBroadcast(sendBroadcast), mTimeBaseSec(timeBaseSec) { StatsPullerManager statsPullerManager; Loading @@ -82,10 +84,19 @@ StatsLogProcessor::~StatsLogProcessor() { void StatsLogProcessor::onAnomalyAlarmFired( const uint64_t timestampNs, unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet) { unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) { std::lock_guard<std::mutex> lock(mMetricsMutex); for (const auto& itr : mMetricsManagers) { itr.second->onAnomalyAlarmFired(timestampNs, anomalySet); itr.second->onAnomalyAlarmFired(timestampNs, alarmSet); } } void StatsLogProcessor::onPeriodicAlarmFired( const uint64_t timestampNs, unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) { std::lock_guard<std::mutex> lock(mMetricsMutex); for (const auto& itr : mMetricsManagers) { itr.second->onPeriodicAlarmFired(timestampNs, alarmSet); } } Loading Loading @@ -170,7 +181,9 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event) { void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) { std::lock_guard<std::mutex> lock(mMetricsMutex); VLOG("Updated configuration for key %s", key.ToString().c_str()); sp<MetricsManager> newMetricsManager = new MetricsManager(key, config, mTimeBaseSec, mUidMap); sp<MetricsManager> newMetricsManager = new MetricsManager(key, config, mTimeBaseSec, mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); auto it = mMetricsManagers.find(key); if (it == mMetricsManagers.end() && mMetricsManagers.size() > StatsdStats::kMaxConfigCount) { ALOGE("Can't accept more configs!"); Loading @@ -179,7 +192,6 @@ void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig if (newMetricsManager->isConfigValid()) { mUidMap->OnConfigUpdated(key); newMetricsManager->setAnomalyMonitor(mAnomalyMonitor); if (newMetricsManager->shouldAddUidMapListener()) { // We have to add listener after the MetricsManager is constructed because it's // not safe to create wp or sp from this pointer inside its constructor. Loading
cmds/statsd/src/StatsLogProcessor.h +12 −4 Original line number Diff line number Diff line Loading @@ -34,7 +34,8 @@ namespace statsd { class StatsLogProcessor : public ConfigListener { public: StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor, StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& subscriberTriggerAlarmMonitor, const long timeBaseSec, const std::function<void(const ConfigKey&)>& sendBroadcast); virtual ~StatsLogProcessor(); Loading @@ -48,10 +49,15 @@ public: void onDumpReport(const ConfigKey& key, const uint64_t dumpTimeNs, vector<uint8_t>* outData); /* Tells MetricsManager that the alarms in anomalySet have fired. Modifies anomalySet. */ /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */ void onAnomalyAlarmFired( const uint64_t timestampNs, unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet); unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */ void onPeriodicAlarmFired( const uint64_t timestampNs, unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); /* Flushes data to disk. Data on memory will be gone after written to disk. */ void WriteDataToDisk(); Loading @@ -76,7 +82,9 @@ private: StatsPullerManager mStatsPullerManager; sp<AnomalyMonitor> mAnomalyMonitor; sp<AlarmMonitor> mAnomalyAlarmMonitor; sp<AlarmMonitor> mPeriodicAlarmMonitor; void onDumpReportLocked(const ConfigKey& key, const uint64_t dumpTimeNs, vector<uint8_t>* outData); Loading
cmds/statsd/src/StatsService.cpp +79 −31 Original line number Diff line number Diff line Loading @@ -50,38 +50,62 @@ namespace statsd { constexpr const char* kPermissionDump = "android.permission.DUMP"; #define STATS_SERVICE_DIR "/data/misc/stats-service" // ====================================================================== /** * Watches for the death of the stats companion (system process). */ class CompanionDeathRecipient : public IBinder::DeathRecipient { public: CompanionDeathRecipient(const sp<AnomalyMonitor>& anomalyMonitor); CompanionDeathRecipient(const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor) : mAnomalyAlarmMonitor(anomalyAlarmMonitor), mPeriodicAlarmMonitor(periodicAlarmMonitor) {} virtual void binderDied(const wp<IBinder>& who); private: const sp<AnomalyMonitor> mAnomalyMonitor; sp<AlarmMonitor> mAnomalyAlarmMonitor; sp<AlarmMonitor> mPeriodicAlarmMonitor; }; CompanionDeathRecipient::CompanionDeathRecipient(const sp<AnomalyMonitor>& anomalyMonitor) : mAnomalyMonitor(anomalyMonitor) { } void CompanionDeathRecipient::binderDied(const wp<IBinder>& who) { ALOGW("statscompanion service died"); mAnomalyMonitor->setStatsCompanionService(nullptr); mAnomalyAlarmMonitor->setStatsCompanionService(nullptr); mPeriodicAlarmMonitor->setStatsCompanionService(nullptr); SubscriberReporter::getInstance().setStatsCompanionService(nullptr); } // ====================================================================== StatsService::StatsService(const sp<Looper>& handlerLooper) : mAnomalyMonitor(new AnomalyMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS)) { : mAnomalyAlarmMonitor(new AlarmMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, [](const sp<IStatsCompanionService>& sc, int64_t timeMillis) { if (sc != nullptr) { sc->setAnomalyAlarm(timeMillis); StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); } }, [](const sp<IStatsCompanionService>& sc) { if (sc != nullptr) { sc->cancelAnomalyAlarm(); StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); } })), mPeriodicAlarmMonitor(new AlarmMonitor(MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, [](const sp<IStatsCompanionService>& sc, int64_t timeMillis) { if (sc != nullptr) { sc->setAlarmForSubscriberTriggering(timeMillis); StatsdStats::getInstance().noteRegisteredPeriodicAlarmChanged(); } }, [](const sp<IStatsCompanionService>& sc) { if (sc != nullptr) { sc->cancelAlarmForSubscriberTriggering(); StatsdStats::getInstance().noteRegisteredPeriodicAlarmChanged(); } })) { mUidMap = new UidMap(); StatsPuller::SetUidMap(mUidMap); mConfigManager = new ConfigManager(); mProcessor = new StatsLogProcessor(mUidMap, mAnomalyMonitor, getElapsedRealtimeSec(), [this](const ConfigKey& key) { mProcessor = new StatsLogProcessor(mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor, getElapsedRealtimeSec(), [this](const ConfigKey& key) { sp<IStatsCompanionService> sc = getStatsCompanionService(); auto receiver = mConfigManager->GetConfigReceiver(key); if (sc == nullptr) { Loading Loading @@ -615,7 +639,8 @@ status_t StatsService::cmd_dump_memory_info(FILE* out) { status_t StatsService::cmd_clear_puller_cache(FILE* out) { IPCThreadState* ipc = IPCThreadState::self(); VLOG("StatsService::cmd_clear_puller_cache with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid()); VLOG("StatsService::cmd_clear_puller_cache with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid()); if (checkCallingPermission(String16(kPermissionDump))) { int cleared = mStatsPullerManager.ForceClearPullerCache(); fprintf(out, "Puller removed %d cached data!\n", cleared); Loading Loading @@ -670,18 +695,40 @@ Status StatsService::informAnomalyAlarmFired() { return Status::fromExceptionCode(Status::EX_SECURITY, "Only system uid can call informAnomalyAlarmFired"); } uint64_t currentTimeSec = getElapsedRealtimeSec(); std::unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet = mAnomalyMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (anomalySet.size() > 0) { std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = mAnomalyAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (alarmSet.size() > 0) { VLOG("Found an anomaly alarm that fired."); mProcessor->onAnomalyAlarmFired(currentTimeSec * NS_PER_SEC, anomalySet); mProcessor->onAnomalyAlarmFired(currentTimeSec * NS_PER_SEC, alarmSet); } else { VLOG("Cannot find an anomaly alarm that fired. Perhaps it was recently cancelled."); } return Status::ok(); } Status StatsService::informAlarmForSubscriberTriggeringFired() { VLOG("StatsService::informAlarmForSubscriberTriggeringFired was called"); if (IPCThreadState::self()->getCallingUid() != AID_SYSTEM) { return Status::fromExceptionCode( Status::EX_SECURITY, "Only system uid can call informAlarmForSubscriberTriggeringFired"); } uint64_t currentTimeSec = time(nullptr); std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = mPeriodicAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); if (alarmSet.size() > 0) { VLOG("Found periodic alarm fired."); mProcessor->onPeriodicAlarmFired(currentTimeSec * NS_PER_SEC, alarmSet); } else { ALOGW("Cannot find an periodic alarm that fired. Perhaps it was recently cancelled."); } return Status::ok(); } Status StatsService::informPollAlarmFired() { VLOG("StatsService::informPollAlarmFired was called"); Loading Loading @@ -766,10 +813,11 @@ Status StatsService::statsCompanionReady() { "statscompanion unavailable despite it contacting statsd!"); } VLOG("StatsService::statsCompanionReady linking to statsCompanion."); IInterface::asBinder(statsCompanion)->linkToDeath(new CompanionDeathRecipient(mAnomalyMonitor)); mAnomalyMonitor->setStatsCompanionService(statsCompanion); IInterface::asBinder(statsCompanion)->linkToDeath( new CompanionDeathRecipient(mAnomalyAlarmMonitor, mPeriodicAlarmMonitor)); mAnomalyAlarmMonitor->setStatsCompanionService(statsCompanion); mPeriodicAlarmMonitor->setStatsCompanionService(statsCompanion); SubscriberReporter::getInstance().setStatsCompanionService(statsCompanion); return Status::ok(); } Loading
cmds/statsd/src/StatsService.h +10 −3 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #define STATS_SERVICE_H #include "StatsLogProcessor.h" #include "anomaly/AnomalyMonitor.h" #include "anomaly/AlarmMonitor.h" #include "config/ConfigManager.h" #include "external/StatsPullerManager.h" #include "packages/UidMap.h" Loading Loading @@ -58,6 +58,8 @@ public: virtual Status statsCompanionReady(); virtual Status informAnomalyAlarmFired(); virtual Status informPollAlarmFired(); virtual Status informAlarmForSubscriberTriggeringFired(); virtual Status informAllUidData(const vector<int32_t>& uid, const vector<int64_t>& version, const vector<String16>& app); virtual Status informOnePackage(const String16& app, int32_t uid, int64_t version); Loading Loading @@ -244,9 +246,14 @@ private: sp<StatsLogProcessor> mProcessor; /** * The anomaly detector. * The alarm monitor for anomaly detection. */ const sp<AlarmMonitor> mAnomalyAlarmMonitor; /** * The alarm monitor for alarms to directly trigger subscriber. */ const sp<AnomalyMonitor> mAnomalyMonitor; const sp<AlarmMonitor> mPeriodicAlarmMonitor; /** * Whether this is an eng build. Loading