From 18b112119dce8bb2a8a8d37f79e5485593723188 Mon Sep 17 00:00:00 2001 From: fengyang Date: Fri, 11 Apr 2025 16:42:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BA=94=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E6=9C=AA=E8=B6=85=E9=99=90=EF=BC=8C=E4=BD=86=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fengyang --- BUILD.gn | 2 + frameworks/src/bundle_state_common.cpp | 36 ++++++++----- .../napi/include/bundle_state_common.h | 2 - .../common/include/bundle_active_service.h | 2 + services/common/src/bundle_active_service.cpp | 52 +++++++++++++++---- utils/include/bundle_active_util.h | 2 + utils/src/bundle_active_util.cpp | 15 ++++++ 7 files changed, 86 insertions(+), 25 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 3ba65c5..2666825 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -396,6 +396,8 @@ ohos_shared_library("usagestatsutils") { ] public_configs = [ ":usagestatsutils_config" ] + deps = [ ":usagestatsinner" ] + external_deps = [ "c_utils:utils", "hilog:libhilog", diff --git a/frameworks/src/bundle_state_common.cpp b/frameworks/src/bundle_state_common.cpp index 03c240a..7d38634 100644 --- a/frameworks/src/bundle_state_common.cpp +++ b/frameworks/src/bundle_state_common.cpp @@ -18,6 +18,7 @@ #include "bundle_active_log.h" #include "bundle_state_common.h" #include "bundle_state_condition.h" +#include "bundle_active_util.h" namespace OHOS { namespace DeviceUsageStats { @@ -597,7 +598,7 @@ std::shared_ptr> BundleStateComm std::map::iterator iter = mergedPackageStats->find(packageStat.bundleName_); if (iter != mergedPackageStats->end()) { - MergePackageStats(iter->second, packageStat); + BundleActiveUtil::MergeSamePackageStats(iter->second, packageStat); } else { mergedPackageStats-> insert(std::pair(packageStat.bundleName_, packageStat)); @@ -629,7 +630,7 @@ std::shared_ptr>> Bu bool sign = false; for (auto packageMerge : iter->second) { if (packageMerge.appIndex_ == packageStat.appIndex_) { - MergePackageStats(packageMerge, packageStat); + BundleActiveUtil::MergeSamePackageStats(packageMerge, packageStat); sign = true; } } @@ -680,7 +681,7 @@ std::shared_ptr>> Bu bool sign = false; for (auto packageMerge : iter->second) { if (packageMerge.appIndex_ == tempPackageStat.appIndex_) { - MergePackageStats(packageMerge, tempPackageStat); + BundleActiveUtil::MergeSamePackageStats(packageMerge, tempPackageStat); sign = true; } } @@ -697,18 +698,27 @@ std::shared_ptr>> Bu return mergedPackageStats; } -void BundleStateCommon::MergePackageStats(BundleActivePackageStats &left, const BundleActivePackageStats &right) +std::vector BundleStateCommon::MergePackageStats( + const std::vector& packageStats) { - if (left.bundleName_ != right.bundleName_) { - BUNDLE_ACTIVE_LOGE("Merge package stats failed, existing packageName : %{public}s," - " new packageName : %{public}s,", left.bundleName_.c_str(), right.bundleName_.c_str()); - return; + if (packageStats.empty()) { + return packageStats; + } + std::vector tempPackageStats; + std::shared_ptr>> mergedPackageStats = + std::make_shared>>(); + for (auto packageStat : packageStats) { + std::string mergedPackageStatsKey = packageStat.bundleName_ + std::to_string(packageStat.uid_); + std::map::iterator iter = + mergedPackageStats->find(mergedPackageStatsKey); + if (iter != mergedPackageStats->end()) { + BundleActiveUtil::MergeSamePackageStats(iter->second, packageStat); + } else { + mergedPackageStats-> + insert(std::pair(mergedPackageStatsKey, packageStat)); + } } - left.lastTimeUsed_ = std::max(left.lastTimeUsed_, right.lastTimeUsed_); - left.lastContiniousTaskUsed_ = std::max(left.lastContiniousTaskUsed_, right.lastContiniousTaskUsed_); - left.totalInFrontTime_ += right.totalInFrontTime_; - left.totalContiniousTaskUsedTime_ += right.totalContiniousTaskUsedTime_; - left.bundleStartedCount_ += right.bundleStartedCount_; + return tempPackageStats; } std::unique_ptr BundleStateCommon::HandleEventStatsInfo(const napi_env &env, diff --git a/interfaces/kits/bundlestats/napi/include/bundle_state_common.h b/interfaces/kits/bundlestats/napi/include/bundle_state_common.h index cd106c5..d3cdfbf 100644 --- a/interfaces/kits/bundlestats/napi/include/bundle_state_common.h +++ b/interfaces/kits/bundlestats/napi/include/bundle_state_common.h @@ -103,8 +103,6 @@ public: static std::shared_ptr>> QueryLastUseTime( const std::map>& queryInfos, int32_t &errCode); - static void MergePackageStats(BundleActivePackageStats &left, const BundleActivePackageStats &right); - static std::unique_ptr HandleEventStatsInfo(const napi_env &env, AsyncCallbackInfoEventStats *asyncCallbackInfo, EventStatesParamsInfo ¶ms); diff --git a/services/common/include/bundle_active_service.h b/services/common/include/bundle_active_service.h index df7fdef..2a68685 100644 --- a/services/common/include/bundle_active_service.h +++ b/services/common/include/bundle_active_service.h @@ -255,6 +255,8 @@ private: int32_t DumpPackageUsage(const std::vector &dumpOption, std::vector &dumpInfo); int32_t DumpModuleUsage(const std::vector &dumpOption, std::vector &dumpInfo); int32_t GetNameAndIndexForUid(int32_t uid); + std::vector MergePackageStats( + const std::vector& packageStats); }; } // namespace DeviceUsageStats } // namespace OHOS diff --git a/services/common/src/bundle_active_service.cpp b/services/common/src/bundle_active_service.cpp index 736ef28..90e2a49 100644 --- a/services/common/src/bundle_active_service.cpp +++ b/services/common/src/bundle_active_service.cpp @@ -335,7 +335,7 @@ ErrCode BundleActiveService::IsBundleUsePeriod(bool& IsUsePeriod, const std::str return ERR_OK; } -ErrCode BundleActiveService::QueryBundleStatsInfoByInterval(std::vector& PackageStats, +ErrCode BundleActiveService::QueryBundleStatsInfoByInterval(std::vector& packageStats, const int32_t intervalType, const int64_t beginTime, const int64_t endTime, int32_t userId) { BUNDLE_ACTIVE_LOGD("QueryBundleStatsInfoByInterval stats called, intervaltype is %{public}d", intervalType); @@ -350,14 +350,17 @@ ErrCode BundleActiveService::QueryBundleStatsInfoByInterval(std::vectorQueryBundleStatsInfos( - PackageStats, userId, convertedIntervalType, beginTime, endTime, ""); - for (auto& packageStat : PackageStats) { - packageStat.appIndex_ = GetNameAndIndexForUid(packageStat.uid_); - } + if (ret != ERR_OK) { + return ret; } + int32_t convertedIntervalType = ConvertIntervalType(intervalType); + std::vector tempPackageStats; + ret = bundleActiveCore_->QueryBundleStatsInfos( + tempPackageStats, userId, convertedIntervalType, beginTime, endTime, ""); + for (auto& packageStat : tempPackageStats) { + packageStat.appIndex_ = GetNameAndIndexForUid(packageStat.uid_); + } + packageStats = MergePackageStats(tempPackageStats); return ret; } @@ -443,6 +446,7 @@ ErrCode BundleActiveService::QueryBundleStatsInfos(std::vector& tempPackageStats; if (ret == ERR_OK && userId != -1) { BUNDLE_ACTIVE_LOGD("QueryBundleStatsInfos userid is %{public}d", userId); std::string bundleName = ""; @@ -450,10 +454,11 @@ ErrCode BundleActiveService::QueryBundleStatsInfos(std::vectorQueryBundleStatsInfos(bundleActivePackageStats, userId, convertedIntervalType, + ret = bundleActiveCore_->QueryBundleStatsInfos(tempPackageStats, userId, convertedIntervalType, beginTime, endTime, bundleName); } } + bundleActivePackageStats = MergePackageStats(tempPackageStats); return ret; } @@ -712,6 +717,32 @@ void BundleActiveService::SerModuleProperties(const HapModuleInfo& hapModuleInfo moduleRecord.installFreeSupported_ = hapModuleInfo.installationFree; } +std::vector BundleActiveService::MergePackageStats( + const std::vector& packageStats) +{ + if (packageStats.empty()) { + return packageStats; + } + std::vector tempPackageStats; + std::shared_ptr>> mergedPackageStats = + std::make_shared>>(); + for (auto packageStat : packageStats) { + std::string mergedPackageStatsKey = packageStat.bundleName_ + std::to_string(packageStat.uid_); + std::map::iterator iter = + mergedPackageStats->find(mergedPackageStatsKey); + if (iter != mergedPackageStats->end()) { + BundleActiveUtil::MergeSamePackageStats(iter->second, packageStat); + } else { + mergedPackageStats-> + insert(std::pair(mergedPackageStatsKey, packageStat)); + } + } + for (auto pair : *mergedPackageStats) { + tempPackageStats.push_back(pair.second); + } + return tempPackageStats; +} + bool BundleActiveService::AllowDump() { if (ENG_MODE == 0) { @@ -799,7 +830,7 @@ int32_t BundleActiveService::DumpPackageUsage(const std::vector &du std::vector &dumpInfo) { int32_t ret = -1; - std::vector packageUsageResult; + std::vector tempPackageUsage; if (static_cast(dumpOption.size()) != PACKAGE_USAGE_PARAM) { return ret; } @@ -809,6 +840,7 @@ int32_t BundleActiveService::DumpPackageUsage(const std::vector &du int32_t userId = BundleActiveUtil::StringToInt32(dumpOption[5]); bundleActiveCore_->QueryBundleStatsInfos( packageUsageResult, userId, intervalType, beginTime, endTime, ""); + auto packageUsageResult = MergePackageStats(tempPackageUsage); for (auto& onePackageRecord : packageUsageResult) { dumpInfo.emplace_back(onePackageRecord.ToString()); } diff --git a/utils/include/bundle_active_util.h b/utils/include/bundle_active_util.h index 67f3805..8a254d6 100644 --- a/utils/include/bundle_active_util.h +++ b/utils/include/bundle_active_util.h @@ -17,6 +17,7 @@ #define BUNDLE_ACTIVE_GROUP_UTIL_H #include +#include "bundle_active_package_stats.h" namespace OHOS { namespace DeviceUsageStats { class BundleActiveUtil { @@ -32,6 +33,7 @@ public: static int64_t GetIntervalTypeStartTime(const int64_t& timeStamp, const int32_t& intervalType); static int32_t StringToInt32(const std::string& str); static int64_t StringToInt64(const std::string& str); + static void MergeSamePackageStats(BundleActivePackageStats &left, const BundleActivePackageStats &right); }; } // namespace DeviceUsageStats } // namespace OHOS diff --git a/utils/src/bundle_active_util.cpp b/utils/src/bundle_active_util.cpp index 8bc7444..aff83c3 100644 --- a/utils/src/bundle_active_util.cpp +++ b/utils/src/bundle_active_util.cpp @@ -16,6 +16,7 @@ #include #include #include "bundle_active_util.h" +#include "bundle_active_log.h" namespace OHOS { namespace DeviceUsageStats { @@ -99,6 +100,20 @@ int64_t BundleActiveUtil::StringToInt64(const std::string& str) } return res; } + +void BundleActiveUtil::MergeSamePackageStats(BundleActivePackageStats &left, const BundleActivePackageStats &right) +{ + if (left.bundleName_ != right.bundleName_) { + BUNDLE_ACTIVE_LOGE("Merge package stats failed, existing packageName : %{public}s," + " new packageName : %{public}s,", left.bundleName_.c_str(), right.bundleName_.c_str()); + return; + } + left.lastTimeUsed_ = std::max(left.lastTimeUsed_, right.lastTimeUsed_); + left.lastContiniousTaskUsed_ = std::max(left.lastContiniousTaskUsed_, right.lastContiniousTaskUsed_); + left.totalInFrontTime_ += right.totalInFrontTime_; + left.totalContiniousTaskUsedTime_ += right.totalContiniousTaskUsedTime_; + left.bundleStartedCount_ += right.bundleStartedCount_; +} } // namespace DeviceUsageStats } // namespace OHOS -- Gitee