• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "xcollie/xcollie.h"
22 #include "xcollie/xcollie_define.h"
23 
24 #include "core/common/ace_engine.h"
25 #ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
26 #include "res_sched_client.h"
27 #include "res_type.h"
28 #endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
29 
30 namespace OHOS::Ace {
31     FRCSceneFpsInfo EventReport::curFRCSceneFpsInfo_;
32     int64_t EventReport::calTime_ = 0;
33     int32_t EventReport::calFrameRate_ = 0;
34     std::unordered_map<int64_t, int32_t> EventReport::formEventTimerMap_ = {};
35     std::mutex EventReport::formEventTimerMutex_;
36 namespace {
37 
38 constexpr char EVENT_KEY_ERROR_TYPE[] = "ERROR_TYPE";
39 constexpr char EVENT_KEY_UID[] = "UID";
40 constexpr char EVENT_KEY_PID[] = "PID";
41 constexpr char EVENT_KEY_SESSIONID[] = "SESSION_ID";
42 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
43 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
44 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
45 constexpr char EVENT_KEY_CMD[] = "CMD";
46 constexpr char EVENT_KEY_REASON[] = "REASON";
47 constexpr char EVENT_KEY_SUMMARY[] = "SUMMARY";
48 constexpr char EVENT_NAME_JS_ERROR[] = "JS_ERROR";
49 constexpr char STATISTIC_DURATION[] = "DURATION";
50 constexpr char EVENT_KEY_STARTTIME[] = "STARTTIME";
51 constexpr char EVENT_KEY_VERSION_CODE[] = "VERSION_CODE";
52 constexpr char EVENT_KEY_VERSION_NAME[] = "VERSION_NAME";
53 constexpr char EVENT_KEY_BUNDLE_NAME[] = "BUNDLE_NAME";
54 constexpr char EVENT_KEY_ABILITY_NAME[] = "ABILITY_NAME";
55 constexpr char EVENT_KEY_PAGE_URL[] = "PAGE_URL";
56 constexpr char EVENT_KEY_JANK_STATS[] = "JANK_STATS";
57 constexpr char EVENT_KEY_JANK_STATS_VER[] = "JANK_STATS_VER";
58 constexpr char EVENT_KEY_MODULE_NAME[] = "MODULE_NAME";
59 constexpr char ACTION_NAME[] = "ACTION_NAME";
60 constexpr char EVENT_KEY_PAGE_NODE_COUNT[] = "PAGE_NODE_COUNT";
61 constexpr char EVENT_KEY_PAGE_NODE_THRESHOLD[] = "PAGE_NODE_THRESHOLD";
62 constexpr char EVENT_KEY_PAGE_DEPTH[] = "PAGE_DEPTH";
63 constexpr char EVENT_KEY_PAGE_DEPTH_THRESHOLD[] = "PAGE_DEPTH_THRESHOLD";
64 constexpr char EVENT_KEY_FUNCTION_NAME[] = "FUNCTION_NAME";
65 constexpr char EVENT_KEY_FUNCTION_EXECUTE_TIME[] = "FUNCTION_EXECUTE_TIME";
66 constexpr char EVENT_KEY_FUNCTION_TIME_THRESHOLD[] = "FUNCTION_TIME_THRESHOLD";
67 constexpr char EVENT_KEY_NOTIFY_HOVER_STATUS_CHANGE[] = "NOTIFY_HOVER_STATUS_CHANGE";
68 constexpr char EVENT_KEY_FOLDER_STATUS[] = "FOLDER_STATUS";
69 constexpr char EVENT_KEY_HOVER_TIME[] = "HOVER_TIME";
70 constexpr char EVENT_KEY_IS_HOVER_MODE[] = "IS_HOVER_MODE";
71 constexpr char EVENT_KEY_APP_ROTATION[] = "APP_ROTATION";
72 constexpr char EVENT_KEY_WINDOW_MODE[] = "WINDOW_MODE";
73 constexpr char EVENT_KEY_NON_MANUAL_POSTCARD_ACTION[] = "NON_MANUAL_POSTCARD_ACTION";
74 constexpr char EVENT_KEY_TEXTFIELD_ERROR[] = "TEXTFIELD_ERROR";
75 constexpr char EVENT_KEY_FRAME_NODE_ID[] = "FRAME_NODE_ID";
76 constexpr char EVENT_KEY_FRAME_NODE_DEPTH[] = "FRAME_NODE_DEPTH";
77 constexpr char EVENT_KEY_CLIPBOARD_FAIL[] = "CLIPBOARD_FAIL";
78 constexpr char EVENT_KEY_PAGE_NAME[] = "PAGE_NAME";
79 constexpr char EVENT_KEY_FORM_NAME[] = "FORM_NAME";
80 constexpr char EVENT_KEY_DIMENSION[] = "DIMENSION";
81 constexpr char EVENT_KEY_SCENE[] = "SCENE";
82 constexpr char EVENT_KEY_PACNAME[] = "PACNAME";
83 constexpr char EVENT_KEY_DURATION_60[] = "DURATION_60";
84 constexpr char EVENT_KEY_DURATION_72[] = "DURATION_72";
85 constexpr char EVENT_KEY_DURATION_90[] = "DURATION_90";
86 constexpr char EVENT_KEY_DURATION_120[] = "DURATION_120";
87 constexpr int32_t FRAME_60 = 60;
88 constexpr int32_t FRAME_72 = 72;
89 constexpr int32_t FRAME_90 = 90;
90 constexpr int32_t FRAME_120 = 120;
91 
92 constexpr int32_t MAX_PACKAGE_NAME_LENGTH = 128;
93 
94 constexpr char DUMP_LOG_COMMAND[] = "B";
95 
96 constexpr char CLICK_TITLE_MAXIMIZE_MENU[] = "CLICK_TITLE_MAXIMIZE_MENU";
97 constexpr char DOUBLE_CLICK_TITLE[] = "DOUBLE_CLICK_TITLE";
98 constexpr char CURRENTPKG[] = "CURRENTPKG";
99 constexpr char STATECHANGE[] = "STATECHANGE";
100 constexpr char MAXMENUITEM[] = "MAXMENUITEM";
101 constexpr char SCENE_BOARD_UE_DOMAIN[] = "SCENE_BOARD_UE";
102 #ifdef VSYNC_TIMEOUT_CHECK
103 constexpr char UI_VSYNC_TIMEOUT[] = "UI_VSYNC_TIMEOUT";
104 constexpr char EVENT_KEY_WINDOW_ID[] = "WINDOW_ID";
105 constexpr char EVENT_KEY_INSTANCE_ID[] = "INSTANCE_ID";
106 constexpr char EVENT_KEY_VSYNC_TIMESTAMP[] = "VSYNC_TIMESTAMP";
107 #endif
108 constexpr char EVENT_KEY_RICH_EDITOR_ERROR[] = "RICH_EDITOR_ERROR";
109 constexpr char EVENT_KEY_SPAN_LENGTH[] = "SPAN_LENGTH";
110 constexpr char EVENT_KEY_TEXT_LENGTH[] = "TEXT_LENGTH";
111 constexpr char EVENT_KEY_SPAN_INDEX[] = "SPAN_INDEX";
112 constexpr char ACCESSIBILITY_FAIL[] = "ACCESSIBILITY_FAIL";
113 constexpr char PAGE_NODE_OVERFLOW[] = "PAGE_NODE_OVERFLOW";
114 constexpr char PAGE_DEPTH_OVERFLOW[] = "PAGE_DEPTH_OVERFLOW";
115 constexpr char UI_LIFECIRCLE_FUNCTION_TIMEOUT[] = "UI_LIFECIRCLE_FUNCTION_TIMEOUT";
116 constexpr char UIEXTENSION_TRANSPARENT_DETECTED[] = "UIEXTENSION_TRANSPARENT_DETECTED";
117 constexpr char EVENT_KEY_SCROLLABLE_ERROR[] = "SCROLLABLE_ERROR";
118 constexpr char EVENT_KEY_NODE_TYPE[] = "NODE_TYPE";
119 constexpr char EVENT_KEY_SUB_ERROR_TYPE[] = "SUB_ERROR_TYPE";
120 constexpr char EVENT_KEY_TARGET_API_VERSION[] = "TARGET_API_VERSION";
121 constexpr char EVENT_KEY_REUSED_NODE_SKIP_MEASURE[] = "REUSED_NODE_SKIP_MEASURE";
122 constexpr char EVENT_KEY_PAGE_SLID_INFO[] = "PAGE_SLID_INFO";
123 constexpr char EVENT_KEY_GESTURE_VELOCITY[] = "GESTURE_VELOCITY";
124 constexpr char EVENT_KEY_VELOCITY_SCALE[] = "VELOCITY_SCALE";
125 constexpr char EVENT_KEY_DRAG_GAIN[] = "DRAG_GAIN";
126 constexpr char EVENT_KEY_MAX_FLING_VELOCITY[] = "MAX_FLING_VELOCITY";
127 constexpr char EVENT_KEY_SLIP_FACTOR[] = "SLIP_FACTOR";
128 constexpr char EVENT_KEY_FRICTION[] = "FRICTION";
129 constexpr char EVENT_KEY_FORM_ID[] = "FORM_ID";
130 constexpr char EVENT_KEY_ERROR_NAME[] = "ERROR_NAME";
131 constexpr char EVENT_KEY_ERROR_CODE[] = "ERROR_CODE";
132 constexpr char FORM_NODE_ERROR[] = "FORM_NODE_ERROR";
133 constexpr int32_t WAIT_MODIFY_TIMEOUT = 10;
134 constexpr int32_t WAIT_MODIFY_FAILED = 1;
135 
StrTrim(std::string & str)136 void StrTrim(std::string& str)
137 {
138     if (str.size() > MAX_PACKAGE_NAME_LENGTH) {
139         str = str.substr(0, MAX_PACKAGE_NAME_LENGTH);
140     }
141 }
142 
143 } // namespace
144 
SendEvent(const EventInfo & eventInfo)145 void EventReport::SendEvent(const EventInfo& eventInfo)
146 {
147     auto packageName = Container::CurrentBundleName();
148     if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {
149         StrTrim(packageName);
150     }
151     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
152         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
153         EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
154         EVENT_KEY_PACKAGE_NAME, packageName);
155 }
156 
SendJsCardRenderTimeEvent(const std::string & sessionID,const std::string & timeType,uint64_t timeDelay)157 void EventReport::SendJsCardRenderTimeEvent(
158     const std::string& sessionID,
159     const std::string& timeType,
160     uint64_t timeDelay)
161 {
162     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, timeType,
163         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
164         EVENT_KEY_SESSIONID, sessionID,
165         STATISTIC_DURATION, timeDelay);
166 }
167 
FrameRateDurationsStatistics(int32_t expectedRate,const std::string & scene,NG::SceneStatus status)168 void EventReport::FrameRateDurationsStatistics(int32_t expectedRate, const std::string& scene, NG::SceneStatus status)
169 {
170     switch (status) {
171         case NG::SceneStatus::START: {
172             curFRCSceneFpsInfo_ = FRCSceneFpsInfo();
173             calTime_ = 0;
174             calFrameRate_ = 0;
175             return;
176         }
177         case NG::SceneStatus::RUNNING: {
178             if (calTime_ == 0) {
179                 calTime_ = GetSysTimestamp();
180                 calFrameRate_ = expectedRate;
181             }
182             if (expectedRate != calFrameRate_) {
183                 int64_t endTime = GetSysTimestamp();
184                 int64_t duration = endTime - calTime_;
185                 calTime_ = endTime;
186             AddFrameRateDuration(calFrameRate_, duration);
187             }
188             calFrameRate_ = expectedRate;
189             return;
190         }
191         case NG::SceneStatus::END: {
192             int64_t endTime = GetSysTimestamp();
193             int64_t duration = endTime - calTime_;
194             calTime_ = endTime;
195             AddFrameRateDuration(calFrameRate_, duration);
196             EventReport::SendDiffFrameRatesDuring(scene, curFRCSceneFpsInfo_);
197             return;
198         }
199         default:
200             return;
201     }
202 }
203 
AddFrameRateDuration(int32_t frameRate,int64_t duration)204 void EventReport::AddFrameRateDuration(int32_t frameRate, int64_t duration)
205 {
206     switch (frameRate) {
207         case FRAME_120: {
208             curFRCSceneFpsInfo_.duration_120 += duration;
209             break;
210         }
211         case FRAME_90: {
212             curFRCSceneFpsInfo_.duration_90 += duration;
213             break;
214         }
215         case FRAME_72: {
216             curFRCSceneFpsInfo_.duration_72 += duration;
217             break;
218         }
219         case FRAME_60: {
220             curFRCSceneFpsInfo_.duration_60 += duration;
221             break;
222         }
223         default:
224             break;
225     }
226 }
227 
SendDiffFrameRatesDuring(const std::string & scene,const FRCSceneFpsInfo & curFRCSceneFpsInfo_)228 void EventReport::SendDiffFrameRatesDuring(const std::string& scene, const FRCSceneFpsInfo& curFRCSceneFpsInfo_)
229 {
230     auto packageName = Container::CurrentBundleName();
231     std::string eventName = "FRC_SCENE_INFO";
232     if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {
233         StrTrim(packageName);
234     }
235     int32_t frameRateDuring_60_ms = static_cast<int32_t>(curFRCSceneFpsInfo_.duration_60 / NS_TO_MS);
236     int32_t frameRateDuring_72_ms = static_cast<int32_t>(curFRCSceneFpsInfo_.duration_72 / NS_TO_MS);
237     int32_t frameRateDuring_90_ms = static_cast<int32_t>(curFRCSceneFpsInfo_.duration_90 / NS_TO_MS);
238     int32_t frameRateDuring_120_ms = static_cast<int32_t>(curFRCSceneFpsInfo_.duration_120 / NS_TO_MS);
239     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
240         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
241         EVENT_KEY_SCENE, scene,
242         EVENT_KEY_PACNAME, packageName,
243         EVENT_KEY_DURATION_120, frameRateDuring_120_ms,
244         EVENT_KEY_DURATION_90, frameRateDuring_90_ms,
245         EVENT_KEY_DURATION_72, frameRateDuring_72_ms,
246         EVENT_KEY_DURATION_60, frameRateDuring_60_ms);
247 }
248 
SendAppStartException(AppStartExcepType type)249 void EventReport::SendAppStartException(AppStartExcepType type)
250 {
251     EventInfo eventInfo = {
252         .eventType = EXCEPTION_FRAMEWORK_APP_START,
253         .errorType = static_cast<int32_t>(type),
254     };
255 
256     SendEventInner(eventInfo);
257 }
258 
SendPageRouterException(PageRouterExcepType type,const std::string & pageUrl)259 void EventReport::SendPageRouterException(PageRouterExcepType type, const std::string& pageUrl)
260 {
261     EventInfo eventInfo = {
262         .eventType = EXCEPTION_FRAMEWORK_PAGE_ROUTER,
263         .errorType = static_cast<int32_t>(type),
264         .pageUrl = pageUrl,
265     };
266 
267     SendEventInner(eventInfo);
268 }
269 
SendComponentException(ComponentExcepType type)270 void EventReport::SendComponentException(ComponentExcepType type)
271 {
272     EventInfo eventInfo = {
273         .eventType = EXCEPTION_COMPONENT,
274         .errorType = static_cast<int32_t>(type),
275     };
276 
277     SendEventInner(eventInfo);
278 }
279 
SendAPIChannelException(APIChannelExcepType type)280 void EventReport::SendAPIChannelException(APIChannelExcepType type)
281 {
282     EventInfo eventInfo = {
283         .eventType = EXCEPTION_API_CHANNEL,
284         .errorType = static_cast<int32_t>(type),
285     };
286 
287     SendEventInner(eventInfo);
288 }
289 
SendRenderException(RenderExcepType type)290 void EventReport::SendRenderException(RenderExcepType type)
291 {
292     EventInfo eventInfo = {
293         .eventType = EXCEPTION_RENDER,
294         .errorType = static_cast<int32_t>(type),
295     };
296 
297     SendEventInner(eventInfo);
298 }
299 
SendJsException(JsExcepType type)300 void EventReport::SendJsException(JsExcepType type)
301 {
302     EventInfo eventInfo = {
303         .eventType = EXCEPTION_JS,
304         .errorType = static_cast<int32_t>(type),
305     };
306 
307     SendEventInner(eventInfo);
308 }
309 
SendAnimationException(AnimationExcepType type)310 void EventReport::SendAnimationException(AnimationExcepType type)
311 {
312     EventInfo eventInfo = {
313         .eventType = EXCEPTION_ANIMATION,
314         .errorType = static_cast<int32_t>(type),
315     };
316 
317     SendEventInner(eventInfo);
318 }
319 
SendEventException(EventExcepType type)320 void EventReport::SendEventException(EventExcepType type)
321 {
322     EventInfo eventInfo = {
323         .eventType = EXCEPTION_EVENT,
324         .errorType = static_cast<int32_t>(type),
325     };
326 
327     SendEventInner(eventInfo);
328 }
329 
SendInternalException(InternalExcepType type)330 void EventReport::SendInternalException(InternalExcepType type)
331 {
332     EventInfo eventInfo = {
333         .eventType = EXCEPTION_INTERNATIONALIZATION,
334         .errorType = static_cast<int32_t>(type),
335     };
336 
337     SendEventInner(eventInfo);
338 }
339 
SendAccessibilityException(AccessibilityExcepType type)340 void EventReport::SendAccessibilityException(AccessibilityExcepType type)
341 {
342     EventInfo eventInfo = {
343         .eventType = EXCEPTION_ACCESSIBILITY,
344         .errorType = static_cast<int32_t>(type),
345     };
346 
347     SendEventInner(eventInfo);
348 }
349 
ReportAccessibilityFailEvent(const std::string & actionName)350 void EventReport::ReportAccessibilityFailEvent(const std::string& actionName)
351 {
352     auto packageName = Container::CurrentBundleName();
353     auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
354     auto processName = AceApplicationInfo::GetInstance().GetProcessName();
355     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, ACCESSIBILITY_FAIL,
356         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
357         EVENT_KEY_BUNDLE_NAME, packageName,
358         EVENT_KEY_ABILITY_NAME, abilityName,
359         EVENT_KEY_PROCESS_NAME, processName,
360         ACTION_NAME, actionName);
361 }
362 
SendFormException(FormExcepType type)363 void EventReport::SendFormException(FormExcepType type)
364 {
365     EventInfo eventInfo = {
366         .eventType = EXCEPTION_FORM,
367         .errorType = static_cast<int32_t>(type),
368     };
369 
370     SendEventInner(eventInfo);
371 }
372 
373 #ifdef VSYNC_TIMEOUT_CHECK
SendVsyncException(VsyncExcepType type,uint32_t windowId,int32_t instanceId,uint64_t timeStamp)374 void EventReport::SendVsyncException(VsyncExcepType type, uint32_t windowId, int32_t instanceId, uint64_t timeStamp)
375 {
376     auto packageName = Container::CurrentBundleName();
377     StrTrim(packageName);
378     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UI_VSYNC_TIMEOUT,
379         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
380         EVENT_KEY_ERROR_TYPE, static_cast<int32_t>(type),
381         EVENT_KEY_PACKAGE_NAME, packageName,
382         EVENT_KEY_WINDOW_ID, windowId,
383         EVENT_KEY_INSTANCE_ID, instanceId,
384         EVENT_KEY_VSYNC_TIMESTAMP, timeStamp);
385 }
386 #endif
387 
JsEventReport(int32_t eventType,const std::string & jsonStr)388 void EventReport::JsEventReport(int32_t eventType, const std::string& jsonStr)
389 {
390     if (!JsonUtil::ParseJsonString(jsonStr)) {
391         LOGE("jsonStr is not a JsonArray.");
392         return;
393     }
394 }
395 
JsErrReport(const std::string & packageName,const std::string & reason,const std::string & summary)396 void EventReport::JsErrReport(
397     const std::string& packageName, const std::string& reason, const std::string& summary)
398 {
399     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_NAME_JS_ERROR,
400         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
401         EVENT_KEY_PACKAGE_NAME, packageName,
402         EVENT_KEY_REASON, reason,
403         EVENT_KEY_SUMMARY, summary);
404 }
405 
ANRRawReport(RawEventType type,int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)406 void EventReport::ANRRawReport(RawEventType type, int32_t uid, const std::string& packageName,
407     const std::string& processName, const std::string& msg)
408 {
409     int32_t pid = getpid();
410     std::string cmd = " ";
411     std::string eventName = "";
412     if (type == RawEventType::WARNING) {
413         eventName = "UI_BLOCK_3S";
414         cmd = "p=" + std::to_string(pid);
415     } else if (type == RawEventType::FREEZE) {
416         eventName = "UI_BLOCK_6S";
417         cmd = DUMP_LOG_COMMAND;
418     } else {
419         eventName = "UI_BLOCK_RECOVERED";
420     }
421     std::string uidStr = std::to_string(uid);
422     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
423         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
424         EVENT_KEY_UID, uidStr,
425         EVENT_KEY_PACKAGE_NAME, packageName,
426         EVENT_KEY_PROCESS_NAME, processName,
427         EVENT_KEY_MESSAGE, msg,
428         EVENT_KEY_CMD, cmd);
429 }
430 
ANRShowDialog(int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)431 void EventReport::ANRShowDialog(int32_t uid, const std::string& packageName,
432     const std::string& processName, const std::string& msg)
433 {
434     int32_t pid = getpid();
435     std::string eventName = "UI_BLOCK_DIALOG";
436     std::string uidStr = std::to_string(uid);
437     std::string pidStr = std::to_string(pid);
438     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
439         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
440         EVENT_KEY_UID, uidStr,
441         EVENT_KEY_PID, pidStr,
442         EVENT_KEY_PACKAGE_NAME, packageName,
443         EVENT_KEY_PROCESS_NAME, processName,
444         EVENT_KEY_MESSAGE, msg);
445 }
446 
JankFrameReport(int64_t startTime,int64_t duration,const std::vector<uint16_t> & jank,const std::string & pageUrl,uint32_t jankStatusVersion)447 void EventReport::JankFrameReport(int64_t startTime, int64_t duration, const std::vector<uint16_t>& jank,
448     const std::string& pageUrl, uint32_t jankStatusVersion)
449 {
450     std::string eventName = "JANK_STATS_APP";
451     auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
452     auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
453     auto packageName = Container::CurrentBundleName();
454     auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
455     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
456         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
457         EVENT_KEY_STARTTIME, startTime,
458         STATISTIC_DURATION, duration,
459         EVENT_KEY_VERSION_CODE, app_version_code,
460         EVENT_KEY_VERSION_NAME, app_version_name,
461         EVENT_KEY_BUNDLE_NAME, packageName,
462         EVENT_KEY_ABILITY_NAME, abilityName,
463         EVENT_KEY_PAGE_URL, pageUrl,
464         EVENT_KEY_JANK_STATS, jank,
465         EVENT_KEY_JANK_STATS_VER, jankStatusVersion);
466 }
467 
SendEventInner(const EventInfo & eventInfo)468 void EventReport::SendEventInner(const EventInfo& eventInfo)
469 {
470     auto packageName = Container::CurrentBundleName();
471     StrTrim(packageName);
472     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
473             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
474             EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
475             EVENT_KEY_PACKAGE_NAME, packageName);
476 }
477 
ReportDragInfo(const DragInfo & dragInfo)478 void EventReport::ReportDragInfo(const DragInfo& dragInfo)
479 {
480     HiSysEventWrite(
481         OHOS::HiviewDFX::HiSysEvent::Domain::DRAG_UE,
482         dragInfo.dragBehavior,
483         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
484         "PNAMEID", dragInfo.pNameId,
485         "PVERSIONID", dragInfo.pVersionId,
486         "ISCROSSING", dragInfo.isCrossing,
487         "RESULT", dragInfo.result,
488         "HOSTNAME", dragInfo.hostName,
489         "SUMMARYTYPE", dragInfo.summaryType,
490         "SUMMARYNUM", dragInfo.summaryNum,
491         "ALLOW_DROP_TYPE", dragInfo.allowDropType);
492 }
493 
ReportRichEditorInfo(const RichEditorInfo & richEditorInfo)494 void EventReport::ReportRichEditorInfo(const RichEditorInfo& richEditorInfo)
495 {
496     auto packageName = Container::CurrentBundleName();
497     auto appVersionCode = AceApplicationInfo::GetInstance().GetAppVersionCode();
498     auto appVersionName = AceApplicationInfo::GetInstance().GetAppVersionName();
499     StrTrim(packageName);
500     StrTrim(appVersionName);
501     HiSysEventWrite(
502         OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_RICH_EDITOR_ERROR,
503         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
504         EVENT_KEY_BUNDLE_NAME, packageName,
505         EVENT_KEY_VERSION_CODE, appVersionCode,
506         EVENT_KEY_VERSION_NAME, appVersionName,
507         EVENT_KEY_ERROR_TYPE, static_cast<int32_t>(richEditorInfo.errorType),
508         EVENT_KEY_SPAN_LENGTH, richEditorInfo.spanLength,
509         EVENT_KEY_TEXT_LENGTH, richEditorInfo.textLength,
510         EVENT_KEY_SPAN_INDEX, richEditorInfo.spanIndex);
511 }
512 
ReportDoubleClickTitle(int32_t stateChange)513 void EventReport::ReportDoubleClickTitle(int32_t stateChange)
514 {
515     auto packageName = Container::CurrentBundleName();
516     StrTrim(packageName);
517     HiSysEventWrite(SCENE_BOARD_UE_DOMAIN, DOUBLE_CLICK_TITLE,
518         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
519         CURRENTPKG, packageName,
520         STATECHANGE, stateChange);
521 }
522 
ReportClickTitleMaximizeMenu(int32_t maxMenuItem,int32_t stateChange)523 void EventReport::ReportClickTitleMaximizeMenu(int32_t maxMenuItem, int32_t stateChange)
524 {
525     auto packageName = Container::CurrentBundleName();
526     StrTrim(packageName);
527     HiSysEventWrite(SCENE_BOARD_UE_DOMAIN, CLICK_TITLE_MAXIMIZE_MENU,
528         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
529         CURRENTPKG, packageName,
530         MAXMENUITEM, maxMenuItem,
531         STATECHANGE, stateChange);
532 }
533 
ReportPageNodeOverflow(const std::string & pageUrl,int32_t nodeCount,int32_t threshold)534 void EventReport::ReportPageNodeOverflow(const std::string& pageUrl, int32_t nodeCount, int32_t threshold)
535 {
536     auto packageName = Container::CurrentBundleName();
537     StrTrim(packageName);
538     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, PAGE_NODE_OVERFLOW,
539         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
540         EVENT_KEY_PACKAGE_NAME, packageName,
541         EVENT_KEY_PAGE_URL, pageUrl,
542         EVENT_KEY_PAGE_NODE_COUNT, nodeCount,
543         EVENT_KEY_PAGE_NODE_THRESHOLD, threshold);
544 }
545 
ReportPageDepthOverflow(const std::string & pageUrl,int32_t depth,int32_t threshold)546 void EventReport::ReportPageDepthOverflow(const std::string& pageUrl, int32_t depth, int32_t threshold)
547 {
548     auto packageName = Container::CurrentBundleName();
549     StrTrim(packageName);
550     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, PAGE_DEPTH_OVERFLOW,
551         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
552         EVENT_KEY_PACKAGE_NAME, packageName,
553         EVENT_KEY_PAGE_URL, pageUrl,
554         EVENT_KEY_PAGE_DEPTH, depth,
555         EVENT_KEY_PAGE_DEPTH_THRESHOLD, threshold);
556 }
557 
ReportFunctionTimeout(const std::string & functionName,int64_t time,int32_t threshold)558 void EventReport::ReportFunctionTimeout(const std::string& functionName, int64_t time, int32_t threshold)
559 {
560     auto packageName = Container::CurrentBundleName();
561     StrTrim(packageName);
562     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UI_LIFECIRCLE_FUNCTION_TIMEOUT,
563         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
564         EVENT_KEY_PACKAGE_NAME, packageName,
565         EVENT_KEY_FUNCTION_NAME, functionName,
566         EVENT_KEY_FUNCTION_EXECUTE_TIME, time,
567         EVENT_KEY_FUNCTION_TIME_THRESHOLD, threshold);
568 }
569 
ReportHoverStatusChange(int32_t foldStatus,int32_t time,bool isHoverMode,int32_t appRotation,int32_t windowMode)570 void EventReport::ReportHoverStatusChange(
571     int32_t foldStatus, int32_t time, bool isHoverMode, int32_t appRotation, int32_t windowMode)
572 {
573     auto packageName = Container::CurrentBundleName();
574     auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
575     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_NOTIFY_HOVER_STATUS_CHANGE,
576         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
577         EVENT_KEY_BUNDLE_NAME, packageName,
578         EVENT_KEY_ABILITY_NAME, abilityName,
579         EVENT_KEY_FOLDER_STATUS, foldStatus,
580         EVENT_KEY_HOVER_TIME, time,
581         EVENT_KEY_IS_HOVER_MODE, isHoverMode,
582         EVENT_KEY_WINDOW_MODE, windowMode,
583         EVENT_KEY_APP_ROTATION, appRotation);
584 }
585 
ReportNonManualPostCardActionInfo(const std::string & formName,const std::string & bundleName,const std::string & abilityName,const std::string & moduleName,int32_t dimension)586 void EventReport::ReportNonManualPostCardActionInfo(const std::string& formName, const std::string& bundleName,
587     const std::string& abilityName, const std::string& moduleName, int32_t dimension)
588 {
589     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_NON_MANUAL_POSTCARD_ACTION,
590         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
591         EVENT_KEY_FORM_NAME, formName,
592         EVENT_KEY_BUNDLE_NAME, bundleName,
593         EVENT_KEY_ABILITY_NAME, abilityName,
594         EVENT_KEY_MODULE_NAME, moduleName,
595         EVENT_KEY_DIMENSION, dimension);
596 }
597 
ReportUiExtensionTransparentEvent(const std::string & pageUrl,const std::string & bundleName,const std::string & moduleName)598 void EventReport::ReportUiExtensionTransparentEvent(const std::string& pageUrl, const std::string& bundleName,
599     const std::string& moduleName)
600 {
601     auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
602     auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
603     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, UIEXTENSION_TRANSPARENT_DETECTED,
604         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
605         EVENT_KEY_PAGE_NAME, pageUrl,
606         EVENT_KEY_VERSION_CODE, app_version_code,
607         EVENT_KEY_VERSION_NAME, app_version_name,
608         EVENT_KEY_BUNDLE_NAME, bundleName,
609         EVENT_KEY_MODULE_NAME, moduleName);
610 }
611 
ReportScrollableErrorEvent(const std::string & nodeType,ScrollableErrorType errorType,const std::string & subErrorType)612 void EventReport::ReportScrollableErrorEvent(
613     const std::string& nodeType, ScrollableErrorType errorType, const std::string& subErrorType)
614 {
615     auto packageName = Container::CurrentBundleName();
616     auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
617     auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
618     auto target_api_version = AceApplicationInfo::GetInstance().GetApiTargetVersion();
619     StrTrim(packageName);
620     StrTrim(app_version_name);
621     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_SCROLLABLE_ERROR,
622         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
623         EVENT_KEY_NODE_TYPE, nodeType,
624         EVENT_KEY_ERROR_TYPE, static_cast<int32_t>(errorType),
625         EVENT_KEY_SUB_ERROR_TYPE, subErrorType,
626         EVENT_KEY_BUNDLE_NAME, packageName,
627         EVENT_KEY_TARGET_API_VERSION, target_api_version,
628         EVENT_KEY_VERSION_CODE, app_version_code,
629         EVENT_KEY_VERSION_NAME, app_version_name);
630 }
631 
ReportTextFieldErrorEvent(int32_t frameNodeId,int32_t depth,const std::string & errorType)632 void EventReport::ReportTextFieldErrorEvent(int32_t frameNodeId, int32_t depth, const std::string& errorType)
633 {
634     auto packageName = Container::CurrentBundleName();
635     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_TEXTFIELD_ERROR,
636         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, EVENT_KEY_BUNDLE_NAME, packageName, EVENT_KEY_FRAME_NODE_ID,
637         frameNodeId, EVENT_KEY_FRAME_NODE_DEPTH, depth, EVENT_KEY_ERROR_TYPE, errorType);
638 }
639 
ReportClipboardFailEvent(const std::string & errorType)640 void EventReport::ReportClipboardFailEvent(const std::string& errorType)
641 {
642     auto packageName = Container::CurrentBundleName();
643     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_CLIPBOARD_FAIL,
644         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, EVENT_KEY_BUNDLE_NAME, packageName,
645         EVENT_KEY_ERROR_TYPE, errorType);
646 }
647 
ReportReusedNodeSkipMeasureApp()648 void EventReport::ReportReusedNodeSkipMeasureApp()
649 {
650     auto progressName = AceApplicationInfo::GetInstance().GetProcessName();
651     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_REUSED_NODE_SKIP_MEASURE,
652         OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, EVENT_KEY_PACKAGE_NAME, progressName);
653 }
654 
ReportPageSlidInfo(NG::SlidInfo & slidInfo)655 void EventReport::ReportPageSlidInfo(NG::SlidInfo &slidInfo)
656 {
657     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_KEY_PAGE_SLID_INFO,
658         OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
659         EVENT_KEY_GESTURE_VELOCITY, slidInfo.gestureVelocity,
660         EVENT_KEY_VELOCITY_SCALE, slidInfo.velocityScale, EVENT_KEY_DRAG_GAIN,
661         slidInfo.gain, EVENT_KEY_MAX_FLING_VELOCITY, slidInfo.maxFlingVelocity,
662         EVENT_KEY_SLIP_FACTOR, slidInfo.slipFactor, EVENT_KEY_FRICTION,
663         slidInfo.friction);
664 }
665 
StartFormModifyTimeoutReportTimer(int64_t formId,const std::string & bundleName,const std::string & formName)666 void EventReport::StartFormModifyTimeoutReportTimer(int64_t formId, const std::string &bundleName,
667     const std::string &formName)
668 {
669     auto timeoutCallback = [formId, bundleName, formName](void *) {
670         LOGE("ModifyTimeout, cardId: %{public}" PRId64, formId);
671         HiSysEventWrite(
672             OHOS::HiviewDFX::HiSysEvent::Domain::FORM_MANAGER,
673             "FORM_ERROR",
674             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
675             EVENT_KEY_FORM_ID, formId,
676             EVENT_KEY_BUNDLE_NAME, bundleName,
677             EVENT_KEY_FORM_NAME, formName,
678             EVENT_KEY_ERROR_NAME, FORM_NODE_ERROR,
679             EVENT_KEY_ERROR_TYPE, WAIT_MODIFY_FAILED,
680             EVENT_KEY_ERROR_CODE, 0);
681     };
682     const std::string taskName = "FormPattern_WaitModifyDone_" + std::to_string(formId);
683     EventReport::StopFormModifyTimeoutReportTimer(formId);
684     int32_t timerId = OHOS::HiviewDFX::XCollie::GetInstance().SetTimer(
685         taskName, WAIT_MODIFY_TIMEOUT, timeoutCallback, nullptr, HiviewDFX::XCOLLIE_FLAG_NOOP);
686     std::lock_guard<std::mutex> lock(EventReport::formEventTimerMutex_);
687     EventReport::formEventTimerMap_[formId] = timerId;
688     LOGI("StartFormModifyTimeoutReportTimer, cardId: %{public}" PRId64 ", timerId: %{public}d", formId, timerId);
689 }
690 
StopFormModifyTimeoutReportTimer(int64_t formId)691 void EventReport::StopFormModifyTimeoutReportTimer(int64_t formId)
692 {
693     std::lock_guard<std::mutex> lock(EventReport::formEventTimerMutex_);
694     auto iter = EventReport::formEventTimerMap_.find(formId);
695     if (iter == EventReport::formEventTimerMap_.end()) {
696         return;
697     }
698     int32_t timerId = iter->second;
699     LOGI("StopFormModifyTimeoutReportTimer, timerId:%{public}d", timerId);
700     OHOS::HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
701     EventReport::formEventTimerMap_.erase(iter);
702 }
703 
704 } // namespace OHOS::Ace
705