diff options
| -rw-r--r-- | cmds/statsd/Android.bp | 4 | ||||
| -rw-r--r-- | cmds/statsd/src/external/StatsPullerManager.cpp | 4 | ||||
| -rw-r--r-- | services/core/jni/Android.bp | 1 | ||||
| -rw-r--r-- | services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp | 15 | ||||
| -rw-r--r-- | services/core/jni/stats/SubsystemSleepStatePuller.cpp (renamed from cmds/statsd/src/external/SubsystemSleepStatePuller.cpp) | 225 | ||||
| -rw-r--r-- | services/core/jni/stats/SubsystemSleepStatePuller.h (renamed from cmds/statsd/src/external/SubsystemSleepStatePuller.h) | 20 |
6 files changed, 132 insertions, 137 deletions
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp index f26062b3eea3..bd4397afaeb7 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 982aab5a6380..fef213dad60e 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 9e01fd60885f..390068e1fa75 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 f6c0a8307b13..f5b778e85e5c 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 <statslog.h> #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/cmds/statsd/src/external/SubsystemSleepStatePuller.cpp b/services/core/jni/stats/SubsystemSleepStatePuller.cpp index f6a4aeaa3f9e..c6a836cfb6d5 100644 --- a/cmds/statsd/src/external/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 <log/log.h> +#include <statslog.h> #include <android/hardware/power/1.0/IPower.h> #include <android/hardware/power/1.1/IPower.h> @@ -32,13 +35,8 @@ #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> -#include "external/SubsystemSleepStatePuller.h" -#include "external/StatsPuller.h" - +#include <unordered_map> #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<bool(vector<shared_ptr<LogEvent>>* data)> gPuller = {}; +static std::function<status_pull_atom_return_t(int32_t atomTag, pulled_stats_event_list* data)> + gPuller = {}; static sp<android::hardware::power::V1_0::IPower> gPowerHalV1_0 = nullptr; static sp<android::hardware::power::V1_1::IPower> gPowerHalV1_1 = nullptr; @@ -91,9 +87,7 @@ struct SubsystemSleepStatePullerDeathRecipient : virtual public hardware::hidl_d static sp<SubsystemSleepStatePullerDeathRecipient> gDeathRecipient = new SubsystemSleepStatePullerDeathRecipient(); -SubsystemSleepStatePuller::SubsystemSleepStatePuller() : - StatsPuller(android::util::SUBSYSTEM_SLEEP_STATE) { -} +SubsystemSleepStatePuller::SubsystemSleepStatePuller() {} // The caller must be holding gPowerHalMutex. static bool checkResultLocked(const Return<void> &ret, const char* function) { @@ -182,48 +176,46 @@ static bool getPowerStatsHalLocked() { } // The caller must be holding gPowerHalMutex. -static bool getIPowerStatsDataLocked(vector<shared_ptr<LogEvent>>* 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<void> 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<LogEvent>( - 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<void> 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<shared_ptr<LogEvent>>* 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<void> ret; ret = gPowerHalV1_0->getPlatformLowPowerStats( - [&data, wallClockTimestampNs, elapsedTimestampNs] - (hidl_vec<PowerStatePlatformSleepState> states, Status status) { + [&data](hidl_vec<PowerStatePlatformSleepState> states, Status status) { if (status != Status::SUCCESS) return; for (size_t i = 0; i < states.size(); i++) { const PowerStatePlatformSleepState& state = states[i]; - - auto statePtr = make_shared<LogEvent>( - 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); + 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); + + 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<LogEvent>( - 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<shared_ptr<LogEvent>>* 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<PowerStateSubsystem> 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<LogEvent>( - 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); + [&data](hidl_vec<PowerStateSubsystem> 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]; + 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<bool(vector<shared_ptr<LogEvent>>* data)> getPullerLocked() { - std::function<bool(vector<shared_ptr<LogEvent>>* data)> ret = {}; +std::function<status_pull_atom_return_t(int32_t atomTag, pulled_stats_event_list* data)> +getPullerLocked() { + std::function<status_pull_atom_return_t(int32_t atomTag, pulled_stats_event_list * data)> 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<bool(vector<shared_ptr<LogEvent>>* data)> getPullerLocked() { return ret; } -bool SubsystemSleepStatePuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { +status_pull_atom_return_t SubsystemSleepStatePuller::Pull(int32_t atomTag, + pulled_stats_event_list* data) { std::lock_guard<std::mutex> lock(gPowerHalMutex); if(!gPuller) { @@ -366,13 +355,13 @@ bool SubsystemSleepStatePuller::PullInternal(vector<shared_ptr<LogEvent>>* 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/cmds/statsd/src/external/SubsystemSleepStatePuller.h b/services/core/jni/stats/SubsystemSleepStatePuller.h index 87f5f02614a9..59dbbd258401 100644 --- a/cmds/statsd/src/external/SubsystemSleepStatePuller.h +++ b/services/core/jni/stats/SubsystemSleepStatePuller.h @@ -16,24 +16,22 @@ #pragma once -#include <utils/String16.h> -#include "StatsPuller.h" +#include <stats_event.h> +#include <stats_pull_atom_callback.h> 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<std::shared_ptr<LogEvent>>* 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 |