diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp index f26062b3eea39..bd4397afaeb73 100644 --- a/cmds/statsd/Android.bp +++ b/cmds/statsd/Android.bp @@ -71,7 +71,6 @@ cc_defaults { "src/external/StatsCallbackPuller.cpp", "src/external/StatsPuller.cpp", "src/external/StatsPullerManager.cpp", - "src/external/SubsystemSleepStatePuller.cpp", "src/external/TrainInfoPuller.cpp", "src/FieldValue.cpp", "src/guardrail/StatsdStats.cpp", @@ -120,9 +119,6 @@ cc_defaults { static_libs: [ "android.frameworks.stats@1.0", - "android.hardware.power.stats@1.0", - "android.hardware.power@1.0", - "android.hardware.power@1.1", "libbase", "libcutils", "liblog", diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 982aab5a63809..fef213dad60e9 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -34,7 +34,6 @@ #include "../statscompanion_util.h" #include "GpuStatsPuller.h" #include "StatsCallbackPuller.h" -#include "SubsystemSleepStatePuller.h" #include "TrainInfoPuller.h" #include "statslog.h" @@ -54,9 +53,6 @@ const int64_t NO_ALARM_UPDATE = INT64_MAX; StatsPullerManager::StatsPullerManager() : kAllPullAtomInfo({ - // subsystem_sleep_state - {{.atomTag = android::util::SUBSYSTEM_SLEEP_STATE}, new SubsystemSleepStatePuller()}, - // TrainInfo. {{.atomTag = android::util::TRAIN_INFO}, new TrainInfoPuller()}, diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 9e01fd60885fe..390068e1fa75a 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -23,6 +23,7 @@ cc_library_static { "BroadcastRadio/convert.cpp", "BroadcastRadio/regions.cpp", "stats/PowerStatsPuller.cpp", + "stats/SubsystemSleepStatePuller.cpp", "com_android_server_am_BatteryStatsService.cpp", "com_android_server_connectivity_Vpn.cpp", "com_android_server_ConsumerIrService.cpp", diff --git a/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp index f6c0a8307b133..f5b778e85e5cf 100644 --- a/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp +++ b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp @@ -24,10 +24,12 @@ #include #include "stats/PowerStatsPuller.h" +#include "stats/SubsystemSleepStatePuller.h" namespace android { static server::stats::PowerStatsPuller gPowerStatsPuller; +static server::stats::SubsystemSleepStatePuller gSubsystemSleepStatePuller; static status_pull_atom_return_t onDevicePowerMeasurementCallback(int32_t atom_tag, pulled_stats_event_list* data, @@ -35,6 +37,12 @@ static status_pull_atom_return_t onDevicePowerMeasurementCallback(int32_t atom_t return gPowerStatsPuller.Pull(atom_tag, data); } +static status_pull_atom_return_t subsystemSleepStateCallback(int32_t atom_tag, + pulled_stats_event_list* data, + void* cookie) { + return gSubsystemSleepStatePuller.Pull(atom_tag, data); +} + static void nativeInit(JNIEnv* env, jobject javaObject) { // on device power measurement gPowerStatsPuller = server::stats::PowerStatsPuller(); @@ -42,6 +50,13 @@ static void nativeInit(JNIEnv* env, jobject javaObject) { onDevicePowerMeasurementCallback, /* metadata= */ nullptr, /* cookie= */ nullptr); + + // subsystem sleep state + gSubsystemSleepStatePuller = server::stats::SubsystemSleepStatePuller(); + register_stats_pull_atom_callback(android::util::SUBSYSTEM_SLEEP_STATE, + subsystemSleepStateCallback, + /* metadata= */ nullptr, + /* cookie= */ nullptr); } static const JNINativeMethod sMethods[] = {{"nativeInit", "()V", (void*)nativeInit}}; diff --git a/services/core/jni/stats/SubsystemSleepStatePuller.cpp b/services/core/jni/stats/SubsystemSleepStatePuller.cpp index f6a4aeaa3f9e2..c6a836cfb6d54 100644 --- a/services/core/jni/stats/SubsystemSleepStatePuller.cpp +++ b/services/core/jni/stats/SubsystemSleepStatePuller.cpp @@ -15,7 +15,10 @@ */ #define DEBUG false // STOPSHIP if true -#include "Log.h" +#define LOG_TAG "SubsystemSleepStatePuller" + +#include +#include #include #include @@ -32,13 +35,8 @@ #include #include #include -#include "external/SubsystemSleepStatePuller.h" -#include "external/StatsPuller.h" - +#include #include "SubsystemSleepStatePuller.h" -#include "logd/LogEvent.h" -#include "statslog.h" -#include "stats_log_util.h" using android::hardware::hidl_vec; using android::hardware::power::V1_0::IPower; @@ -53,14 +51,12 @@ using android::hardware::power::stats::V1_0::PowerEntityStateSpace; using android::hardware::Return; using android::hardware::Void; -using std::make_shared; -using std::shared_ptr; - namespace android { -namespace os { -namespace statsd { +namespace server { +namespace stats { -static std::function>* data)> gPuller = {}; +static std::function + gPuller = {}; static sp gPowerHalV1_0 = nullptr; static sp gPowerHalV1_1 = nullptr; @@ -91,9 +87,7 @@ struct SubsystemSleepStatePullerDeathRecipient : virtual public hardware::hidl_d static sp gDeathRecipient = new SubsystemSleepStatePullerDeathRecipient(); -SubsystemSleepStatePuller::SubsystemSleepStatePuller() : - StatsPuller(android::util::SUBSYSTEM_SLEEP_STATE) { -} +SubsystemSleepStatePuller::SubsystemSleepStatePuller() {} // The caller must be holding gPowerHalMutex. static bool checkResultLocked(const Return &ret, const char* function) { @@ -182,48 +176,46 @@ static bool getPowerStatsHalLocked() { } // The caller must be holding gPowerHalMutex. -static bool getIPowerStatsDataLocked(vector>* data) { +static status_pull_atom_return_t getIPowerStatsDataLocked(int32_t atomTag, + pulled_stats_event_list* data) { using android::hardware::power::stats::V1_0::Status; if(!getPowerStatsHalLocked()) { - return false; + return STATS_PULL_SKIP; } - - int64_t wallClockTimestampNs = getWallClockNs(); - int64_t elapsedTimestampNs = getElapsedRealtimeNs(); - // Get power entity state residency data bool success = false; - Return ret = gPowerStatsHalV1_0->getPowerEntityStateResidencyData({}, - [&data, &success, wallClockTimestampNs, elapsedTimestampNs] - (auto results, auto status) { - if (status == Status::NOT_SUPPORTED) { - ALOGW("getPowerEntityStateResidencyData is not supported"); - success = false; - return; - } - - for(auto result : results) { - for(auto stateResidency : result.stateResidencyData) { - auto statePtr = make_shared( - android::util::SUBSYSTEM_SLEEP_STATE, - wallClockTimestampNs, elapsedTimestampNs); - statePtr->write(gEntityNames.at(result.powerEntityId)); - statePtr->write(gStateNames.at(result.powerEntityId) - .at(stateResidency.powerEntityStateId)); - statePtr->write(stateResidency.totalStateEntryCount); - statePtr->write(stateResidency.totalTimeInStateMs); - statePtr->init(); - data->emplace_back(statePtr); - } - } - success = true; - }); + Return ret = gPowerStatsHalV1_0->getPowerEntityStateResidencyData( + {}, [&data, &success](auto results, auto status) { + if (status == Status::NOT_SUPPORTED) { + ALOGW("getPowerEntityStateResidencyData is not supported"); + success = false; + return; + } + for (auto result : results) { + for (auto stateResidency : result.stateResidencyData) { + stats_event* event = add_stats_event_to_pull_data(data); + stats_event_set_atom_id(event, android::util::SUBSYSTEM_SLEEP_STATE); + stats_event_write_string8(event, + gEntityNames.at(result.powerEntityId).c_str()); + stats_event_write_string8(event, + gStateNames.at(result.powerEntityId) + .at(stateResidency.powerEntityStateId) + .c_str()); + stats_event_write_int64(event, stateResidency.totalStateEntryCount); + stats_event_write_int64(event, stateResidency.totalTimeInStateMs); + stats_event_build(event); + } + } + success = true; + }); // Intentionally not returning early here. // bool success determines if this succeeded or not. checkResultLocked(ret, __func__); - - return success; + if (!success) { + return STATS_PULL_SKIP; + } + return STATS_PULL_SUCCESS; } // The caller must be holding gPowerHalMutex. @@ -252,56 +244,51 @@ static bool getPowerHalLocked() { } // The caller must be holding gPowerHalMutex. -static bool getIPowerDataLocked(vector>* data) { +static status_pull_atom_return_t getIPowerDataLocked(int32_t atomTag, + pulled_stats_event_list* data) { using android::hardware::power::V1_0::Status; if(!getPowerHalLocked()) { - return false; + return STATS_PULL_SKIP; } - int64_t wallClockTimestampNs = getWallClockNs(); - int64_t elapsedTimestampNs = getElapsedRealtimeNs(); Return ret; ret = gPowerHalV1_0->getPlatformLowPowerStats( - [&data, wallClockTimestampNs, elapsedTimestampNs] - (hidl_vec states, Status status) { + [&data](hidl_vec states, Status status) { if (status != Status::SUCCESS) return; for (size_t i = 0; i < states.size(); i++) { const PowerStatePlatformSleepState& state = states[i]; + stats_event* event = add_stats_event_to_pull_data(data); + stats_event_set_atom_id(event, android::util::SUBSYSTEM_SLEEP_STATE); + stats_event_write_string8(event, state.name.c_str()); + stats_event_write_string8(event, ""); + stats_event_write_int64(event, state.totalTransitions); + stats_event_write_int64(event, state.residencyInMsecSinceBoot); + stats_event_build(event); - auto statePtr = make_shared( - android::util::SUBSYSTEM_SLEEP_STATE, - wallClockTimestampNs, elapsedTimestampNs); - statePtr->write(state.name); - statePtr->write(""); - statePtr->write(state.totalTransitions); - statePtr->write(state.residencyInMsecSinceBoot); - statePtr->init(); - data->push_back(statePtr); - VLOG("powerstate: %s, %lld, %lld, %d", state.name.c_str(), - (long long)state.residencyInMsecSinceBoot, - (long long)state.totalTransitions, - state.supportedOnlyInSuspend ? 1 : 0); + ALOGV("powerstate: %s, %lld, %lld, %d", state.name.c_str(), + (long long)state.residencyInMsecSinceBoot, + (long long)state.totalTransitions, + state.supportedOnlyInSuspend ? 1 : 0); for (const auto& voter : state.voters) { - auto voterPtr = make_shared( - android::util::SUBSYSTEM_SLEEP_STATE, - wallClockTimestampNs, elapsedTimestampNs); - voterPtr->write(state.name); - voterPtr->write(voter.name); - voterPtr->write(voter.totalNumberOfTimesVotedSinceBoot); - voterPtr->write(voter.totalTimeInMsecVotedForSinceBoot); - voterPtr->init(); - data->push_back(voterPtr); - VLOG("powerstatevoter: %s, %s, %lld, %lld", state.name.c_str(), - voter.name.c_str(), - (long long)voter.totalTimeInMsecVotedForSinceBoot, - (long long)voter.totalNumberOfTimesVotedSinceBoot); + stats_event* event = add_stats_event_to_pull_data(data); + stats_event_set_atom_id(event, android::util::SUBSYSTEM_SLEEP_STATE); + stats_event_write_string8(event, state.name.c_str()); + stats_event_write_string8(event, voter.name.c_str()); + stats_event_write_int64(event, voter.totalNumberOfTimesVotedSinceBoot); + stats_event_write_int64(event, voter.totalTimeInMsecVotedForSinceBoot); + stats_event_build(event); + + ALOGV("powerstatevoter: %s, %s, %lld, %lld", state.name.c_str(), + voter.name.c_str(), + (long long)voter.totalTimeInMsecVotedForSinceBoot, + (long long)voter.totalNumberOfTimesVotedSinceBoot); } } }); if (!checkResultLocked(ret, __func__)) { - return false; + return STATS_PULL_SKIP; } // Trying to cast to IPower 1.1, this will succeed only for devices supporting 1.1 @@ -309,41 +296,42 @@ static bool getIPowerDataLocked(vector>* data) { android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0); if (gPowerHal_1_1 != nullptr) { ret = gPowerHal_1_1->getSubsystemLowPowerStats( - [&data, wallClockTimestampNs, elapsedTimestampNs] - (hidl_vec subsystems, Status status) { - if (status != Status::SUCCESS) return; + [&data](hidl_vec subsystems, Status status) { + if (status != Status::SUCCESS) return; - if (subsystems.size() > 0) { - for (size_t i = 0; i < subsystems.size(); i++) { - const PowerStateSubsystem& subsystem = subsystems[i]; - for (size_t j = 0; j < subsystem.states.size(); j++) { - const PowerStateSubsystemSleepState& state = - subsystem.states[j]; - auto subsystemStatePtr = make_shared( - android::util::SUBSYSTEM_SLEEP_STATE, - wallClockTimestampNs, elapsedTimestampNs); - subsystemStatePtr->write(subsystem.name); - subsystemStatePtr->write(state.name); - subsystemStatePtr->write(state.totalTransitions); - subsystemStatePtr->write(state.residencyInMsecSinceBoot); - subsystemStatePtr->init(); - data->push_back(subsystemStatePtr); - VLOG("subsystemstate: %s, %s, %lld, %lld, %lld", - subsystem.name.c_str(), state.name.c_str(), - (long long)state.residencyInMsecSinceBoot, - (long long)state.totalTransitions, - (long long)state.lastEntryTimestampMs); + if (subsystems.size() > 0) { + for (size_t i = 0; i < subsystems.size(); i++) { + const PowerStateSubsystem& subsystem = subsystems[i]; + for (size_t j = 0; j < subsystem.states.size(); j++) { + const PowerStateSubsystemSleepState& state = + subsystem.states[j]; + stats_event* event = add_stats_event_to_pull_data(data); + stats_event_set_atom_id(event, + android::util::SUBSYSTEM_SLEEP_STATE); + stats_event_write_string8(event, subsystem.name.c_str()); + stats_event_write_string8(event, state.name.c_str()); + stats_event_write_int64(event, state.totalTransitions); + stats_event_write_int64(event, state.residencyInMsecSinceBoot); + stats_event_build(event); + + ALOGV("subsystemstate: %s, %s, %lld, %lld, %lld", + subsystem.name.c_str(), state.name.c_str(), + (long long)state.residencyInMsecSinceBoot, + (long long)state.totalTransitions, + (long long)state.lastEntryTimestampMs); + } + } } - } - } - }); + }); } - return true; + return STATS_PULL_SUCCESS; } // The caller must be holding gPowerHalMutex. -std::function>* data)> getPullerLocked() { - std::function>* data)> ret = {}; +std::function +getPullerLocked() { + std::function ret = + {}; // First see if power.stats HAL is available. Fall back to power HAL if // power.stats HAL is unavailable. @@ -358,7 +346,8 @@ std::function>* data)> getPullerLocked() { return ret; } -bool SubsystemSleepStatePuller::PullInternal(vector>* data) { +status_pull_atom_return_t SubsystemSleepStatePuller::Pull(int32_t atomTag, + pulled_stats_event_list* data) { std::lock_guard lock(gPowerHalMutex); if(!gPuller) { @@ -366,13 +355,13 @@ bool SubsystemSleepStatePuller::PullInternal(vector>* data) } if(gPuller) { - return gPuller(data); + return gPuller(atomTag, data); } ALOGE("Unable to load Power Hal or power.stats HAL"); - return false; + return STATS_PULL_SKIP; } -} // namespace statsd -} // namespace os +} // namespace stats +} // namespace server } // namespace android diff --git a/services/core/jni/stats/SubsystemSleepStatePuller.h b/services/core/jni/stats/SubsystemSleepStatePuller.h index 87f5f02614a94..59dbbd2584016 100644 --- a/services/core/jni/stats/SubsystemSleepStatePuller.h +++ b/services/core/jni/stats/SubsystemSleepStatePuller.h @@ -16,24 +16,22 @@ #pragma once -#include -#include "StatsPuller.h" +#include +#include namespace android { -namespace os { -namespace statsd { +namespace server { +namespace stats { /** * Reads hal for sleep states */ -class SubsystemSleepStatePuller : public StatsPuller { +class SubsystemSleepStatePuller { public: SubsystemSleepStatePuller(); - -private: - bool PullInternal(vector>* data) override; + status_pull_atom_return_t Pull(int32_t atomTag, pulled_stats_event_list* data); }; -} // namespace statsd -} // namespace os -} // namespace android +} // namespace stats +} // namespace server +} // namespace android