diff --git a/fml/BUILD.gn b/fml/BUILD.gn index b8b6c6c5ceaf5c84d22622c15fb963cc2102483f..03d286857c2d7308c91dca9f445e59e484069b50 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 0000000000000000000000000000000000000000..18f90a07e649dbf7b7b48197f3cc7e4df8f664a3 --- /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 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 7ec9adbab3118a41f1c4a2b12d9fd638012c2719..af92a4447727bf3a07b6f7036bdb95c43fa747ab 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 ce7bcf359509c91041b99a7225ac9c490356fd0c..2c24208ff3615c81396d672f0ab6c9cd04b99fc3 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 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 66c07c31c36ed2c7063542484b9a34dee1665213..3f43e20451884d21a0f6539102b804083e00f88c 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) {