Loading cmds/statsd/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ cc_defaults { srcs: [ ":statsd_aidl", ":ICarStatsService.aidl", "src/active_config_list.proto", "src/statsd_config.proto", "src/uid_data.proto", Loading @@ -69,6 +70,7 @@ cc_defaults { "src/config/ConfigKey.cpp", "src/config/ConfigListener.cpp", "src/config/ConfigManager.cpp", "src/external/CarStatsPuller.cpp", "src/external/GpuStatsPuller.cpp", "src/external/Perfetto.cpp", "src/external/StatsPuller.cpp", Loading cmds/statsd/src/external/CarStatsPuller.cpp 0 → 100644 +96 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define DEBUG false #include "Log.h" #include <binder/IServiceManager.h> #include <com/android/internal/car/ICarStatsService.h> #include "CarStatsPuller.h" #include "logd/LogEvent.h" #include "stats_log_util.h" using android::binder::Status; using com::android::internal::car::ICarStatsService; namespace android { namespace os { namespace statsd { static std::mutex gCarStatsMutex; static sp<ICarStatsService> gCarStats = nullptr; class CarStatsDeathRecipient : public android::IBinder::DeathRecipient { public: CarStatsDeathRecipient() = default; ~CarStatsDeathRecipient() override = default; // android::IBinder::DeathRecipient override: void binderDied(const android::wp<android::IBinder>& /* who */) override { ALOGE("Car service has died"); std::lock_guard<std::mutex> lock(gCarStatsMutex); if (gCarStats) { sp<IBinder> binder = IInterface::asBinder(gCarStats); binder->unlinkToDeath(this); gCarStats = nullptr; } } }; static sp<CarStatsDeathRecipient> gDeathRecipient = new CarStatsDeathRecipient(); static sp<ICarStatsService> getCarService() { std::lock_guard<std::mutex> lock(gCarStatsMutex); if (!gCarStats) { const sp<IBinder> binder = defaultServiceManager()->checkService(String16("car_stats")); if (!binder) { ALOGW("Car service is unavailable"); return nullptr; } gCarStats = interface_cast<ICarStatsService>(binder); binder->linkToDeath(gDeathRecipient); } return gCarStats; } CarStatsPuller::CarStatsPuller(const int tagId) : StatsPuller(tagId) { } bool CarStatsPuller::PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) { const sp<ICarStatsService> carService = getCarService(); if (!carService) { return false; } vector<StatsLogEventWrapper> returned_value; Status status = carService->pullData(mTagId, &returned_value); if (!status.isOk()) { ALOGW("CarStatsPuller::pull failed for %d", mTagId); return false; } data->clear(); for (const StatsLogEventWrapper& it : returned_value) { LogEvent::createLogEvents(it, *data); } VLOG("CarStatsPuller::pull succeeded for %d", mTagId); return true; } } // namespace statsd } // namespace os } // namespace android cmds/statsd/src/external/CarStatsPuller.h 0 → 100644 +36 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "StatsPuller.h" namespace android { namespace os { namespace statsd { /** * Pull atoms from CarService. */ class CarStatsPuller : public StatsPuller { public: explicit CarStatsPuller(const int tagId); bool PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) override; }; } // namespace statsd } // namespace os } // namespace android cmds/statsd/src/external/StatsPullerManager.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include "../logd/LogEvent.h" #include "../stats_log_util.h" #include "../statscompanion_util.h" #include "CarStatsPuller.h" #include "GpuStatsPuller.h" #include "PowerStatsPuller.h" #include "ResourceHealthManagerPuller.h" Loading Loading @@ -267,6 +268,10 @@ std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { // App ops {android::util::APP_OPS, {.puller = new StatsCompanionServicePuller(android::util::APP_OPS)}}, // VmsClientStats {android::util::VMS_CLIENT_STATS, {.additiveFields = {5, 6, 7, 8, 9, 10}, .puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { Loading core/java/Android.bp +5 −0 Original line number Diff line number Diff line Loading @@ -7,3 +7,8 @@ filegroup { name: "IDropBoxManagerService.aidl", srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"], } filegroup { name: "ICarStatsService.aidl", srcs: ["com/android/internal/car/ICarStatsService.aidl"], } Loading
cmds/statsd/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ cc_defaults { srcs: [ ":statsd_aidl", ":ICarStatsService.aidl", "src/active_config_list.proto", "src/statsd_config.proto", "src/uid_data.proto", Loading @@ -69,6 +70,7 @@ cc_defaults { "src/config/ConfigKey.cpp", "src/config/ConfigListener.cpp", "src/config/ConfigManager.cpp", "src/external/CarStatsPuller.cpp", "src/external/GpuStatsPuller.cpp", "src/external/Perfetto.cpp", "src/external/StatsPuller.cpp", Loading
cmds/statsd/src/external/CarStatsPuller.cpp 0 → 100644 +96 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define DEBUG false #include "Log.h" #include <binder/IServiceManager.h> #include <com/android/internal/car/ICarStatsService.h> #include "CarStatsPuller.h" #include "logd/LogEvent.h" #include "stats_log_util.h" using android::binder::Status; using com::android::internal::car::ICarStatsService; namespace android { namespace os { namespace statsd { static std::mutex gCarStatsMutex; static sp<ICarStatsService> gCarStats = nullptr; class CarStatsDeathRecipient : public android::IBinder::DeathRecipient { public: CarStatsDeathRecipient() = default; ~CarStatsDeathRecipient() override = default; // android::IBinder::DeathRecipient override: void binderDied(const android::wp<android::IBinder>& /* who */) override { ALOGE("Car service has died"); std::lock_guard<std::mutex> lock(gCarStatsMutex); if (gCarStats) { sp<IBinder> binder = IInterface::asBinder(gCarStats); binder->unlinkToDeath(this); gCarStats = nullptr; } } }; static sp<CarStatsDeathRecipient> gDeathRecipient = new CarStatsDeathRecipient(); static sp<ICarStatsService> getCarService() { std::lock_guard<std::mutex> lock(gCarStatsMutex); if (!gCarStats) { const sp<IBinder> binder = defaultServiceManager()->checkService(String16("car_stats")); if (!binder) { ALOGW("Car service is unavailable"); return nullptr; } gCarStats = interface_cast<ICarStatsService>(binder); binder->linkToDeath(gDeathRecipient); } return gCarStats; } CarStatsPuller::CarStatsPuller(const int tagId) : StatsPuller(tagId) { } bool CarStatsPuller::PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) { const sp<ICarStatsService> carService = getCarService(); if (!carService) { return false; } vector<StatsLogEventWrapper> returned_value; Status status = carService->pullData(mTagId, &returned_value); if (!status.isOk()) { ALOGW("CarStatsPuller::pull failed for %d", mTagId); return false; } data->clear(); for (const StatsLogEventWrapper& it : returned_value) { LogEvent::createLogEvents(it, *data); } VLOG("CarStatsPuller::pull succeeded for %d", mTagId); return true; } } // namespace statsd } // namespace os } // namespace android
cmds/statsd/src/external/CarStatsPuller.h 0 → 100644 +36 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "StatsPuller.h" namespace android { namespace os { namespace statsd { /** * Pull atoms from CarService. */ class CarStatsPuller : public StatsPuller { public: explicit CarStatsPuller(const int tagId); bool PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) override; }; } // namespace statsd } // namespace os } // namespace android
cmds/statsd/src/external/StatsPullerManager.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include "../logd/LogEvent.h" #include "../stats_log_util.h" #include "../statscompanion_util.h" #include "CarStatsPuller.h" #include "GpuStatsPuller.h" #include "PowerStatsPuller.h" #include "ResourceHealthManagerPuller.h" Loading Loading @@ -267,6 +268,10 @@ std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { // App ops {android::util::APP_OPS, {.puller = new StatsCompanionServicePuller(android::util::APP_OPS)}}, // VmsClientStats {android::util::VMS_CLIENT_STATS, {.additiveFields = {5, 6, 7, 8, 9, 10}, .puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { Loading
core/java/Android.bp +5 −0 Original line number Diff line number Diff line Loading @@ -7,3 +7,8 @@ filegroup { name: "IDropBoxManagerService.aidl", srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"], } filegroup { name: "ICarStatsService.aidl", srcs: ["com/android/internal/car/ICarStatsService.aidl"], }