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