1 /*
2 * Copyright (c) 2021 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/json/json_util.h"
25 #include "core/common/ace_application_info.h"
26 #include "core/common/ace_engine.h"
27
28 namespace OHOS::Ace {
29 namespace {
30
31 constexpr char EVENT_KEY_ERROR_TYPE[] = "ERROR_TYPE";
32 constexpr char EVENT_KEY_UID[] = "UID";
33 constexpr char EVENT_KEY_PID[] = "PID";
34 constexpr char EVENT_KEY_SESSIONID[] = "SESSION_ID";
35 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
36 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
37 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
38 constexpr char EVENT_KEY_CMD[] = "CMD";
39 constexpr char EVENT_KEY_REASON[] = "REASON";
40 constexpr char EVENT_KEY_SUMMARY[] = "SUMMARY";
41 constexpr char EVENT_NAME_JS_ERROR[] = "JS_ERROR";
42 constexpr char STATISTIC_DURATION[] = "DURATION";
43 constexpr char EVENT_KEY_STARTTIME[] = "STARTTIME";
44 constexpr char EVENT_KEY_VERSION_CODE[] = "VERSION_CODE";
45 constexpr char EVENT_KEY_VERSION_NAME[] = "VERSION_NAME";
46 constexpr char EVENT_KEY_BUNDLE_NAME[] = "BUNDLE_NAME";
47 constexpr char EVENT_KEY_ABILITY_NAME[] = "ABILITY_NAME";
48 constexpr char EVENT_KEY_PAGE_URL[] = "PAGE_URL";
49 constexpr char EVENT_KEY_JANK_STATS[] = "JANK_STATS";
50 constexpr char EVENT_KEY_JANK_STATS_VER[] = "JANK_STATS_VER";
51 constexpr char EVENT_KEY_APP_PID[] = "APP_PID";
52 constexpr char EVENT_KEY_SCENE_ID[] = "SCENE_ID";
53 constexpr char EVENT_KEY_INPUT_TIME[] = "INPUT_TIME";
54 constexpr char EVENT_KEY_ANIMATION_START_LATENCY[] = "ANIMATION_START_LATENCY";
55 constexpr char EVENT_KEY_ANIMATION_END_LATENCY[] = "ANIMATION_END_LATENCY";
56 constexpr char EVENT_KEY_E2E_LATENCY[] = "E2E_LATENCY";
57 constexpr char EVENT_KEY_UNIQUE_ID[] = "UNIQUE_ID";
58 constexpr char EVENT_KEY_MODULE_NAME[] = "MODULE_NAME";
59 constexpr char EVENT_KEY_DURITION[] = "DURITION";
60 constexpr char EVENT_KEY_TOTAL_FRAMES[] = "TOTAL_FRAMES";
61 constexpr char EVENT_KEY_TOTAL_MISSED_FRAMES[] = "TOTAL_MISSED_FRAMES";
62 constexpr char EVENT_KEY_MAX_FRAMETIME[] = "MAX_FRAMETIME";
63 constexpr char EVENT_KEY_MAX_SEQ_MISSED_FRAMES[] = "MAX_SEQ_MISSED_FRAMES";
64 constexpr char EVENT_KEY_SOURCE_TYPE[] = "SOURCE_TYPE";
65 constexpr char EVENT_KEY_NOTE[] = "NOTE";
66
67 constexpr int32_t MAX_PACKAGE_NAME_LENGTH = 128;
68
69 constexpr char DUMP_LOG_COMMAND[] = "B";
70
StrTrim(std::string & str)71 void StrTrim(std::string& str)
72 {
73 if (str.size() > MAX_PACKAGE_NAME_LENGTH) {
74 str = str.substr(0, MAX_PACKAGE_NAME_LENGTH);
75 }
76 }
77
78 } // namespace
79
SendEvent(const EventInfo & eventInfo)80 void EventReport::SendEvent(const EventInfo& eventInfo)
81 {
82 auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
83 if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {
84 StrTrim(packageName);
85 }
86 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
87 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
88 EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
89 EVENT_KEY_PACKAGE_NAME, packageName);
90 }
91
SendJsCardRenderTimeEvent(const std::string & sessionID,const std::string & timeType,uint64_t timeDelay)92 void EventReport::SendJsCardRenderTimeEvent(
93 const std::string& sessionID,
94 const std::string& timeType,
95 uint64_t timeDelay)
96 {
97 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, timeType,
98 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
99 EVENT_KEY_SESSIONID, sessionID,
100 STATISTIC_DURATION, timeDelay);
101 }
102
SendAppStartException(AppStartExcepType type)103 void EventReport::SendAppStartException(AppStartExcepType type)
104 {
105 EventInfo eventInfo = {
106 .eventType = EXCEPTION_FRAMEWORK_APP_START,
107 .errorType = static_cast<int32_t>(type),
108 };
109
110 SendEventInner(eventInfo);
111 }
112
SendPageRouterException(PageRouterExcepType type,const std::string & pageUrl)113 void EventReport::SendPageRouterException(PageRouterExcepType type, const std::string& pageUrl)
114 {
115 EventInfo eventInfo = {
116 .eventType = EXCEPTION_FRAMEWORK_PAGE_ROUTER,
117 .errorType = static_cast<int32_t>(type),
118 .pageUrl = pageUrl,
119 };
120
121 SendEventInner(eventInfo);
122 }
123
SendComponentException(ComponentExcepType type)124 void EventReport::SendComponentException(ComponentExcepType type)
125 {
126 EventInfo eventInfo = {
127 .eventType = EXCEPTION_COMPONENT,
128 .errorType = static_cast<int32_t>(type),
129 };
130
131 SendEventInner(eventInfo);
132 }
133
SendAPIChannelException(APIChannelExcepType type)134 void EventReport::SendAPIChannelException(APIChannelExcepType type)
135 {
136 EventInfo eventInfo = {
137 .eventType = EXCEPTION_API_CHANNEL,
138 .errorType = static_cast<int32_t>(type),
139 };
140
141 SendEventInner(eventInfo);
142 }
143
SendRenderException(RenderExcepType type)144 void EventReport::SendRenderException(RenderExcepType type)
145 {
146 EventInfo eventInfo = {
147 .eventType = EXCEPTION_RENDER,
148 .errorType = static_cast<int32_t>(type),
149 };
150
151 SendEventInner(eventInfo);
152 }
153
SendJsException(JsExcepType type)154 void EventReport::SendJsException(JsExcepType type)
155 {
156 EventInfo eventInfo = {
157 .eventType = EXCEPTION_JS,
158 .errorType = static_cast<int32_t>(type),
159 };
160
161 SendEventInner(eventInfo);
162 }
163
SendAnimationException(AnimationExcepType type)164 void EventReport::SendAnimationException(AnimationExcepType type)
165 {
166 EventInfo eventInfo = {
167 .eventType = EXCEPTION_ANIMATION,
168 .errorType = static_cast<int32_t>(type),
169 };
170
171 SendEventInner(eventInfo);
172 }
173
SendEventException(EventExcepType type)174 void EventReport::SendEventException(EventExcepType type)
175 {
176 EventInfo eventInfo = {
177 .eventType = EXCEPTION_EVENT,
178 .errorType = static_cast<int32_t>(type),
179 };
180
181 SendEventInner(eventInfo);
182 }
183
SendInternalException(InternalExcepType type)184 void EventReport::SendInternalException(InternalExcepType type)
185 {
186 EventInfo eventInfo = {
187 .eventType = EXCEPTION_INTERNATIONALIZATION,
188 .errorType = static_cast<int32_t>(type),
189 };
190
191 SendEventInner(eventInfo);
192 }
193
SendAccessibilityException(AccessibilityExcepType type)194 void EventReport::SendAccessibilityException(AccessibilityExcepType type)
195 {
196 EventInfo eventInfo = {
197 .eventType = EXCEPTION_ACCESSIBILITY,
198 .errorType = static_cast<int32_t>(type),
199 };
200
201 SendEventInner(eventInfo);
202 }
203
SendFormException(FormExcepType type)204 void EventReport::SendFormException(FormExcepType type)
205 {
206 EventInfo eventInfo = {
207 .eventType = EXCEPTION_FORM,
208 .errorType = static_cast<int32_t>(type),
209 };
210
211 SendEventInner(eventInfo);
212 }
213
JsEventReport(int32_t eventType,const std::string & jsonStr)214 void EventReport::JsEventReport(int32_t eventType, const std::string& jsonStr)
215 {
216 if (!JsonUtil::ParseJsonString(jsonStr)) {
217 LOGE("jsonStr is not a JsonArray.");
218 return;
219 }
220 }
221
JsErrReport(const std::string & packageName,const std::string & reason,const std::string & summary)222 void EventReport::JsErrReport(
223 const std::string& packageName, const std::string& reason, const std::string& summary)
224 {
225 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, EVENT_NAME_JS_ERROR,
226 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
227 EVENT_KEY_PACKAGE_NAME, packageName,
228 EVENT_KEY_REASON, reason,
229 EVENT_KEY_SUMMARY, summary);
230 }
231
ANRRawReport(RawEventType type,int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)232 void EventReport::ANRRawReport(RawEventType type, int32_t uid, const std::string& packageName,
233 const std::string& processName, const std::string& msg)
234 {
235 int32_t pid = getpid();
236 std::string cmd = " ";
237 std::string eventName = "";
238 if (type == RawEventType::WARNING) {
239 eventName = "UI_BLOCK_3S";
240 cmd = "p=" + std::to_string(pid);
241 } else if (type == RawEventType::FREEZE) {
242 eventName = "UI_BLOCK_6S";
243 cmd = DUMP_LOG_COMMAND;
244 } else {
245 eventName = "UI_BLOCK_RECOVERED";
246 }
247 std::string uidStr = std::to_string(uid);
248 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
249 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
250 EVENT_KEY_UID, uidStr,
251 EVENT_KEY_PACKAGE_NAME, packageName,
252 EVENT_KEY_PROCESS_NAME, processName,
253 EVENT_KEY_MESSAGE, msg,
254 EVENT_KEY_CMD, cmd);
255 }
256
ANRShowDialog(int32_t uid,const std::string & packageName,const std::string & processName,const std::string & msg)257 void EventReport::ANRShowDialog(int32_t uid, const std::string& packageName,
258 const std::string& processName, const std::string& msg)
259 {
260 int32_t pid = getpid();
261 std::string eventName = "UI_BLOCK_DIALOG";
262 std::string uidStr = std::to_string(uid);
263 std::string pidStr = std::to_string(pid);
264 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
265 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
266 EVENT_KEY_UID, uidStr,
267 EVENT_KEY_PID, pidStr,
268 EVENT_KEY_PACKAGE_NAME, packageName,
269 EVENT_KEY_PROCESS_NAME, processName,
270 EVENT_KEY_MESSAGE, msg);
271 }
272
JankFrameReport(int64_t startTime,int64_t duration,const std::vector<uint16_t> & jank,const std::string & pageUrl,uint32_t jankStatusVersion)273 void EventReport::JankFrameReport(int64_t startTime, int64_t duration, const std::vector<uint16_t>& jank,
274 const std::string& pageUrl, uint32_t jankStatusVersion)
275 {
276 std::string eventName = "JANK_STATS_APP";
277 auto app_version_code = AceApplicationInfo::GetInstance().GetAppVersionCode();
278 auto app_version_name = AceApplicationInfo::GetInstance().GetAppVersionName();
279 auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
280 auto abilityName = AceApplicationInfo::GetInstance().GetAbilityName();
281 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
282 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
283 EVENT_KEY_STARTTIME, startTime,
284 STATISTIC_DURATION, duration,
285 EVENT_KEY_VERSION_CODE, app_version_code,
286 EVENT_KEY_VERSION_NAME, app_version_name,
287 EVENT_KEY_BUNDLE_NAME, packageName,
288 EVENT_KEY_ABILITY_NAME, abilityName,
289 EVENT_KEY_PAGE_URL, pageUrl,
290 EVENT_KEY_JANK_STATS, jank,
291 EVENT_KEY_JANK_STATS_VER, jankStatusVersion);
292 }
293
SendEventInner(const EventInfo & eventInfo)294 void EventReport::SendEventInner(const EventInfo& eventInfo)
295 {
296 auto packageName = AceApplicationInfo::GetInstance().GetPackageName();
297 StrTrim(packageName);
298 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,
299 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
300 EVENT_KEY_ERROR_TYPE, eventInfo.errorType,
301 EVENT_KEY_PACKAGE_NAME, packageName);
302 }
303
ReportEventComplete(DataBase & data)304 void EventReport::ReportEventComplete(DataBase& data)
305 {
306 std::string eventName = "INTERACTION_COMPLETED_LATENCY";
307 const auto& appPid = data.baseInfo.pid;
308 const auto& bundleName = data.baseInfo.bundleName;
309 const auto& processName = data.baseInfo.processName;
310 const auto& abilityName = data.baseInfo.abilityName;
311 const auto& pageUrl = data.baseInfo.pageUrl;
312 const auto& versionCode = data.baseInfo.versionCode;
313 const auto& versionName = data.baseInfo.versionName;
314 const auto& sceneId = data.sceneId;
315 const auto& sourceType = GetSourceTypeName(data.sourceType);
316 auto inputTime = data.inputTime;
317 ConvertRealtimeToSystime(data.inputTime, inputTime);
318 const auto& animationStartLantency = (data.beginVsyncTime - data.inputTime) / NS_TO_MS;
319 const auto& animationEndLantency = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
320 const auto& e2eLatency = animationStartLantency + animationEndLantency;
321 const auto& note = data.baseInfo.note;
322 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
323 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
324 EVENT_KEY_APP_PID, appPid,
325 EVENT_KEY_BUNDLE_NAME, bundleName,
326 EVENT_KEY_PROCESS_NAME, processName,
327 EVENT_KEY_ABILITY_NAME, abilityName,
328 EVENT_KEY_PAGE_URL, pageUrl,
329 EVENT_KEY_VERSION_CODE, versionCode,
330 EVENT_KEY_VERSION_NAME, versionName,
331 EVENT_KEY_SCENE_ID, sceneId,
332 EVENT_KEY_SOURCE_TYPE, sourceType,
333 EVENT_KEY_INPUT_TIME, static_cast<uint64_t>(inputTime),
334 EVENT_KEY_ANIMATION_START_LATENCY, static_cast<uint64_t>(animationStartLantency),
335 EVENT_KEY_ANIMATION_END_LATENCY, static_cast<uint64_t>(animationEndLantency),
336 EVENT_KEY_E2E_LATENCY, static_cast<uint64_t>(e2eLatency),
337 EVENT_KEY_NOTE, note);
338 }
339
ReportEventJankFrame(DataBase & data)340 void EventReport::ReportEventJankFrame(DataBase& data)
341 {
342 std::string eventName = "INTERACTION_APP_JANK";
343 const auto& uniqueId = data.beginVsyncTime / NS_TO_MS;
344 const auto& sceneId = data.sceneId;
345 const auto& bundleName = data.baseInfo.bundleName;
346 const auto& processName = data.baseInfo.processName;
347 const auto& abilityName = data.baseInfo.abilityName;
348 const auto& pageUrl = data.baseInfo.pageUrl;
349 const auto& versionCode = data.baseInfo.versionCode;
350 const auto& versionName = data.baseInfo.versionName;
351 auto startTime = data.beginVsyncTime;
352 ConvertRealtimeToSystime(data.beginVsyncTime, startTime);
353 const auto& durition = (data.endVsyncTime - data.beginVsyncTime) / NS_TO_MS;
354 const auto& totalFrames = data.totalFrames;
355 const auto& totalMissedFrames = data.totalMissed;
356 const auto& maxFrameTime = data.maxFrameTime / NS_TO_MS;
357 const auto& maxSeqMissedFrames = data.maxSuccessiveFrames;
358 const auto& note = data.baseInfo.note;
359 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventName,
360 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
361 EVENT_KEY_UNIQUE_ID, static_cast<int32_t>(uniqueId),
362 EVENT_KEY_SCENE_ID, sceneId,
363 EVENT_KEY_PROCESS_NAME, processName,
364 EVENT_KEY_MODULE_NAME, bundleName,
365 EVENT_KEY_ABILITY_NAME, abilityName,
366 EVENT_KEY_PAGE_URL, pageUrl,
367 EVENT_KEY_VERSION_CODE, versionCode,
368 EVENT_KEY_VERSION_NAME, versionName,
369 EVENT_KEY_STARTTIME, static_cast<uint64_t>(startTime),
370 EVENT_KEY_DURITION, static_cast<uint64_t>(durition),
371 EVENT_KEY_TOTAL_FRAMES, totalFrames,
372 EVENT_KEY_TOTAL_MISSED_FRAMES, totalMissedFrames,
373 EVENT_KEY_MAX_FRAMETIME, static_cast<uint64_t>(maxFrameTime),
374 EVENT_KEY_MAX_SEQ_MISSED_FRAMES, maxSeqMissedFrames,
375 EVENT_KEY_NOTE, note);
376 }
377 } // namespace OHOS::Ace
378