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