From 5fdc1a653ab4e8083ffaed016c1052479ecd98cb Mon Sep 17 00:00:00 2001 From: chuaizhzh Date: Sat, 26 Jul 2025 11:38:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:Ide=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chuaizhzh --- ide/src/config/config.json | 136 +++++++++++++++ trace_streamer/test/unittest/BUILD.gn | 159 ++++++++++++++++++ .../ptreader_parser/event_parser_test.cpp | 102 +++++++++++ 3 files changed, 397 insertions(+) create mode 100644 ide/src/config/config.json create mode 100644 trace_streamer/test/unittest/BUILD.gn diff --git a/ide/src/config/config.json b/ide/src/config/config.json new file mode 100644 index 00000000..6b4ff707 --- /dev/null +++ b/ide/src/config/config.json @@ -0,0 +1,136 @@ +{ + "_comment": "这是动效的相关打点", + "Animation": { + "_comment": "动效过程打点线程,render_service为并行化前的打点线程,RSUniRenderThre为并行化后的打点线程", + "animationProcEvents_": [ + "render_service", + "RSUniRenderThre" + ], + "_comment": "动效相关打点,H:LAUNCHER_APP_LAUNCH_FROM_ICON为桌面图标点击启动,H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR为通知栏通知消息点击启动,H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR_IN_LOCKSCREEN为锁屏通知消息点击启动,H:LAUNCHER_APP_LAUNCH_FROM_RECENT为多任务点击应用,H:LAUNCHER_APP_SWIPE_TO_HOME为HOME键返回桌面,H:LAUNCHER_APP_BACK_TO_HOME为Back键返回桌面,H:APP_TRANSITION_TO_OTHER_APP为应用切换到另一个应用,H:APP_TRANSITION_FROM_OTHER_APP为从另一个应用跳回,H:APP_LIST_FLING为应用中列表滑动", + "onAnimationStartEvents_": [ + "H:LAUNCHER_APP_LAUNCH_FROM_ICON", + "H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR", + "H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR_IN_LOCKSCREEN", + "H:LAUNCHER_APP_LAUNCH_FROM_RECENT", + "H:LAUNCHER_APP_SWIPE_TO_HOME", + "H:LAUNCHER_APP_BACK_TO_HOME", + "H:APP_TRANSITION_TO_OTHER_APP", + "H:APP_TRANSITION_FROM_OTHER_APP", + "H:APP_LIST_FLING" + ], + "_comment": "H:GenerateVsyncCount,用于计算设备的平均帧率,累计6次后输出平均帧率", + "frameRateCmd_": [ + "H:GenerateVsyncCount" + ], + "_comment": "H:RSJankStats::RecordAnimationDynamicFrameRate,用于更新动效的帧率,若存在此打点,则以这个打点为准,否则以H:Repaint为准", + "realFrameRateCmd_": [ + "H:RSJankStats::RecordAnimationDynamicFrameRate" + ], + "_comment": "H:Repaint(硬件合成器合成绘制),用于计算动效帧率", + "frameCountCmd_": [ + "H:Repaint" + ], + "_comment": "H:RSUniRender::Process:[WindowScene_和H:RSSurfaceRenderNodeDrawable::OnDraw:[WindowScene_用来获取动效帧数据的打点,其中H:RSUniRender::Process:[WindowScene_为并行化前打点", + "frameBeginCmd_": [ + "H:RSUniRender::Process:[WindowScene_", + "H:RSSurfaceRenderNodeDrawable::OnDraw:[WindowScene_" + ], + "_comment": "H:RSUniRender::Process:[SCBDesktop和H:RSSurfaceRenderNodeDrawable::OnDraw:[SCBDesktop用来获取设备的宽高,其中H:RSUniRender::Process:[SCBDesktop为并行化前打点", + "screenSizeCmd_": [ + "H:RSUniRender::Process:[SCBDesktop", + "H:RSSurfaceRenderNodeDrawable::OnDraw:[SCBDesktop" + ], + "_comment": "H:RSMainThread::DoComposition和H:RenderFrame用来获取动效帧的结束时间,其中H:RSMainThread::DoComposition为并行化前的打点", + "frameEndTimeCmd_": [ + "H:RenderFrame" + ], + "_comment": "H:PostAndWait, parallel type并行化的标志", + "parallelTypeCmd_": [ + "H:PostAndWait, parallel type" + ] + }, + "_comment": "这是启动场景的相关打点", + "AppStartup": { + "_comment": "启动第一阶段,手指点击", + "phase1": { + "pName": "ProcessTouchEvent", + "start": [ + "H:client dispatch touchId:" + ], + "end": [ + "H:OHOS::ErrCode OHOS::AAFwk::AbilityManagerClient::StartUIAbilityBySCB" + ] + }, + "_comment": "启动第二阶段,处理创建进程信息,创建窗口", + "phase2": { + "pName": "StartUIAbilityBySCB", + "start": [ + "H:OHOS::ErrCode OHOS::AAFwk::AbilityManagerClient::StartUIAbilityBySCB" + ], + "end": [ + "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::LoadAbility" + ] + }, + "_comment": "启动第三阶段,拉起应用进程", + "phase3": { + "pName": "LoadAbility", + "start": [ + "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::LoadAbility" + ], + "end": [ + "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication(const pid_t, const sptr &)##" + ] + }, + "_comment": "启动第四阶段,加载应用", + "phase4": { + "pName": "Application Launching", + "start": [ + "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication(const pid_t, const sptr &)##" + ], + "end": [ + "H:void OHOS::AppExecFwk::MainThread::HandleLaunchAbility(const std::shared_ptr &)##" + ] + }, + "_comment": "启动第五阶段,加载 UI Ability", + "phase5": { + "pName": "UI Ability Launching", + "start": [ + "H:void OHOS::AppExecFwk::MainThread::HandleLaunchAbility(const std::shared_ptr &)##" + ], + "end": [ + "H:void OHOS::AbilityRuntime::FAAbilityThread::HandleAbilityTransaction(const OHOS::AbilityRuntime::Want &, const OHOS::AbilityRuntime::LifeCycleStateInfo &, sptr)##", + "H:void OHOS::AbilityRuntime::UIAbilityThread::HandleAbilityTransaction" + ] + }, + "_comment": "启动第六阶段,应用进入前台", + "phase6": { + "pName": "UI Ability OnForeground", + "start": [ + "H:void OHOS::AbilityRuntime::FAAbilityThread::HandleAbilityTransaction(const OHOS::AbilityRuntime::Want &, const OHOS::AbilityRuntime::LifeCycleStateInfo &, sptr)##", + "H:void OHOS::AbilityRuntime::UIAbilityThread::HandleAbilityTransaction" + ], + "end": [ + "H:ReceiveVsync dataCount" + ] + } + }, + "_comment": "Flag 开关", + "config": { + "TaskPool": 0, + "AnimationAnalysis": 0, + "AppStartup": 0, + "SchedulingAnalysis": 0, + "BinderRunnable": 0, + "FfrtConvert": 0, + "HMKernel": 1, + "VSync": 0, + "Hangs Detection": 0, + "LTPO": 0, + "Start&Finish Trace Category": 0, + "UserPluginsRow": 0, + "CPU by Irq": 0, + "RawTraceCutStartTs": 1, + "AI": 0, + "System Calls": "" + } +} \ No newline at end of file diff --git a/trace_streamer/test/unittest/BUILD.gn b/trace_streamer/test/unittest/BUILD.gn new file mode 100644 index 00000000..4bdaa737 --- /dev/null +++ b/trace_streamer/test/unittest/BUILD.gn @@ -0,0 +1,159 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. +# 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. + +THIRD_PARTY = "//third_party" + +# for third part googletest +config("gtest_private_config") { + visibility = [ ":*" ] + include_dirs = [ "${THIRD_PARTY}/googletest/googletest" ] +} + +config("gtest_config") { + include_dirs = [ "${THIRD_PARTY}/googletest/googletest/include" ] + cflags_cc = [ + "-std=c++17", + "-Wno-float-equal", + "-Wno-sign-compare", + "-Wno-reorder-init-list", + ] + if (is_mingw) { + cflags_cc += [ + "-Wno-unused-const-variable", + "-Wno-unused-private-field", + ] + } +} + +sources_files = [ + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-death-test.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-matchers.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-message.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-param-test.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-printers.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-test-part.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-typed-test.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest_pred_impl.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest_prod.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/hwext/gtest-ext.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/hwext/gtest-filter.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/hwext/gtest-multithread.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/hwext/gtest-tag.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/hwext/utils.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/custom/gtest-port.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/custom/gtest-printers.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/custom/gtest.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-death-test-internal.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-filepath.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-internal.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-param-util.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-port-arch.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-port.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-string.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/internal/gtest-type-util.h", + "${THIRD_PARTY}/googletest/googletest/src/gtest-all.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-assertion-result.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-death-test.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-filepath.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-internal-inl.h", + "${THIRD_PARTY}/googletest/googletest/src/gtest-matchers.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-port.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-printers.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-test-part.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest-typed-test.cc", + "${THIRD_PARTY}/googletest/googletest/src/gtest.cc", + "${THIRD_PARTY}/googletest/googletest/src/hwext/gtest-ext.cc", + "${THIRD_PARTY}/googletest/googletest/src/hwext/gtest-filter.cc", + "${THIRD_PARTY}/googletest/googletest/src/hwext/gtest-multithread.cpp", + "${THIRD_PARTY}/googletest/googletest/src/hwext/gtest-tag.cc", + "${THIRD_PARTY}/googletest/googletest/src/hwext/gtest-utils.cc", +] + +static_library("gtest") { + testonly = true + public = [ + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest-spi.h", + "${THIRD_PARTY}/googletest/googletest/include/gtest/gtest.h", + ] + + sources = sources_files + sources -= [ "${THIRD_PARTY}/googletest/googletest/src/gtest-all.cc" ] + public_configs = [ ":gtest_config" ] + configs += [ ":gtest_private_config" ] +} + +static_library("gtest_main") { + testonly = true + sources = [ "${THIRD_PARTY}/googletest/googletest/src/gtest_main.cc" ] + public_deps = [ ":gtest" ] +} + +config("gmock_private_config") { + visibility = [ ":*" ] + include_dirs = [ "${THIRD_PARTY}/googletest/googlemock" ] +} + +config("gmock_config") { + include_dirs = [ "${THIRD_PARTY}/googletest/googlemock/include" ] + + cflags_cc = [ + # The MOCK_METHODn() macros do not specify "override", which triggers this + # warning in users: "error: 'Method' overrides a member function but is not + # marked 'override' [-Werror,-Winconsistent-missing-override]". Suppress + # these warnings until https://github.com/google/googletest/issues/533 is + # fixed. + "-Wno-inconsistent-missing-override", + ] +} + +gmock_sources_files = [ + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-actions.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-cardinalities.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-function-mocker.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-matchers.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-more-actions.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-more-matchers.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-nice-strict.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock-spec-builders.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/custom/gmock-matchers.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/custom/gmock-port.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/gmock-internal-utils.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/gmock-port.h", + "${THIRD_PARTY}/googletest/googlemock/include/gmock/internal/gmock-pp.h", + "${THIRD_PARTY}/googletest/googlemock/src/gmock-all.cc", + "${THIRD_PARTY}/googletest/googlemock/src/gmock-cardinalities.cc", + "${THIRD_PARTY}/googletest/googlemock/src/gmock-internal-utils.cc", + "${THIRD_PARTY}/googletest/googlemock/src/gmock-matchers.cc", + "${THIRD_PARTY}/googletest/googlemock/src/gmock-spec-builders.cc", + "${THIRD_PARTY}/googletest/googlemock/src/gmock.cc", +] + +static_library("gmock") { + testonly = true + public = [ "${THIRD_PARTY}/googletest/googlemock/include/gmock/gmock.h" ] + sources = gmock_sources_files + sources -= [ "${THIRD_PARTY}/googletest/googlemock/src/gmock-all.cc" ] + public_configs = [ ":gmock_config" ] + configs += [ ":gmock_private_config" ] + deps = [ ":gtest" ] +} + +static_library("gmock_main") { + testonly = true + sources = [ "${THIRD_PARTY}/googletest/googlemock/src/gmock_main.cc" ] + public_deps = [ + ":gmock", + ":gtest", + ] +} diff --git a/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp b/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp index 6201efd0..731b2b44 100644 --- a/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp +++ b/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp @@ -19,6 +19,7 @@ #include #include +#define private public #include "cpu_filter.h" #include "parser/ptreader_parser/bytrace_parser/bytrace_event_parser.h" #include "parser/ptreader_parser/ptreader_parser.h" @@ -39,6 +40,7 @@ public: void SetUp() { stream_.InitFilter(); + stream_.streamFilters_->configFilter_->switchConfig_.UpdateSyscallsTsSet("145;146;147"); } void TearDown() @@ -1174,5 +1176,105 @@ HWTEST_F(EventParserTest, HandlerCsfParseErrorFormate, TestSize.Level1) EXPECT_TRUE(result == PARSE_ERROR); } + +/** + * @tc.name: HandlerBParseSystemDataTracking + * @tc.desc: Parse "B|2483|H:hitraceTest|M62|key1=value1" using HandlerB interface + * @tc.type: FUNC + */ +HWTEST_F(EventParserTest, HandlerBParseSystemDataTracking, TestSize.Level1) +{ + TS_LOGI("test5-56"); + size_t length{4}; + TracePoint outPoint; + std::string str = "B|2483|H:hitraceTest"; + BytraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); + int32_t result = eventParser.printEventParser_.HandlerB(str, outPoint, length); + EXPECT_TRUE(result == PARSE_SUCCESS); + EXPECT_EQ(outPoint.customArgsId_, INVALID_UINT64); + + str = "B|2483|H:hitraceTest|M62|key1=value1"; + result = eventParser.printEventParser_.HandlerB(str, outPoint, length); + EXPECT_TRUE(result == PARSE_SUCCESS); + EXPECT_NE(outPoint.customArgsId_, INVALID_UINT64); +} + +/** + * @tc.name: HandlerCsfParseSystemDataTracking + * @tc.desc: Parse "S|2483|H:hitraceTest|M62|customCategoryTest|key1=value1" using HandlerCSF interface + * @tc.type: FUNC + */ +HWTEST_F(EventParserTest, HandlerCsfParseSystemDataTracking, TestSize.Level1) +{ + TS_LOGI("test5-57"); + size_t length{4}; + TracePoint outPoint; + outPoint.phase_ = 'S'; + std::string str = "S|2483|H:hitraceTest|123"; + BytraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); + int32_t result = eventParser.printEventParser_.HandlerCSF(str, outPoint, length); + EXPECT_TRUE(result == PARSE_SUCCESS); + EXPECT_EQ(outPoint.customCategoryId_, INVALID_UINT64); + + str = "S|2483|H:hitraceTest|123|M62|categoryTest|key=value"; + result = eventParser.printEventParser_.HandlerCSF(str, outPoint, length); + EXPECT_TRUE(result == PARSE_SUCCESS); + EXPECT_NE(outPoint.customCategoryId_, INVALID_UINT64); +} + +/** + * @tc.name: ParseSysEnterEventAndSysEnterEvent + * @tc.desc: Parse SysEnterEvent and SysEnterEvent interface + * @tc.type: FUNC + */ +HWTEST_F(EventParserTest, ParseSysEnterEventAndSysEnterEvent, TestSize.Level1) +{ + TS_LOGI("test5-58"); + BytraceLine bytraceLine; + bytraceLine.ts = 1616439852302; + bytraceLine.pid = 1; + bytraceLine.eventName = "sys_enter"; + bytraceLine.argsStr = ""; + std::unordered_map args; + BytraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); + int32_t result = eventParser.SysEnterEvent(args, bytraceLine); + EXPECT_TRUE(result); + result = eventParser.SysExitEvent(args, bytraceLine); + EXPECT_TRUE(result); + auto eventCount = stream_.traceDataCache_->GetConstSysCallData().Size(); + EXPECT_EQ(eventCount, 0); + + bytraceLine.argsStr = "NR"; + result = eventParser.SysEnterEvent(args, bytraceLine); + EXPECT_TRUE(result); + result = eventParser.SysExitEvent(args, bytraceLine); + EXPECT_TRUE(result); + eventCount = stream_.traceDataCache_->GetConstSysCallData().Size(); + EXPECT_EQ(eventCount, 0); + + bytraceLine.argsStr = "NR 146 (6, f663d4e8, 3, 42, 3, f663d4e8)"; + result = eventParser.SysEnterEvent(args, bytraceLine); + EXPECT_TRUE(result); + bytraceLine.argsStr = "NR 145 = 66"; + result = eventParser.SysExitEvent(args, bytraceLine); + EXPECT_TRUE(result); + EXPECT_EQ(eventCount, 0); + + bytraceLine.argsStr = "NR 146 = 66"; + result = eventParser.SysExitEvent(args, bytraceLine); + EXPECT_TRUE(result); + eventCount = stream_.traceDataCache_->GetConstSysCallData().Size(); + EXPECT_EQ(eventCount, 0); + + bytraceLine.argsStr = "NR 147 (6, f663d4e8, 3, 42, 3, f663d4e8)"; + result = eventParser.SysEnterEvent(args, bytraceLine); + EXPECT_TRUE(result); + + bytraceLine.argsStr = "NR 147 = 66"; + result = eventParser.SysExitEvent(args, bytraceLine); + EXPECT_TRUE(result); + eventCount = stream_.traceDataCache_->GetConstSysCallData().Size(); + EXPECT_EQ(eventCount, 1); +} } // namespace TraceStreamer } // namespace SysTuning -- Gitee