From d81c449fe2749a23eb0d476516183defb737ecb0 Mon Sep 17 00:00:00 2001 From: keminLuo <541416002@qq.com> Date: Tue, 10 Sep 2024 20:12:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?trace=E8=A1=A5=E5=85=85=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: keminLuo <541416002@qq.com> --- fml/BUILD.gn | 1 + fml/platform/ohos/ohos_trace_event.cc | 89 +++++++++++++++++++ fml/trace_event.cc | 34 +++++++ fml/trace_event.h | 66 +++++++------- .../window/platform_message_response_dart.cc | 5 +- 5 files changed, 162 insertions(+), 33 deletions(-) create mode 100644 fml/platform/ohos/ohos_trace_event.cc diff --git a/fml/BUILD.gn b/fml/BUILD.gn index b8b6c6c5ce..03d286857c 100644 --- a/fml/BUILD.gn +++ b/fml/BUILD.gn @@ -200,6 +200,7 @@ source_set("fml") { #"platform/ohos/message_loop_ohos_test.h", "platform/ohos/napi_util.h", "platform/ohos/napi_util.cc", + "platform/ohos/ohos_trace_event.cc", ] libs += [ "hilog_ndk.z" ] libs += [ "ace_napi.z" ] diff --git a/fml/platform/ohos/ohos_trace_event.cc b/fml/platform/ohos/ohos_trace_event.cc new file mode 100644 index 0000000000..98a800d5fc --- /dev/null +++ b/fml/platform/ohos/ohos_trace_event.cc @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2024 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 "flutter/fml/trace_event.h" + +#include + +#if defined(FML_OS_OHOS) +namespace fml { +namespace tracing { + +static constexpr char OHOS_COLON[] = ":"; +static constexpr char OHOS_SCOPE[] = "::"; +static constexpr char OHOS_WHITESPACE[] = " "; +static constexpr char OHOS_FILTER_NAME_SCENE[] = "SceneDisplayLag"; +static constexpr char OHOS_FILTER_NAME_POINTER[] = "PointerEvent"; + +void OHOSTraceTimelineEvent(TraceArg category_group, + TraceArg name, + TraceIDArg id, + Dart_Timeline_Event type, + intptr_t argument_count, + const char** argument_names, + const char** argument_values) { + if (type != Dart_Timeline_Event_Begin && type != Dart_Timeline_Event_Async_Begin && + type != Dart_Timeline_Event_Async_End && type != Dart_Timeline_Event_Flow_Begin && + type != Dart_Timeline_Event_Flow_End) { + return; + } + + if (type != Dart_Timeline_Event_Begin && strcmp(name, OHOS_FILTER_NAME_POINTER) == 0) { + // Trace 'PointerEvent' is not work in the scenario of extenal texture + return; + } + + int realNumber = argument_count; + if (type != Dart_Timeline_Event_Begin && strcmp(name, OHOS_FILTER_NAME_SCENE) == 0) { + // Trace 'SceneDisplayLag' have inconsistent parameters. It's not good to watch. + realNumber = 0; + } + + std::string TraceName(category_group); + TraceName.append(OHOS_SCOPE); + TraceName.append(name); + + if (argument_names != nullptr && argument_values != nullptr) { + for (int i = 0; i < realNumber; i++) { + std::string TraceParam(OHOS_WHITESPACE); + TraceName += TraceParam + argument_names[i] + OHOS_COLON + argument_values[i]; + } + } + + switch(type) { + case Dart_Timeline_Event_Begin: + OH_Hitrace_StartTrace(TraceName.c_str()); + break; + case Dart_Timeline_Event_Async_Begin: + case Dart_Timeline_Event_Flow_Begin: + OH_Hitrace_StartAsyncTrace(TraceName.c_str(), id); + break; + case Dart_Timeline_Event_Async_End: + case Dart_Timeline_Event_Flow_End: + OH_Hitrace_FinishAsyncTrace(TraceName.c_str(), id); + break; + default: + break; + } + return; +} + +void OHOSTraceEventEnd(void) { + OH_Hitrace_FinishTrace(); +} + +} // namespace tracing +} // namespace fml +#endif // FML_OS_OHOS diff --git a/fml/trace_event.cc b/fml/trace_event.cc index 7ec9adbab3..af92a44477 100644 --- a/fml/trace_event.cc +++ b/fml/trace_event.cc @@ -94,6 +94,10 @@ void TraceTimelineEvent(TraceArg category_group, const_cast(c_names.data()), // argument_names c_values.data() // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, 0, type, argument_count, const_cast(c_names.data()), + c_values.data()); +#endif } void TraceTimelineEvent(TraceArg category_group, @@ -121,6 +125,9 @@ void TraceEvent0(TraceArg category_group, TraceArg name) { nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, 0, Dart_Timeline_Event_Begin, 0, nullptr, nullptr); +#endif } void TraceEvent1(TraceArg category_group, @@ -137,6 +144,9 @@ void TraceEvent1(TraceArg category_group, arg_names, // argument_names arg_values // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, 0, Dart_Timeline_Event_Begin, 1, arg_names, arg_values); +#endif } void TraceEvent2(TraceArg category_group, @@ -155,6 +165,9 @@ void TraceEvent2(TraceArg category_group, arg_names, // argument_names arg_values // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, 0, Dart_Timeline_Event_Begin, 2, arg_names, arg_values); +#endif } void TraceEventEnd(TraceArg name) { @@ -166,6 +179,9 @@ void TraceEventEnd(TraceArg name) { nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceEventEnd(); +#endif } void TraceEventAsyncBegin0(TraceArg category_group, @@ -179,6 +195,9 @@ void TraceEventAsyncBegin0(TraceArg category_group, nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Async_Begin, 0, nullptr, nullptr); +#endif } void TraceEventAsyncEnd0(TraceArg category_group, @@ -192,6 +211,9 @@ void TraceEventAsyncEnd0(TraceArg category_group, nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Async_End, 0, nullptr, nullptr); +#endif } void TraceEventAsyncBegin1(TraceArg category_group, @@ -209,6 +231,9 @@ void TraceEventAsyncBegin1(TraceArg category_group, arg_names, // argument_names arg_values // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Async_Begin, 1, arg_names, arg_values); +#endif } void TraceEventAsyncEnd1(TraceArg category_group, @@ -226,6 +251,9 @@ void TraceEventAsyncEnd1(TraceArg category_group, arg_names, // argument_names arg_values // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Async_End, 1, arg_names, arg_values); +#endif } void TraceEventInstant0(TraceArg category_group, TraceArg name) { @@ -284,6 +312,9 @@ void TraceEventFlowBegin0(TraceArg category_group, nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Flow_Begin, 0, nullptr, nullptr); +#endif } void TraceEventFlowStep0(TraceArg category_group, @@ -308,6 +339,9 @@ void TraceEventFlowEnd0(TraceArg category_group, TraceArg name, TraceIDArg id) { nullptr, // argument_names nullptr // argument_values ); +#if defined(FML_OS_OHOS) + OHOSTraceTimelineEvent(category_group, name, id, Dart_Timeline_Event_Flow_End, 0, nullptr, nullptr); +#endif } #else // FLUTTER_TIMELINE_ENABLED diff --git a/fml/trace_event.h b/fml/trace_event.h index ce7bcf3595..b9082ac1fe 100644 --- a/fml/trace_event.h +++ b/fml/trace_event.h @@ -73,17 +73,18 @@ public: #define TRACE_DURATION_LINE(line, fmt, args...) OHFlutterTrace TRACE_NAME(__OH_trace_, line)(fmt, args) #define TRACE_DURATION(fmt, args...) TRACE_DURATION_LINE(__LINE__, fmt, args) -#define TRACE_FMT "%s:%s " -#define OH_TRACE_DURATION(a, b) TRACE_DURATION(TRACE_FMT, a, b) - -#define OH_TRACE_ASYNC_BEGIN(category, name, id) OH_HiTrace_StartAsyncTrace(category#name, id) -#define OH_TRACE_ASYNC_END(category, name, id) OH_HiTrace_FinishAsyncTrace(category#name, id) +#define TRACE_FMT0 "%s::%s" +#define TRACE_FMT1 "%s::%s %s:%s" +#define TRACE_FMT2 "%s::%s %s:%s %s:%s" +#define OH_TRACE_DURATION0(a, b) TRACE_DURATION(TRACE_FMT0, a, b) +#define OH_TRACE_DURATION1(a, b, c, d) TRACE_DURATION(TRACE_FMT1, a, b, c, d) +#define OH_TRACE_DURATION2(a, b, c, d, e, f) TRACE_DURATION(TRACE_FMT2, a, b, c, d, e, f) #else -#define OH_TRACE_DURATION(a, b) -#define OH_TRACE_ASYNC_BEGIN(category, name, id) -#define OH_TRACE_ASYNC_END(category, name, id) +#define OH_TRACE_DURATION0(a, b) +#define OH_TRACE_DURATION1(a, b, c, d) +#define OH_TRACE_DURATION2(a, b, c, d, e, f) #endif // defined(FML_OS_OHOS) @@ -135,69 +136,60 @@ public: // Instead, either use different `name` or `arg1` parameter names. #define FML_TRACE_EVENT(category_group, name, ...) \ ::fml::tracing::TraceEvent((category_group), (name), __VA_ARGS__); \ - __FML__AUTO_TRACE_END(name); \ - OH_TRACE_DURATION((category_group), (name)) + __FML__AUTO_TRACE_END(name) #define TRACE_EVENT0(category_group, name) \ ::fml::tracing::TraceEvent0(category_group, name); \ - __FML__AUTO_TRACE_END(name); \ - OH_TRACE_DURATION((category_group), (name)) + __FML__AUTO_TRACE_END(name) #define TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \ ::fml::tracing::TraceEvent1(category_group, name, arg1_name, arg1_val); \ - __FML__AUTO_TRACE_END(name); \ - OH_TRACE_DURATION((category_group), (name)) + __FML__AUTO_TRACE_END(name) #define TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name, \ arg2_val) \ ::fml::tracing::TraceEvent2(category_group, name, arg1_name, arg1_val, \ arg2_name, arg2_val); \ - __FML__AUTO_TRACE_END(name); \ - OH_TRACE_DURATION((category_group), (name)) + __FML__AUTO_TRACE_END(name) #define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id) \ - ::fml::tracing::TraceEventAsyncBegin0(category_group, name, id); \ - OH_TRACE_ASYNC_BEGIN(category_group, name, (id)) + ::fml::tracing::TraceEventAsyncBegin0(category_group, name, id) #define TRACE_EVENT_ASYNC_END0(category_group, name, id) \ - ::fml::tracing::TraceEventAsyncEnd0(category_group, name, id); \ - OH_TRACE_ASYNC_END(category_group, name, (id)) + ::fml::tracing::TraceEventAsyncEnd0(category_group, name, id) #define TRACE_EVENT_ASYNC_BEGIN1(category_group, name, id, arg1_name, \ arg1_val) \ ::fml::tracing::TraceEventAsyncBegin1(category_group, name, id, arg1_name, \ - arg1_val); \ - OH_TRACE_ASYNC_BEGIN(category_group, name, (id)) + arg1_val) #define TRACE_EVENT_ASYNC_END1(category_group, name, id, arg1_name, arg1_val) \ ::fml::tracing::TraceEventAsyncEnd1(category_group, name, id, arg1_name, \ - arg1_val); \ - OH_TRACE_ASYNC_END(category_group, name, (id)) + arg1_val) #define TRACE_EVENT_INSTANT0(category_group, name) \ ::fml::tracing::TraceEventInstant0(category_group, name); \ - OH_TRACE_DURATION((category_group), (name)) + OH_TRACE_DURATION0((category_group), (name)) #define TRACE_EVENT_INSTANT1(category_group, name, arg1_name, arg1_val) \ ::fml::tracing::TraceEventInstant1(category_group, name, arg1_name, arg1_val); \ - OH_TRACE_DURATION((category_group), (name)) + OH_TRACE_DURATION1((category_group), (name), (arg1_name), (arg1_val)) #define TRACE_EVENT_INSTANT2(category_group, name, arg1_name, arg1_val, \ arg2_name, arg2_val) \ ::fml::tracing::TraceEventInstant2(category_group, name, arg1_name, \ arg1_val, arg2_name, arg2_val); \ - OH_TRACE_DURATION((category_group), (name)) + OH_TRACE_DURATION2((category_group), (name), (arg1_name), (arg1_val), \ + (arg2_name), (arg2_val)) #define TRACE_FLOW_BEGIN(category, name, id) \ - ::fml::tracing::TraceEventFlowBegin0(category, name, id); \ - OH_TRACE_ASYNC_BEGIN(category, name, (id)) + ::fml::tracing::TraceEventFlowBegin0(category, name, id) #define TRACE_FLOW_STEP(category, name, id) \ ::fml::tracing::TraceEventFlowStep0(category, name, id) #define TRACE_FLOW_END(category, name, id) \ - ::fml::tracing::TraceEventFlowEnd0(category, name, id); \ - OH_TRACE_ASYNC_END(category, name, (id)) + ::fml::tracing::TraceEventFlowEnd0(category, name, id) #endif // TRACE_EVENT_HIDE_MACROS #endif // !defined(OS_FUCHSIA) @@ -243,6 +235,18 @@ void TraceTimelineEvent(TraceArg category_group, const std::vector& names, const std::vector& values); +#if defined(FML_OS_OHOS) +void OHOSTraceTimelineEvent(TraceArg category_group, + TraceArg name, + TraceIDArg id, + Dart_Timeline_Event type, + intptr_t argument_count, + const char** argument_names, + const char** argument_values); + +void OHOSTraceEventEnd(void); +#endif // FML_OS_OHOS + inline std::string TraceToString(const char* string) { return std::string{string}; } diff --git a/lib/ui/window/platform_message_response_dart.cc b/lib/ui/window/platform_message_response_dart.cc index 66c07c31c3..3f43e20451 100644 --- a/lib/ui/window/platform_message_response_dart.cc +++ b/lib/ui/window/platform_message_response_dart.cc @@ -39,8 +39,9 @@ void PostCompletion(Callback&& callback, ui_task_runner->PostTask(fml::MakeCopyable( [callback = std::move(callback), platform_message_id, result = std::move(result), channel = channel]() mutable { - TRACE_EVENT_ASYNC_END0("flutter", "PlatformChannel ScheduleResult", - platform_message_id); + // Pair with TRACE_EVENT_ASYNC_BEGIN1 + TRACE_EVENT_ASYNC_END1("flutter", "PlatformChannel ScheduleResult", + platform_message_id, "channel", channel.c_str()); std::shared_ptr dart_state = callback.dart_state().lock(); if (!dart_state) { -- Gitee From 9ae4d09578e33b832f298cab4a519a110e0a43b7 Mon Sep 17 00:00:00 2001 From: keminLuo <541416002@qq.com> Date: Tue, 10 Sep 2024 20:58:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?trace=E8=A1=A5=E5=85=85=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: keminLuo <541416002@qq.com> --- fml/platform/ohos/ohos_trace_event.cc | 10 +++++----- fml/trace_event.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fml/platform/ohos/ohos_trace_event.cc b/fml/platform/ohos/ohos_trace_event.cc index 98a800d5fc..18f90a07e6 100644 --- a/fml/platform/ohos/ohos_trace_event.cc +++ b/fml/platform/ohos/ohos_trace_event.cc @@ -30,7 +30,7 @@ static constexpr char OHOS_FILTER_NAME_POINTER[] = "PointerEvent"; void OHOSTraceTimelineEvent(TraceArg category_group, TraceArg name, TraceIDArg id, - Dart_Timeline_Event type, + Dart_Timeline_Event_Type type, intptr_t argument_count, const char** argument_names, const char** argument_values) { @@ -64,15 +64,15 @@ void OHOSTraceTimelineEvent(TraceArg category_group, switch(type) { case Dart_Timeline_Event_Begin: - OH_Hitrace_StartTrace(TraceName.c_str()); + OH_HiTrace_StartTrace(TraceName.c_str()); break; case Dart_Timeline_Event_Async_Begin: case Dart_Timeline_Event_Flow_Begin: - OH_Hitrace_StartAsyncTrace(TraceName.c_str(), id); + OH_HiTrace_StartAsyncTrace(TraceName.c_str(), id); break; case Dart_Timeline_Event_Async_End: case Dart_Timeline_Event_Flow_End: - OH_Hitrace_FinishAsyncTrace(TraceName.c_str(), id); + OH_HiTrace_FinishAsyncTrace(TraceName.c_str(), id); break; default: break; @@ -81,7 +81,7 @@ void OHOSTraceTimelineEvent(TraceArg category_group, } void OHOSTraceEventEnd(void) { - OH_Hitrace_FinishTrace(); + OH_HiTrace_FinishTrace(); } } // namespace tracing diff --git a/fml/trace_event.h b/fml/trace_event.h index b9082ac1fe..2c24208ff3 100644 --- a/fml/trace_event.h +++ b/fml/trace_event.h @@ -239,7 +239,7 @@ void TraceTimelineEvent(TraceArg category_group, void OHOSTraceTimelineEvent(TraceArg category_group, TraceArg name, TraceIDArg id, - Dart_Timeline_Event type, + Dart_Timeline_Event_Type type, intptr_t argument_count, const char** argument_names, const char** argument_values); -- Gitee