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