1/*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "base/log/event_report.h"
17
18#include <unistd.h>
19
20#include "hisysevent.h"
21
22#include "core/common/ace_engine.h"
23#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
24#include "res_sched_client.h"
25#include "res_type.h"
26#endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
27
28namespace OHOS::Ace {
29namespace {
30
31constexpr char EVENT_KEY_ERROR_TYPE[] = "ERROR_TYPE";
32constexpr char EVENT_KEY_UID[] = "UID";
33constexpr char EVENT_KEY_PID[] = "PID";
34constexpr char EVENT_KEY_SESSIONID[] = "SESSION_ID";
35constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
36constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
37constexpr char EVENT_KEY_MESSAGE[] = "MSG";
38constexpr char EVENT_KEY_CMD[] = "CMD";
39constexpr char EVENT_KEY_REASON[] = "REASON";
40constexpr char EVENT_KEY_SUMMARY[] = "SUMMARY";
41constexpr char EVENT_NAME_JS_ERROR[] = "JS_ERROR";
42constexpr char STATISTIC_DURATION[] = "DURATION";
43constexpr char EVENT_KEY_STARTTIME[] = "STARTTIME";
44constexpr char EVENT_KEY_VERSION_CODE[] = "VERSION_CODE";
45constexpr char EVENT_KEY_VERSION_NAME[] = "VERSION_NAME";
46constexpr char EVENT_KEY_BUNDLE_NAME[] = "BUNDLE_NAME";
47constexpr char EVENT_KEY_ABILITY_NAME[] = "ABILITY_NAME";
48constexpr char EVENT_KEY_PAGE_URL[] = "PAGE_URL";
49constexpr char EVENT_KEY_JANK_STATS[] = "JANK_STATS";
50constexpr char EVENT_KEY_JANK_STATS_VER[] = "JANK_STATS_VER";
51constexpr char EVENT_KEY_APP_PID[] = "APP_PID";
52constexpr char EVENT_KEY_SCENE_ID[] = "SCENE_ID";
53constexpr char EVENT_KEY_INPUT_TIME[] = "INPUT_TIME";
54constexpr char EVENT_KEY_ANIMATION_START_LATENCY[] = "ANIMATION_START_LATENCY";
55constexpr char EVENT_KEY_ANIMATION_END_LATENCY[] = "ANIMATION_END_LATENCY";
56constexpr char EVENT_KEY_E2E_LATENCY[] = "E2E_LATENCY";
57constexpr char EVENT_KEY_UNIQUE_ID[] = "UNIQUE_ID";
58constexpr char EVENT_KEY_MODULE_NAME[] = "MODULE_NAME";
59constexpr char EVENT_KEY_DURITION[] = "DURITION";
60constexpr char EVENT_KEY_TOTAL_FRAMES[] = "TOTAL_FRAMES";
61constexpr char EVENT_KEY_TOTAL_MISSED_FRAMES[] = "TOTAL_MISSED_FRAMES";
62constexpr char EVENT_KEY_MAX_FRAMETIME[] = "MAX_FRAMETIME";
63constexpr char EVENT_KEY_MAX_FRAMETIME_SINCE_START[] = "MAX_FRAMETIME_SINCE_START";
64constexpr char EVENT_KEY_MAX_HITCH_TIME[] = "MAX_HITCH_TIME";
65constexpr char EVENT_KEY_MAX_HITCH_TIME_SINCE_START[] = "MAX_HITCH_TIME_SINCE_START";
66constexpr char EVENT_KEY_MAX_SEQ_MISSED_FRAMES[] = "MAX_SEQ_MISSED_FRAMES";
67constexpr char EVENT_KEY_SOURCE_TYPE[] = "SOURCE_TYPE";
68constexpr char EVENT_KEY_NOTE[] = "NOTE";
69constexpr char EVENT_KEY_DISPLAY_ANIMATOR[] = "DISPLAY_ANIMATOR";
70constexpr char EVENT_KEY_SKIPPED_FRAME_TIME[] = "SKIPPED_FRAME_TIME";
71constexpr char EVENT_KEY_PAGE_NODE_COUNT[] = "PAGE_NODE_COUNT";
72constexpr char EVENT_KEY_PAGE_NODE_THRESHOLD[] = "PAGE_NODE_THRESHOLD";
73constexpr char EVENT_KEY_PAGE_DEPTH[] = "PAGE_DEPTH";
74constexpr char EVENT_KEY_PAGE_DEPTH_THRESHOLD[] = "PAGE_DEPTH_THRESHOLD";
75constexpr char EVENT_KEY_FUNCTION_NAME[] = "FUNCTION_NAME";
76constexpr char EVENT_KEY_FUNCTION_EXECUTE_TIME[] = "FUNCTION_EXECUTE_TIME";
77constexpr char EVENT_KEY_FUNCTION_TIME_THRESHOLD[] = "FUNCTION_TIME_THRESHOLD";
78constexpr char EVENT_KEY_NOTIFY_HOVER_STATUS_CHANGE[] = "NOTIFY_HOVER_STATUS_CHANGE";
79constexpr char EVENT_KEY_FOLDER_STATUS[] = "FOLDER_STATUS";
80constexpr char EVENT_KEY_HOVER_TIME[] = "HOVER_TIME";
81constexpr char EVENT_KEY_IS_HOVER_MODE[] = "IS_HOVER_MODE";
82constexpr char EVENT_KEY_APP_ROTATION[] = "APP_ROTATION";
83constexpr char EVENT_KEY_WINDOW_MODE[] = "WINDOW_MODE";
84constexpr char EVENT_KEY_NON_MANUAL_POSTCARD_ACTION[] = "NON_MANUAL_POSTCARD_ACTION";
85constexpr char EVENT_KEY_PAGE_NAME[] = "PAGE_NAME";
86constexpr char EVENT_KEY_FILTER_TYPE[] = "FILTER_TYPE";
87constexpr char EVENT_KEY_FORM_NAME[] = "FORM_NAME";
88constexpr char EVENT_KEY_DIMENSION[] = "DIMENSION";
89
90constexpr int32_t MAX_PACKAGE_NAME_LENGTH = 128;
91#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
92constexpr int32_t MAX_JANK_FRAME_TIME = 32;
93#endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
94
95constexpr char DUMP_LOG_COMMAND[] = "B";
96
97constexpr char CLICK_TITLE_MAXIMIZE_MENU[] = "CLICK_TITLE_MAXIMIZE_MENU";
98constexpr char DOUBLE_CLICK_TITLE[] = "DOUBLE_CLICK_TITLE";
99constexpr char CURRENTPKG[] = "CURRENTPKG";
100constexpr char STATECHANGE[] = "STATECHANGE";
101constexpr char MAXMENUITEM[] = "MAXMENUITEM";
102constexpr char SCENE_BOARD_UE_DOMAIN[] = "SCENE_BOARD_UE";
103#ifdef VSYNC_TIMEOUT_CHECK
104constexpr char UI_VSYNC_TIMEOUT[] = "UI_VSYNC_TIMEOUT";
105constexpr char EVENT_KEY_WINDOW_ID[] = "WINDOW_ID";
106constexpr char EVENT_KEY_INSTANCE_ID[] = "INSTANCE_ID";
107constexpr char EVENT_KEY_VSYNC_TIMESTAMP[] = "VSYNC_TIMESTAMP";
108#endif
109constexpr char PAGE_NODE_OVERFLOW[] = "PAGE_NODE_OVERFLOW";
110constexpr char PAGE_DEPTH_OVERFLOW[] = "PAGE_DEPTH_OVERFLOW";
111constexpr char UI_LIFECIRCLE_FUNCTION_TIMEOUT[] = "UI_LIFECIRCLE_FUNCTION_TIMEOUT";
112constexpr char UIEXTENSION_TRANSPARENT_DETECTED[] = "UIEXTENSION_TRANSPARENT_DETECTED";
113
114void StrTrim(std::string& str)
115{
116    if (str.size() > MAX_PACKAGE_NAME_LENGTH) {
117        str = str.substr(0, MAX_PACKAGE_NAME_LENGTH);
118    }
119}
120
121} // namespace
122
123void EventReport::SendEvent(const EventInfo& eventInfo)
124{
125    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
126    if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {
127        StrTrim(packageName);
128    }
129    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
130        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
131        EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
132        EVENT_KEY_PACKAGE_NAME, packageName);
133}
134
135void EventReport::SendJsCardRenderTimeEvent(
136    const std::string& sessionID,
137    const std::string& timeType,
138    uint64_t timeDelay)
139{
140    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, timeType,
141        OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
142        EVENT_KEY_SESSIONID, sessionID,
143        STATISTIC_DURATION, timeDelay);
144}
145
146void EventReport::SendAppStartException(AppStartExcepType type)
147{
148    EventInfo eventInfo = {
149        .eventType = EXCEPTION_FRAMEWORK_APP_START,
150        .errorType = static_cast<int32_t>(type),
151    };
152
153    SendEventInner(eventInfo);
154}
155
156void EventReport::SendPageRouterException(PageRouterExcepType type, const std::string& pageUrl)
157{
158    EventInfo eventInfo = {
159        .eventType = EXCEPTION_FRAMEWORK_PAGE_ROUTER,
160        .errorType = static_cast<int32_t>(type),
161        .pageUrl = pageUrl,
162    };
163
164    SendEventInner(eventInfo);
165}
166
167void EventReport::SendComponentException(ComponentExcepType type)
168{
169    EventInfo eventInfo = {
170        .eventType = EXCEPTION_COMPONENT,
171        .errorType = static_cast<int32_t>(type),
172    };
173
174    SendEventInner(eventInfo);
175}
176
177void EventReport::SendAPIChannelException(APIChannelExcepType type)
178{
179    EventInfo eventInfo = {
180        .eventType = EXCEPTION_API_CHANNEL,
181        .errorType = static_cast<int32_t>(type),
182    };
183
184    SendEventInner(eventInfo);
185}
186
187void EventReport::SendRenderException(RenderExcepType type)
188{
189    EventInfo eventInfo = {
190        .eventType = EXCEPTION_RENDER,
191        .errorType = static_cast<int32_t>(type),
192    };
193
194    SendEventInner(eventInfo);
195}
196
197void EventReport::SendJsException(JsExcepType type)
198{
199    EventInfo eventInfo = {
200        .eventType = EXCEPTION_JS,
201        .errorType = static_cast<int32_t>(type),
202    };
203
204    SendEventInner(eventInfo);
205}
206
207void EventReport::SendAnimationException(AnimationExcepType type)
208{
209    EventInfo eventInfo = {
210        .eventType = EXCEPTION_ANIMATION,
211        .errorType = static_cast<int32_t>(type),
212    };
213
214    SendEventInner(eventInfo);
215}
216
217void EventReport::SendEventException(EventExcepType type)
218{
219    EventInfo eventInfo = {
220        .eventType = EXCEPTION_EVENT,
221        .errorType = static_cast<int32_t>(type),
222    };
223
224    SendEventInner(eventInfo);
225}
226
227void EventReport::SendInternalException(InternalExcepType type)
228{
229    EventInfo eventInfo = {
230        .eventType = EXCEPTION_INTERNATIONALIZATION,
231        .errorType = static_cast<int32_t>(type),
232    };
233
234    SendEventInner(eventInfo);
235}
236
237void EventReport::SendAccessibilityException(AccessibilityExcepType type)
238{
239    EventInfo eventInfo = {
240        .eventType = EXCEPTION_ACCESSIBILITY,
241        .errorType = static_cast<int32_t>(type),
242    };
243
244    SendEventInner(eventInfo);
245}
246
247void EventReport::SendFormException(FormExcepType type)
248{
249    EventInfo eventInfo = {
250        .eventType = EXCEPTION_FORM,
251        .errorType = static_cast<int32_t>(type),
252    };
253
254    SendEventInner(eventInfo);
255}
256
257#ifdef VSYNC_TIMEOUT_CHECK
258void EventReport::SendVsyncException(VsyncExcepType type, uint32_t windowId, int32_t instanceId, uint64_t timeStamp)
259{
260    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
261    StrTrim(packageName);
262    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UI_VSYNC_TIMEOUT,
263        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
264        EVENT_KEY_ERROR_TYPE, static_cast<int32_t>(type),
265        EVENT_KEY_PACKAGE_NAME, packageName,
266        EVENT_KEY_WINDOW_ID, windowId,
267        EVENT_KEY_INSTANCE_ID, instanceId,
268        EVENT_KEY_VSYNC_TIMESTAMP, timeStamp);
269}
270#endif
271
272void EventReport::JsEventReport(int32_t eventType, const std::string& jsonStr)
273{
274    if (!JsonUtil::ParseJsonString(jsonStr)) {
275        LOGE("jsonStr is not a JsonArray.");
276        return;
277    }
278}
279
280void EventReport::JsErrReport(
281    const std::string& packageName, const std::string& reason, const std::string& summary)
282{
283    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_NAME_JS_ERROR,
284        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
285        EVENT_KEY_PACKAGE_NAME, packageName,
286        EVENT_KEY_REASON, reason,
287        EVENT_KEY_SUMMARY, summary);
288}
289
290void EventReport::ANRRawReport(RawEventType type, int32_t uid, const std::string& packageName,
291    const std::string& processName, const std::string& msg)
292{
293    int32_t pid = getpid();
294    std::string cmd = " ";
295    std::string eventName = "";
296    if (type == RawEventType::WARNING) {
297        eventName = "UI_BLOCK_3S";
298        cmd = "p=" + std::to_string(pid);
299    } else if (type == RawEventType::FREEZE) {
300        eventName = "UI_BLOCK_6S";
301        cmd = DUMP_LOG_COMMAND;
302    } else {
303        eventName = "UI_BLOCK_RECOVERED";
304    }
305    std::string uidStr = std::to_string(uid);
306    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
307        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
308        EVENT_KEY_UID, uidStr,
309        EVENT_KEY_PACKAGE_NAME, packageName,
310        EVENT_KEY_PROCESS_NAME, processName,
311        EVENT_KEY_MESSAGE, msg,
312        EVENT_KEY_CMD, cmd);
313}
314
315void EventReport::ANRShowDialog(int32_t uid, const std::string& packageName,
316    const std::string& processName, const std::string& msg)
317{
318    int32_t pid = getpid();
319    std::string eventName = "UI_BLOCK_DIALOG";
320    std::string uidStr = std::to_string(uid);
321    std::string pidStr = std::to_string(pid);
322    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
323        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
324        EVENT_KEY_UID, uidStr,
325        EVENT_KEY_PID, pidStr,
326        EVENT_KEY_PACKAGE_NAME, packageName,
327        EVENT_KEY_PROCESS_NAME, processName,
328        EVENT_KEY_MESSAGE, msg);
329}
330
331void EventReport::JankFrameReport(int64_t startTime, int64_t duration, const std::vector<uint16_t>& jank,
332    const std::string& pageUrl, uint32_t jankStatusVersion)
333{
334    std::string eventName = "JANK_STATS_APP";
335    auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
336    auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
337    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
338    auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
339    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
340        OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
341        EVENT_KEY_STARTTIME, startTime,
342        STATISTIC_DURATION, duration,
343        EVENT_KEY_VERSION_CODE, app_version_code,
344        EVENT_KEY_VERSION_NAME, app_version_name,
345        EVENT_KEY_BUNDLE_NAME, packageName,
346        EVENT_KEY_ABILITY_NAME, abilityName,
347        EVENT_KEY_PAGE_URL, pageUrl,
348        EVENT_KEY_JANK_STATS, jank,
349        EVENT_KEY_JANK_STATS_VER, jankStatusVersion);
350}
351
352void EventReport::SendEventInner(const EventInfo& eventInfo)
353{
354    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
355    StrTrim(packageName);
356    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
357            OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
358            EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
359            EVENT_KEY_PACKAGE_NAME, packageName);
360}
361
362void EventReport::ReportEventComplete(DataBase& data)
363{
364    std::string eventName = "INTERACTION_COMPLETED_LATENCY";
365    const auto& appPid = data.baseInfo.pid;
366    const auto& bundleName = data.baseInfo.bundleName;
367    const auto& processName = data.baseInfo.processName;
368    const auto& abilityName = data.baseInfo.abilityName;
369    const auto& pageUrl = data.baseInfo.pageUrl;
370    const auto& versionCode = data.baseInfo.versionCode;
371    const auto& versionName = data.baseInfo.versionName;
372    const auto& pageName = data.baseInfo.pageName;
373    const auto& sceneId = data.sceneId;
374    const auto& sourceType = GetSourceTypeName(data.sourceType);
375    auto inputTime = data.inputTime;
376    ConvertRealtimeToSystime(data.inputTime, inputTime);
377    const auto& animationStartLantency = (data.beginVsyncTime - data.inputTime) / NS_TO_MS;
378    const auto& animationEndLantency = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
379    const auto& e2eLatency = animationStartLantency + animationEndLantency;
380    const auto& note = data.baseInfo.note;
381    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
382        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
383        EVENT_KEY_APP_PID, appPid,
384        EVENT_KEY_BUNDLE_NAME, bundleName,
385        EVENT_KEY_PROCESS_NAME, processName,
386        EVENT_KEY_ABILITY_NAME, abilityName,
387        EVENT_KEY_PAGE_URL, pageUrl,
388        EVENT_KEY_VERSION_CODE, versionCode,
389        EVENT_KEY_VERSION_NAME, versionName,
390        EVENT_KEY_PAGE_NAME, pageName,
391        EVENT_KEY_SCENE_ID, sceneId,
392        EVENT_KEY_SOURCE_TYPE, sourceType,
393        EVENT_KEY_INPUT_TIME, static_cast<uint64_t>(inputTime),
394        EVENT_KEY_ANIMATION_START_LATENCY, static_cast<uint64_t>(animationStartLantency),
395        EVENT_KEY_ANIMATION_END_LATENCY, static_cast<uint64_t>(animationEndLantency),
396        EVENT_KEY_E2E_LATENCY, static_cast<uint64_t>(e2eLatency),
397        EVENT_KEY_NOTE, note);
398    ACE_SCOPED_TRACE("INTERACTION_COMPLETED_LATENCY: sceneId =%s, inputTime=%lld(ms),"
399        "e2eLatency=%lld(ms)", sceneId.c_str(),
400        static_cast<long long>(inputTime), static_cast<long long>(e2eLatency));
401}
402
403#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
404void EventReport::ReportAppFrameDropToRss(const bool isInteractionJank, const std::string &bundleName,
405    const int64_t maxFrameTime)
406{
407    uint32_t eventType = ResourceSchedule::ResType::RES_TYPE_APP_FRAME_DROP;
408    int32_t subType = isInteractionJank ? ResourceSchedule::ResType::AppFrameDropType::INTERACTION_APP_JANK
409                                        : ResourceSchedule::ResType::AppFrameDropType::JANK_FRAME_APP;
410    std::unordered_map<std::string, std::string> payload = {
411        { "bundleName", bundleName },
412        { "maxFrameTime", std::to_string(maxFrameTime) },
413    };
414    ResourceSchedule::ResSchedClient::GetInstance().ReportData(eventType, subType, payload);
415}
416#endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
417
418void EventReport::ReportEventJankFrame(DataBase& data)
419{
420    std::string eventName = "INTERACTION_APP_JANK";
421    const auto& uniqueId = data.beginVsyncTime / NS_TO_MS;
422    const auto& sceneId = data.sceneId;
423    const auto& bundleName = data.baseInfo.bundleName;
424    const auto& processName = data.baseInfo.processName;
425    const auto& abilityName = data.baseInfo.abilityName;
426    auto startTime = data.beginVsyncTime;
427    ConvertRealtimeToSystime(data.beginVsyncTime, startTime);
428    const auto& durition = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
429    const auto& totalFrames = data.totalFrames;
430    const auto& totalMissedFrames = data.totalMissed;
431    const auto& maxFrameTime = data.maxFrameTime / NS_TO_MS;
432    const auto& maxFrameTimeSinceStart = data.maxFrameTimeSinceStart;
433    const auto& maxHitchTime = data.maxHitchTime;
434    const auto& maxHitchTimeSinceStart = data.maxHitchTimeSinceStart;
435    const auto& maxSeqMissedFrames = data.maxSuccessiveFrames;
436    const auto& note = data.baseInfo.note;
437    const auto& isDisplayAnimator = data.isDisplayAnimator;
438    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
439        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
440        EVENT_KEY_UNIQUE_ID, static_cast<int32_t>(uniqueId),
441        EVENT_KEY_SCENE_ID, sceneId,
442        EVENT_KEY_PROCESS_NAME, processName,
443        EVENT_KEY_MODULE_NAME, bundleName,
444        EVENT_KEY_ABILITY_NAME, abilityName,
445        EVENT_KEY_PAGE_URL, data.baseInfo.pageUrl,
446        EVENT_KEY_VERSION_CODE, data.baseInfo.versionCode,
447        EVENT_KEY_VERSION_NAME, data.baseInfo.versionName,
448        EVENT_KEY_PAGE_NAME, data.baseInfo.pageName,
449        EVENT_KEY_STARTTIME, static_cast<uint64_t>(startTime),
450        EVENT_KEY_DURITION, static_cast<uint64_t>(durition),
451        EVENT_KEY_TOTAL_FRAMES, totalFrames,
452        EVENT_KEY_TOTAL_MISSED_FRAMES, totalMissedFrames,
453        EVENT_KEY_MAX_FRAMETIME, static_cast<uint64_t>(maxFrameTime),
454        EVENT_KEY_MAX_FRAMETIME_SINCE_START, static_cast<uint64_t>(maxFrameTimeSinceStart),
455        EVENT_KEY_MAX_HITCH_TIME, static_cast<uint64_t>(maxHitchTime),
456        EVENT_KEY_MAX_HITCH_TIME_SINCE_START, static_cast<uint64_t>(maxHitchTimeSinceStart),
457        EVENT_KEY_MAX_SEQ_MISSED_FRAMES, maxSeqMissedFrames,
458        EVENT_KEY_NOTE, note,
459        EVENT_KEY_DISPLAY_ANIMATOR, isDisplayAnimator);
460    ACE_SCOPED_TRACE("INTERACTION_APP_JANK: sceneId =%s, startTime=%lld(ms),"
461        "maxFrameTime=%lld(ms)", sceneId.c_str(),
462        static_cast<long long>(startTime), static_cast<long long>(maxFrameTime));
463#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
464    if (isDisplayAnimator && maxFrameTime > MAX_JANK_FRAME_TIME) {
465        ReportAppFrameDropToRss(true, bundleName, maxFrameTime);
466    }
467#endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
468}
469
470void EventReport::ReportJankFrameApp(JankInfo& info)
471{
472    std::string eventName = "JANK_FRAME_APP";
473    const auto& bundleName = info.baseInfo.bundleName;
474    const auto& processName = info.baseInfo.processName;
475    const auto& abilityName = info.baseInfo.abilityName;
476    const auto& pageUrl = info.baseInfo.pageUrl;
477    const auto& versionCode = info.baseInfo.versionCode;
478    const auto& versionName = info.baseInfo.versionName;
479    const auto& pageName = info.baseInfo.pageName;
480    const auto& skippedFrameTime = info.skippedFrameTime;
481    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
482        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
483        EVENT_KEY_PROCESS_NAME, processName,
484        EVENT_KEY_MODULE_NAME, bundleName,
485        EVENT_KEY_ABILITY_NAME, abilityName,
486        EVENT_KEY_PAGE_URL, pageUrl,
487        EVENT_KEY_VERSION_CODE, versionCode,
488        EVENT_KEY_VERSION_NAME, versionName,
489        EVENT_KEY_PAGE_NAME, pageName,
490        EVENT_KEY_SKIPPED_FRAME_TIME, static_cast<uint64_t>(skippedFrameTime));
491    ACE_SCOPED_TRACE("JANK_FRAME_APP: skipppedFrameTime=%lld(ms)", static_cast<long long>(skippedFrameTime / NS_TO_MS));
492#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
493    ReportAppFrameDropToRss(false, bundleName);
494#endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
495}
496
497void EventReport::ReportJankFrameFiltered(JankInfo& info)
498{
499    std::string eventName = "JANK_FRAME_FILTERED";
500    const auto& bundleName = info.baseInfo.bundleName;
501    const auto& processName = info.baseInfo.processName;
502    const auto& abilityName = info.baseInfo.abilityName;
503    const auto& pageUrl = info.baseInfo.pageUrl;
504    const auto& versionCode = info.baseInfo.versionCode;
505    const auto& versionName = info.baseInfo.versionName;
506    const auto& pageName = info.baseInfo.pageName;
507    const auto& skippedFrameTime = info.skippedFrameTime;
508    const auto& windowName = info.windowName;
509    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
510        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
511        EVENT_KEY_PROCESS_NAME, processName,
512        EVENT_KEY_MODULE_NAME, bundleName,
513        EVENT_KEY_ABILITY_NAME, abilityName,
514        EVENT_KEY_PAGE_URL, pageUrl,
515        EVENT_KEY_VERSION_CODE, versionCode,
516        EVENT_KEY_VERSION_NAME, versionName,
517        EVENT_KEY_PAGE_NAME, pageName,
518        EVENT_KEY_SKIPPED_FRAME_TIME, static_cast<uint64_t>(skippedFrameTime));
519    ACE_SCOPED_TRACE("JANK_FRAME_FILTERED: skipppedFrameTime=%lld(ms), windowName=%s",
520        static_cast<long long>(skippedFrameTime / NS_TO_MS), windowName.c_str());
521}
522
523void EventReport::ReportJankFrameUnFiltered(JankInfo& info)
524{
525    std::string eventName = "JANK_FRAME_UNFILTERED";
526    const auto& bundleName = info.baseInfo.bundleName;
527    const auto& processName = info.baseInfo.processName;
528    const auto& abilityName = info.baseInfo.abilityName;
529    const auto& pageUrl = info.baseInfo.pageUrl;
530    const auto& versionCode = info.baseInfo.versionCode;
531    const auto& versionName = info.baseInfo.versionName;
532    const auto& pageName = info.baseInfo.pageName;
533    const auto& skippedFrameTime = info.skippedFrameTime;
534    const auto& windowName = info.windowName;
535    const auto& filterType = info.filterType;
536    const auto& sceneId = info.sceneId;
537    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
538        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
539        EVENT_KEY_PROCESS_NAME, processName,
540        EVENT_KEY_MODULE_NAME, bundleName,
541        EVENT_KEY_ABILITY_NAME, abilityName,
542        EVENT_KEY_PAGE_URL, pageUrl,
543        EVENT_KEY_VERSION_CODE, versionCode,
544        EVENT_KEY_VERSION_NAME, versionName,
545        EVENT_KEY_PAGE_NAME, pageName,
546        EVENT_KEY_FILTER_TYPE, filterType,
547        EVENT_KEY_SCENE_ID, sceneId,
548        EVENT_KEY_SKIPPED_FRAME_TIME, static_cast<uint64_t>(skippedFrameTime));
549    ACE_SCOPED_TRACE("JANK_FRAME_UNFILTERED: skipppedFrameTime=%lld(ms), windowName=%s, filterType=%d",
550        static_cast<long long>(skippedFrameTime / NS_TO_MS), windowName.c_str(), filterType);
551}
552
553void EventReport::ReportPageShowMsg(const std::string& pageUrl, const std::string& bundleName,
554                                    const std::string& pageName)
555{
556    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, "APP_PAGE_INFO_UPDATE",
557        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
558        EVENT_KEY_PAGE_URL, pageUrl, EVENT_KEY_BUNDLE_NAME, bundleName,
559        EVENT_KEY_PAGE_NAME, pageName);
560}
561
562void EventReport::ReportDoubleClickTitle(int32_t stateChange)
563{
564    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
565    StrTrim(packageName);
566    HiSysEventWrite(SCENE_BOARD_UE_DOMAIN, DOUBLE_CLICK_TITLE,
567        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
568        CURRENTPKG, packageName,
569        STATECHANGE, stateChange);
570}
571
572void EventReport::ReportClickTitleMaximizeMenu(int32_t maxMenuItem, int32_t stateChange)
573{
574    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
575    StrTrim(packageName);
576    HiSysEventWrite(SCENE_BOARD_UE_DOMAIN, CLICK_TITLE_MAXIMIZE_MENU,
577        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
578        CURRENTPKG, packageName,
579        MAXMENUITEM, maxMenuItem,
580        STATECHANGE, stateChange);
581}
582
583void EventReport::ReportPageNodeOverflow(const std::string& pageUrl, int32_t nodeCount, int32_t threshold)
584{
585    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
586    StrTrim(packageName);
587    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, PAGE_NODE_OVERFLOW,
588        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
589        EVENT_KEY_PACKAGE_NAME, packageName,
590        EVENT_KEY_PAGE_URL, pageUrl,
591        EVENT_KEY_PAGE_NODE_COUNT, nodeCount,
592        EVENT_KEY_PAGE_NODE_THRESHOLD, threshold);
593}
594
595void EventReport::ReportPageDepthOverflow(const std::string& pageUrl, int32_t depth, int32_t threshold)
596{
597    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
598    StrTrim(packageName);
599    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, PAGE_DEPTH_OVERFLOW,
600        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
601        EVENT_KEY_PACKAGE_NAME, packageName,
602        EVENT_KEY_PAGE_URL, pageUrl,
603        EVENT_KEY_PAGE_DEPTH, depth,
604        EVENT_KEY_PAGE_DEPTH_THRESHOLD, threshold);
605}
606
607void EventReport::ReportFunctionTimeout(const std::string& functionName, int64_t time, int32_t threshold)
608{
609    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
610    StrTrim(packageName);
611    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UI_LIFECIRCLE_FUNCTION_TIMEOUT,
612        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
613        EVENT_KEY_PACKAGE_NAME, packageName,
614        EVENT_KEY_FUNCTION_NAME, functionName,
615        EVENT_KEY_FUNCTION_EXECUTE_TIME, time,
616        EVENT_KEY_FUNCTION_TIME_THRESHOLD, threshold);
617}
618
619void EventReport::ReportHoverStatusChange(
620    int32_t foldStatus, int32_t time, bool isHoverMode, int32_t appRotation, int32_t windowMode)
621{
622    auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
623    auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
624    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_NOTIFY_HOVER_STATUS_CHANGE,
625        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
626        EVENT_KEY_BUNDLE_NAME, packageName,
627        EVENT_KEY_ABILITY_NAME, abilityName,
628        EVENT_KEY_FOLDER_STATUS, foldStatus,
629        EVENT_KEY_HOVER_TIME, time,
630        EVENT_KEY_IS_HOVER_MODE, isHoverMode,
631        EVENT_KEY_WINDOW_MODE, windowMode,
632        EVENT_KEY_APP_ROTATION, appRotation);
633}
634
635void EventReport::ReportNonManualPostCardActionInfo(const std::string& formName, const std::string& bundleName,
636    const std::string& abilityName, const std::string& moduleName, int32_t dimension)
637{
638    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_NON_MANUAL_POSTCARD_ACTION,
639        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
640        EVENT_KEY_FORM_NAME, formName,
641        EVENT_KEY_BUNDLE_NAME, bundleName,
642        EVENT_KEY_ABILITY_NAME, abilityName,
643        EVENT_KEY_MODULE_NAME, moduleName,
644        EVENT_KEY_DIMENSION, dimension);
645}
646
647void EventReport::ReportUiExtensionTransparentEvent(const std::string& pageUrl, const std::string& bundleName,
648    const std::string& moduleName)
649{
650    auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
651    auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
652    HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UIEXTENSION_TRANSPARENT_DETECTED,
653        OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
654        EVENT_KEY_PAGE_NAME, pageUrl,
655        EVENT_KEY_VERSION_CODE, app_version_code,
656        EVENT_KEY_VERSION_NAME, app_version_name,
657        EVENT_KEY_BUNDLE_NAME, bundleName,
658        EVENT_KEY_MODULE_NAME, moduleName);
659}
660} // namespace OHOS::Ace
661