diff --git a/interfaces/inner_api/ability_manager/BUILD.gn b/interfaces/inner_api/ability_manager/BUILD.gn index 55d58d3ea7abfb7c584459f4181dd618d19c0223..fe6deec9d990b628595ac1f79072d521d2163a21 100644 --- a/interfaces/inner_api/ability_manager/BUILD.gn +++ b/interfaces/inner_api/ability_manager/BUILD.gn @@ -147,6 +147,7 @@ ohos_shared_library("ability_manager") { "${ability_runtime_innerkits_path}/app_manager:app_manager", "${ability_runtime_path}/utils/global/freeze:freeze_util", "${ability_runtime_services_path}/abilitymgr:wantagent_manager", + "${ability_runtime_services_path}/common:hitrace_chain_util", ] external_deps = [ @@ -157,6 +158,7 @@ ohos_shared_library("ability_manager") { "hilog:libhilog", "hisysevent:libhisysevent", "hitrace:hitrace_meter", + "hitrace:libhitracechain", "ipc:ipc_core", "ipc:ipc_napi", "jsoncpp:jsoncpp", diff --git a/interfaces/inner_api/app_manager/BUILD.gn b/interfaces/inner_api/app_manager/BUILD.gn index c9658b81753f9371a938e6f71a55f0b8f1ebf6d0..b2ec3368455d0ea26b6c6bf5ada9ec5f8e674e09 100644 --- a/interfaces/inner_api/app_manager/BUILD.gn +++ b/interfaces/inner_api/app_manager/BUILD.gn @@ -141,6 +141,7 @@ ohos_shared_library("app_manager") { "${ability_runtime_path}/utils/global/freeze:freeze_util", "${ability_runtime_path}/utils/server/startup:startup_util", "${ability_runtime_services_path}/common:app_util", + "${ability_runtime_services_path}/common:hitrace_chain_util", "${ability_runtime_services_path}/common:res_sched_util", ] @@ -153,6 +154,7 @@ ohos_shared_library("app_manager") { "hilog:libhilog", "hisysevent:libhisysevent", "hitrace:hitrace_meter", + "hitrace:libhitracechain", "init:libbegetutil", "ipc:ipc_core", "json:nlohmann_json_static", diff --git a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp index 29ea15c9b42db239c306dce36d3ae8b0bbd066e5..8464da2409b920e861b7b31ca2b4f57f583399c9 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp @@ -18,6 +18,7 @@ #include "ability_manager_errors.h" #include "appexecfwk_errors.h" #include "hilog_tag_wrapper.h" +#include "hitrace_chain_utils.h" #include "hitrace_meter.h" #include "ipc_capacity_wrap.h" #include "ipc_types.h" @@ -943,6 +944,7 @@ int AppMgrProxy::GetRenderProcessTerminationStatus(pid_t renderPid, int &status) int32_t AppMgrProxy::UpdateConfiguration(const Configuration &config, const int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("UpdateConfiguration", HITRACE_FLAG_INCLUDE_ASYNC); TAG_LOGI(AAFwkTag::APPMGR, "AppMgrProxy UpdateConfiguration"); MessageParcel data; MessageParcel reply; @@ -1010,6 +1012,7 @@ int32_t AppMgrProxy::UpdateConfigurationForBackgroundApp(const std::vector &callerToken, AppExecFwk::ExtensionAbilityType extensionType, int32_t userId, bool isQueryExtensionOnly) { + Ability_MANAGER_HITRACE_CHAIN_NAME("ConnectAbilityCommon", HITRACE_FLAG_INCLUDE_ASYNC); if (connect == nullptr) { TAG_LOGE(AAFwkTag::EXTMGR, "null connect"); return CONNECTION_NOT_EXIST; @@ -90,6 +92,7 @@ int ExtensionManagerProxy::ConnectAbilityCommon(const Want &want, sptr &connect) { + Ability_MANAGER_HITRACE_CHAIN_NAME("DisconnectAbility", HITRACE_FLAG_INCLUDE_ASYNC); if (connect == nullptr) { TAG_LOGE(AAFwkTag::EXTMGR, "disconnect ability failed"); return INVALID_PARAMETERS_ERR; diff --git a/interfaces/inner_api/wantagent/BUILD.gn b/interfaces/inner_api/wantagent/BUILD.gn index e047578302f2bc1262ad3479a0c12fd09110d9a9..0ad188f0cdbbd21362b3c655328bbe4abcf6de7b 100644 --- a/interfaces/inner_api/wantagent/BUILD.gn +++ b/interfaces/inner_api/wantagent/BUILD.gn @@ -72,6 +72,7 @@ ohos_shared_library("wantagent_innerkits") { "${ability_runtime_innerkits_path}/ability_manager:ability_start_options", "${ability_runtime_innerkits_path}/error_utils:ability_runtime_error_util", "${ability_runtime_services_path}/abilitymgr:wantagent_manager", + "${ability_runtime_services_path}/common:hitrace_chain_util", ] external_deps = [ @@ -80,6 +81,7 @@ ohos_shared_library("wantagent_innerkits") { "hilog:libhilog", "hisysevent:libhisysevent", "hitrace:hitrace_meter", + "hitrace:libhitracechain", "ipc:ipc_core", "jsoncpp:jsoncpp", "napi:ace_napi", diff --git a/interfaces/inner_api/wantagent/src/want_agent_client.cpp b/interfaces/inner_api/wantagent/src/want_agent_client.cpp index a40d6d53a28ba68a3d7a45d71ac44704e9eed3fa..b1ec63902a856ed3588b9208f934f024cc747dcf 100644 --- a/interfaces/inner_api/wantagent/src/want_agent_client.cpp +++ b/interfaces/inner_api/wantagent/src/want_agent_client.cpp @@ -20,6 +20,7 @@ #include "ability_manager_interface.h" #include "ability_util.h" #include "hilog_tag_wrapper.h" +#include "hitrace_chain_utils.h" #include "hitrace_meter.h" #include "if_system_ability_manager.h" #include "iservice_registry.h" @@ -45,6 +46,7 @@ ErrCode WantAgentClient::GetWantSender( const WantSenderInfo &wantSenderInfo, const sptr &callerToken, sptr &wantSender, int32_t uid) { + Ability_MANAGER_HITRACE_CHAIN_NAME("GetWantSender", HITRACE_FLAG_INCLUDE_ASYNC); auto abms = GetAbilityManager(); CHECK_POINTER_AND_RETURN(abms, ERR_ABILITY_RUNTIME_EXTERNAL_SERVICE_BUSY); MessageParcel data; diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 8854ad86ad3c79a5a7913204b10b5d2d035bc4a9..76e8d7d50194fedd7ccddeffc6c7ffdf03f54d08 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -18,6 +18,7 @@ #include "ability_scheduler_stub.h" #include "ability_util.h" #include "freeze_util.h" +#include "hitrace_chain_utils.h" #include "hitrace_meter.h" #include "ipc_capacity_wrap.h" #include "server_constant.h" @@ -64,6 +65,7 @@ bool AbilityManagerProxy::ExtendMaxIpcCapacityForWant(const Want &want, MessageP int AbilityManagerProxy::StartAbility(const Want &want, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -154,6 +156,7 @@ AppExecFwk::ElementName AbilityManagerProxy::GetElementNameByToken(sptr &callerToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -199,6 +202,7 @@ int AbilityManagerProxy::StartAbility(const Want &want, const AbilityStartSettin int AbilityManagerProxy::StartAbility( const Want &want, const sptr &callerToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -287,6 +291,7 @@ int AbilityManagerProxy::StartAbilityWithSpecifyTokenId( int32_t AbilityManagerProxy::StartAbilityByInsightIntent(const Want &want, const sptr &callerToken, uint64_t intentId, int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityByInsightIntent", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (callerToken == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid callertoken"); @@ -331,6 +336,7 @@ int32_t AbilityManagerProxy::StartAbilityByInsightIntent(const Want &want, const int AbilityManagerProxy::StartAbility(const Want &want, const StartOptions &startOptions, const sptr &callerToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -376,6 +382,7 @@ int AbilityManagerProxy::StartAbility(const Want &want, const StartOptions &star int AbilityManagerProxy::StartAbilityAsCaller(const Want &want, const sptr &callerToken, sptr asCallerSourceToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityAsCaller", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; MessageParcel reply; MessageOption option; @@ -409,6 +416,7 @@ int AbilityManagerProxy::StartAbilityAsCaller(const Want &want, const StartOptio const sptr &callerToken, sptr asCallerSourceToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityAsCaller", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -444,6 +452,7 @@ int AbilityManagerProxy::StartAbilityAsCaller(const Want &want, const StartOptio int AbilityManagerProxy::StartAbilityForResultAsCaller( const Want &want, const sptr &callerToken, int requestCode, int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityForResultAsCaller", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (!WriteInterfaceToken(data)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "write token failed"); @@ -471,6 +480,7 @@ int AbilityManagerProxy::StartAbilityForResultAsCaller( int AbilityManagerProxy::StartAbilityForResultAsCaller(const Want &want, const StartOptions &startOptions, const sptr &callerToken, int requestCode, int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityForResultAsCaller", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (!WriteInterfaceToken(data)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "write token failed"); @@ -537,6 +547,7 @@ int AbilityManagerProxy::StartAbilityByUIContentSession(const Want &want, const sptr &callerToken, const sptr &sessionInfo, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityByUIContentSession", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -563,6 +574,7 @@ int AbilityManagerProxy::StartAbilityByUIContentSession(const Want &want, const const sptr &callerToken, const sptr &sessionInfo, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartAbilityByUIContentSession", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -631,6 +643,7 @@ int AbilityManagerProxy::StartAbilityOnlyUIAbility(const Want &want, const sptr< int32_t AbilityManagerProxy::StartExtensionAbility(const Want &want, const sptr &callerToken, int32_t userId, AppExecFwk::ExtensionAbilityType extensionType) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartExtensionAbility", HITRACE_FLAG_INCLUDE_ASYNC); HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); int error; MessageParcel data; @@ -770,6 +783,7 @@ int AbilityManagerProxy::ChangeUIAbilityVisibilityBySCB(sptr sessio int AbilityManagerProxy::StartUIExtensionAbility(const sptr &extensionSessionInfo, int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartUIExtensionAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -816,6 +830,7 @@ int AbilityManagerProxy::StartUIExtensionAbility(const sptr &extens int AbilityManagerProxy::StartUIAbilityBySCB(sptr sessionInfo, bool &isColdStart, uint32_t sceneFlag) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartUIAbilityBySCB", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; MessageParcel reply; MessageOption option; @@ -896,6 +911,7 @@ int AbilityManagerProxy::TerminateAbility(const sptr &token, int int AbilityManagerProxy::TerminateAbility(const sptr &token, int resultCode, const Want *resultWant, bool flag) { + Ability_MANAGER_HITRACE_CHAIN_NAME("TerminateAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1005,6 +1021,7 @@ int32_t AbilityManagerProxy::TerminateUIServiceExtensionAbility(const sptr &extensionSessionInfo, int resultCode, const Want *resultWant) { + Ability_MANAGER_HITRACE_CHAIN_NAME("TerminateUIExtensionAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1072,6 +1089,7 @@ int AbilityManagerProxy::CloseUIExtensionAbilityBySCB(const sptr int AbilityManagerProxy::CloseUIAbilityBySCB(const sptr &sessionInfo, bool isUserRequestedExit, uint32_t sceneFlag) { + Ability_MANAGER_HITRACE_CHAIN_NAME("CloseUIAbilityBySCB", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1138,6 +1156,7 @@ int AbilityManagerProxy::SendResultToAbility(int32_t requestCode, int32_t result int AbilityManagerProxy::MoveAbilityToBackground(const sptr &token) { + Ability_MANAGER_HITRACE_CHAIN_NAME("MoveAbilityToBackground", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1200,6 +1219,7 @@ int AbilityManagerProxy::ConnectAbilityCommon( const Want &want, const sptr &connect, const sptr &callerToken, AppExecFwk::ExtensionAbilityType extensionType, int32_t userId, bool isQueryExtensionOnly) { + Ability_MANAGER_HITRACE_CHAIN_NAME("ConnectAbilityCommon", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; MessageParcel reply; MessageOption option; @@ -1281,6 +1301,7 @@ int AbilityManagerProxy::ConnectUIExtensionAbility(const Want &want, const sptr< int AbilityManagerProxy::DisconnectAbility(sptr connect) { + Ability_MANAGER_HITRACE_CHAIN_NAME("DisconnectAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1642,6 +1663,7 @@ void AbilityManagerProxy::DumpState(const std::string &args, std::vector &token, bool fromUser) { + Ability_MANAGER_HITRACE_CHAIN_NAME("MinimizeAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -1670,6 +1692,7 @@ int AbilityManagerProxy::MinimizeAbility(const sptr &token, bool int AbilityManagerProxy::MinimizeUIExtensionAbility(const sptr &extensionSessionInfo, bool fromUser) { + Ability_MANAGER_HITRACE_CHAIN_NAME("MinimizeUIExtensionAbility", HITRACE_FLAG_INCLUDE_ASYNC); int error; MessageParcel data; MessageParcel reply; @@ -2945,6 +2968,7 @@ int AbilityManagerProxy::CleanMission(int32_t missionId) int AbilityManagerProxy::CleanAllMissions() { + Ability_MANAGER_HITRACE_CHAIN_NAME("CleanAllMissions", HITRACE_FLAG_INCLUDE_ASYNC); HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); int error; MessageParcel data; @@ -3069,6 +3093,7 @@ int AbilityManagerProxy::MoveMissionsToBackground(const std::vector& mi int AbilityManagerProxy::StartUser(int userId, sptr callback, bool isAppRecovery) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StartUser", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (!WriteInterfaceToken(data)) { return INNER_ERR; @@ -3126,6 +3151,7 @@ int AbilityManagerProxy::SetMissionContinueState(const sptr &toke int AbilityManagerProxy::StopUser(int userId, const sptr &callback) { + Ability_MANAGER_HITRACE_CHAIN_NAME("StopUser", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (!WriteInterfaceToken(data)) { return INNER_ERR; @@ -3156,6 +3182,7 @@ int AbilityManagerProxy::StopUser(int userId, const sptr &callbac int AbilityManagerProxy::LogoutUser(int32_t userId, sptr callback) { + Ability_MANAGER_HITRACE_CHAIN_NAME("LogoutUser", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; MessageParcel reply; MessageOption option; @@ -4331,6 +4358,7 @@ int32_t AbilityManagerProxy::RequestDialogService(const Want &want, const sptr &callerToken) { + Ability_MANAGER_HITRACE_CHAIN_NAME("ReportDrawnCompleted", HITRACE_FLAG_INCLUDE_ASYNC); TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); if (callerToken == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "null callerToken"); @@ -5088,6 +5116,7 @@ int32_t AbilityManagerProxy::DetachAppDebug(const std::string &bundleName, bool int32_t AbilityManagerProxy::ExecuteIntent(uint64_t key, const sptr &callerToken, const InsightIntentExecuteParam ¶m) { + Ability_MANAGER_HITRACE_CHAIN_NAME("ExecuteIntent", HITRACE_FLAG_INCLUDE_ASYNC); TAG_LOGD(AAFwkTag::ABILITYMGR, "called"); MessageParcel data; MessageParcel reply; @@ -5515,6 +5544,7 @@ int32_t AbilityManagerProxy::GetUIExtensionSessionInfo(const sptr int32_t AbilityManagerProxy::OpenAtomicService(Want& want, const StartOptions &options, sptr callerToken, int32_t requestCode, int32_t userId) { + Ability_MANAGER_HITRACE_CHAIN_NAME("OpenAtomicService", HITRACE_FLAG_INCLUDE_ASYNC); MessageParcel data; if (!WriteInterfaceToken(data)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "write token fail"); @@ -5667,6 +5697,7 @@ int32_t AbilityManagerProxy::GetAbilityStateByPersistentId(int32_t persistentId, int32_t AbilityManagerProxy::TransferAbilityResultForExtension(const sptr &callerToken, int32_t resultCode, const Want &want) { + Ability_MANAGER_HITRACE_CHAIN_NAME("TransferAbilityResultForExtension", HITRACE_FLAG_INCLUDE_ASYNC); if (callerToken == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "null callerToken"); return INNER_ERR; @@ -5794,6 +5825,7 @@ int32_t AbilityManagerProxy::PreStartMission(const std::string& bundleName, cons ErrCode AbilityManagerProxy::OpenLink(const Want& want, sptr callerToken, int32_t userId, int requestCode) { + Ability_MANAGER_HITRACE_CHAIN_NAME("OpenLink", HITRACE_FLAG_INCLUDE_ASYNC); if (callerToken == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "null callerToken"); return INNER_ERR; diff --git a/services/common/BUILD.gn b/services/common/BUILD.gn index 6a3961d796bd9f994c4189879256825ee93a2846..fd3e23a7b15e1fd176a6fb95fb2691a9b8e1677e 100644 --- a/services/common/BUILD.gn +++ b/services/common/BUILD.gn @@ -242,3 +242,30 @@ ohos_shared_library("rate_limiter") { subsystem_name = "ability" part_name = "ability_runtime" } + +ohos_shared_library("hitrace_chain_util") { + sanitize = { + integer_overflow = true + ubsan = true + boundary_sanitize = true + cfi = true + cfi_cross_dso = true + debug = false + } + branch_protector_ret = "pac_ret" + + include_dirs = [ "include" ] + + public_configs = [ ":common_config" ] + + sources = [ "src/hitrace_chain_utils.cpp" ] + + external_deps = [ + "c_utils:utils", + "hitrace:libhitracechain", + ] + + innerapi_tags = [ "platformsdk_indirect" ] + subsystem_name = "ability" + part_name = "ability_runtime" +} \ No newline at end of file diff --git a/services/common/include/hitrace_chain_utils.h b/services/common/include/hitrace_chain_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..39abfb273eb8d8043ce678e605c89eed0aa871ba --- /dev/null +++ b/services/common/include/hitrace_chain_utils.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * 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. + */ + +#ifndef OHOS_ABILITY_RUNTIME_HITRACE_CHAIN_UTILS_H +#define OHOS_ABILITY_RUNTIME_HITRACE_CHAIN_UTILS_H + +#include "hitracechain.h" + +#define Ability_MANAGER_HITRACE_CHAIN_NAME(name, flag) AAFwk::AbilityHitraceChain traceid(name, flag) + +namespace OHOS { +namespace AAFwk { +class AbilityHitraceChain { +public: + AbilityHitraceChain(const std::string &name, HiTraceFlag flags); + ~AbilityHitraceChain(); + +private: + HiviewDFX::HiTraceId traceId_; +}; +} // namespace AAFwk +} // namespace OHOS + +#endif // #define OHOS_ABILITY_RUNTIME_HITRACE_CHAIN_UTILS_H \ No newline at end of file diff --git a/services/common/src/hitrace_chain_utils.cpp b/services/common/src/hitrace_chain_utils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4c29c5c03c3df914764cc2eb039291afb4b6f46e --- /dev/null +++ b/services/common/src/hitrace_chain_utils.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * 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. + */ + +#include "hitrace_chain_utils.h" + +namespace OHOS { +namespace AAFwk { +AbilityHitraceChain::AbilityHitraceChain(const std::string &name, HiTraceFlag flags) +{ + if (!HiviewDFX::HiTraceChain::GetId().IsValid()) { + traceId_ = HiviewDFX::HiTraceChain::Begin(name, flags); + } +} + +AbilityHitraceChain::~AbilityHitraceChain() +{ + if (traceId_.IsValid()) { + HiviewDFX::HiTraceChain::End(traceId_); + } +} +} // namespace AAFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 07923eb62203a54fd29bed44465239ad2cb653a3..47533c03d64edcfb84b72ed3fd68b162172c0fe1 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -65,6 +65,7 @@ ohos_source_set("appmgr_test_source") { "${ability_runtime_innerkits_path}/app_manager:app_manager", "${ability_runtime_path}/utils/global/freeze:freeze_util", "${ability_runtime_services_path}/common:app_util", + "${ability_runtime_services_path}/common:hitrace_chain_util", ] external_deps = [ @@ -77,6 +78,7 @@ ohos_source_set("appmgr_test_source") { "common_event_service:cesfwk_innerkits", "hilog:libhilog", "hitrace:hitrace_meter", + "hitrace:libhitracechain", "i18n:intl_util", "ipc:ipc_core", "json:nlohmann_json_static", @@ -373,6 +375,7 @@ group("unittest") { "freeze_util_test:unittest", "hidden_start_observer_manager_test:unittest", "hidden_start_utils_test:unittest", + "hitrace_chain_utils_test:unittest", "implicit_start_processor_test:unittest", "insight_intent:unittest", "insight_intent_db_cache_test:unittest", diff --git a/test/unittest/ability_manager_proxy_sixth_test/BUILD.gn b/test/unittest/ability_manager_proxy_sixth_test/BUILD.gn index 3a0641964b055445fbcf2a95d61c36343693ff43..b992feaaa980bdf4237cae81523b3bc9c2663c5d 100644 --- a/test/unittest/ability_manager_proxy_sixth_test/BUILD.gn +++ b/test/unittest/ability_manager_proxy_sixth_test/BUILD.gn @@ -51,6 +51,7 @@ ohos_unittest("ability_manager_proxy_sixth_test") { "${ability_runtime_path}/utils/global/freeze:freeze_util", "${ability_runtime_services_path}/abilitymgr:abilityms", "${ability_runtime_services_path}/abilitymgr:wantagent_manager", + "${ability_runtime_services_path}/common:hitrace_chain_util", "${ability_runtime_services_path}/common:perm_verification", "${ability_runtime_services_path}/common:record_cost_time_util", "${ability_runtime_test_path}/mock/services_abilitymgr_test/libs/aakit:aakit_mock", @@ -71,6 +72,7 @@ ohos_unittest("ability_manager_proxy_sixth_test") { "hilog:libhilog", "hisysevent:libhisysevent", "hitrace:hitrace_meter", + "hitrace:libhitracechain", "init:libbeget_proxy", "ipc:ipc_core", "napi:ace_napi", diff --git a/test/unittest/hitrace_chain_utils_test/BUILD.gn b/test/unittest/hitrace_chain_utils_test/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..ed47e8de73cf43b5e397470ca23912f373348bd8 --- /dev/null +++ b/test/unittest/hitrace_chain_utils_test/BUILD.gn @@ -0,0 +1,41 @@ +# Copyright (c) 2025 Huawei Device Co., Ltd. +# 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. + +import("//build/test.gni") +import("//foundation/ability/ability_runtime/ability_runtime.gni") + +module_output_path = "ability_runtime/ability_runtime/hitrace_chain_utils" + +ohos_unittest("hitrace_chain_utils_test") { + module_out_path = module_output_path + + configs = [ "${ability_runtime_services_path}/common:common_config" ] + + if (target_cpu == "arm") { + cflags = [ "-DBINDER_IPC_32BIT" ] + } + + sources = [ "hitrace_chain_utils_test.cpp" ] + + deps = [ "${ability_runtime_services_path}/common:hitrace_chain_util" ] + + external_deps = [ + "c_utils:utils", + "hitrace:libhitracechain", + ] +} + +group("unittest") { + testonly = true + deps = [ ":hitrace_chain_utils_test" ] +} diff --git a/test/unittest/hitrace_chain_utils_test/hitrace_chain_utils_test.cpp b/test/unittest/hitrace_chain_utils_test/hitrace_chain_utils_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bef5e3340ebea6b49d409213e5ba40791f25ec50 --- /dev/null +++ b/test/unittest/hitrace_chain_utils_test/hitrace_chain_utils_test.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * 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. + */ + +#include + +#include "hitrace_chain_utils.h" + +using namespace testing; +using namespace testing::ext; + +namespace OHOS { +namespace AbilityRuntime { +class AbilityHitraceChainTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp() override; + void TearDown() override; +}; + +void AbilityHitraceChainTest::SetUpTestCase(void) {} + +void AbilityHitraceChainTest::TearDownTestCase(void) {} + +void AbilityHitraceChainTest::SetUp() {} + +void AbilityHitraceChainTest::TearDown() {} + +HWTEST_F(AbilityHitraceChainTest, AbilityHitraceChain_001, TestSize.Level1) +{ + auto isValid = HiviewDFX::HiTraceChain::GetId().IsValid(); + EXPECT_FALSE(isValid); + AAFwk::AbilityHitraceChain abilityHitraceChain("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); + isValid = HiviewDFX::HiTraceChain::GetId().IsValid(); + EXPECT_TRUE(isValid); +} + +HWTEST_F(AbilityHitraceChainTest, AbilityHitraceChain_002, TestSize.Level1) +{ + auto traceId = HiviewDFX::HiTraceChain::Begin("StartAbility", HITRACE_FLAG_INCLUDE_ASYNC); + AAFwk::AbilityHitraceChain abilityHitraceChain("StartAbility", HITRACE_FLAG_DEFAULT); + auto chainId = HiviewDFX::HiTraceChain::GetId().GetChainId(); + EXPECT_EQ(chainId, traceId.GetChainId()); + auto isFlagEnabled = HiviewDFX::HiTraceChain::GetId().IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC); + EXPECT_TRUE(isFlagEnabled); + HiviewDFX::HiTraceChain::End(traceId); +} +} // namespace AbilityRuntime +} // namespace OHOS \ No newline at end of file