1 /*
2  * Copyright (c) 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 #ifndef EVT_PARSER_H
16 #define EVT_PARSER_H
17 
18 #include "XperfEvt.h"
19 #include "plugin.h"
20 #include "sys_event.h"
21 
22 const std::string KEY_PNAME = "PROCESS_NAME";
23 const std::string KEY_MESSAGE = "MSG";
24 const std::string KEY_PID = "PID";
25 const std::string KEY_UID = "UID";
26 const std::string KEY_APP_PID = "APP_PID";
27 const std::string KEY_APP_VERSION = "VERSION_NAME";
28 const std::string KEY_ABILITY_NAME = "ABILITY_NAME";
29 const std::string KEY_BUNDLE_NAME = "BUNDLE_NAME";
30 const std::string KEY_ABILITY_TYPE = "ABILITY_TYPE";
31 
32 const std::string START_ABILITY = "START_ABILITY";
33 const std::string APP_ATTACH = "APP_ATTACH";
34 const std::string ABILITY_ONFOREGROUND = "ABILITY_ONFOREGROUND";
35 const std::string APP_FOREGROUND = "APP_FOREGROUND";
36 const std::string APP_BACKGROUND = "APP_BACKGROUND";
37 const std::string APP_TERMINATE = "APP_TERMINATE";
38 const std::string JANK_FRAME_SKIP = "JANK_FRAME_SKIP";
39 const std::string ABILITY_ONBACKGROUND = "ABILITY_ONBACKGROUND";
40 const std::string RS_COMPOSITION_TIMEOUT = "RS_COMPOSITION_TIMEOUT";
41 const std::string ABILITY_ONACTIVE = "ABILITY_ONACTIVE";
42 const std::string KERNEL_AWAKE = "KERNEL_AWAKE";
43 const std::string SCREENON_EVENT = "SCREENON_EVENT";
44 const std::string LCD_POWER_ON = "LCD_POWER_ON";
45 const std::string LCD_BACKLIGHT_ON = "LCD_BACKLIGHT_ON";
46 const std::string KEY_STARTUP_TIME = "STARTUP_TIME";
47 
48 const std::string KEY_VERSION_CODE = "VERSION_CODE";
49 const std::string KEY_SOURCE_TYPE = "SOURCE_TYPE";
50 const std::string PAGE_URL = "PAGE_URL";
51 const std::string SCENE_ID = "SCENE_ID";
52 const std::string INPUT_TIME = "INPUT_TIME";
53 const std::string ANIMATION_START_TIME = "ANIMATION_START_TIME";
54 const std::string RENDER_TIME = "RENDER_TIME";
55 const std::string RESPONSE_LATENCY = "RESPONSE_LATENCY";
56 const std::string TIMER = "time_";
57 const std::string ANIMATION_END_LATENCY = "ANIMATION_END_LATENCY";
58 const std::string E2E_LATENCY = "E2E_LATENCY";
59 
60 // for boot
61 const std::string REASON = "REASON";
62 const std::string ISFIRST = "ISFIRST";
63 const std::string DETAILED_TIME = "DETAILED_TIME";
64 const std::string TOTAL_TIME = "TOTAL_TIME";
65 
66 //for app startup
67 const std::string KEY_BUNDLE_TYPE = "BUNDLE_TYPE";
68 const std::string KEY_MODULE_NAME = "MODULE_NAME";
69 const std::string KEY_STARTUP_ABILITY_TYPE = "STARTUP_ABILITY_TYPE";
70 const std::string KEY_STARTUP_EXTENSION_TYPE = "STARTUP_EXTENSION_TYPE";
71 const std::string KEY_CALLER_BUNDLE_NAME = "CALLER_BUNDLE_NAME";
72 const std::string KEY_CALLER_UID = "CALLER_UID";
73 const std::string KEY_CALLER_PROCESS_NAME = "CALLER_PROCESS_NAME";
74 const std::string KEY_WINDOW_NAME = "WINDOW_NAME";
75 const std::string KEY_ANIMATION_START_LATENCY = "ANIMATION_START_LATENCY";
76 const std::string KEY_E2E_LATENCY = "ANIMATION_E2E_LATENCY";
77 const std::string KEY_START_TYPE = "START_TYPE";
78 const std::string KEY_APP_UID = "APP_UID";
79 
80 // for app associated start
81 const std::string KEY_CALLEE_PROCESS_NAME = "CALLEE_PROCESS_NAME";
82 const std::string KEY_CALLEE_BUNDLE_NAME = "CALLEE_BUNDLE_NAME";
83 
84 // animator jank frame
85 const std::string UNIQUE_ID = "UNIQUE_ID";
86 const std::string STARTTIME = "STARTTIME";
87 const std::string DURITION = "DURITION";
88 const std::string TOTAL_FRAMES = "TOTAL_FRAMES";
89 const std::string TOTAL_MISSED_FRAMES = "TOTAL_MISSED_FRAMES";
90 const std::string MAX_SEQ_MISSED_FRAMES = "MAX_SEQ_MISSED_FRAMES";
91 const std::string MAX_FRAMETIME = "MAX_FRAMETIME";
92 const std::string AVERAGE_FRAMETIME = "AVERAGE_FRAMETIME";
93 const std::string IS_FOLD_DISP = "IS_FOLD_DISP";
94 const std::string IS_DISPLAY_ANIMATOR = "DISPLAY_ANIMATOR";
95 // for screen switch
96 const std::string KEY_SCREEN_ID = "SCREEN_ID";
97 const std::string KEY_SCENE_PANEL_NAME = "SCENE_PANEL_NAME";
98 const std::string KEY_ROTATION_START_TIME = "ROTATION_START_TIME";
99 const std::string KEY_ROTATION_DURATION = "ROTATION_DURATION";
100 //for app exit
101 const std::string KEY_EXIT_TIME = "EXIT_TIME";
102 const std::string KEY_EXIT_RESULT = "EXIT_RESULT";
103 const std::string KEY_EXIT_PID = "EXIT_PID";
104 const std::string KEY_NOTE = "NOTE";
105 
106 // for power on
107 const std::string POWER_STATE = "STATE";
108 
109 // for screen unlock
110 const std::string KEY_PACKAGE_NAME = "PACKAGE_NAME";
111 const std::string KEY_VERIFYSUCESS = "VERIFYSUCESS";
112 const std::string KEY_VERIFY_COSTTIME = "VERIFY_COSTTIME";
113 
114 // for for PC quick wake
115 const std::string KEY_KERNEL_START_TIME = "KERNEL_START_TIME";
116 const std::string KEY_KERNEL_END_TIME = "KERNEL_END_TIME";
117 const std::string KEY_ANIM_BEGIN_TIME = "BEGIN_TIME";
118 const std::string KEY_ANIM_END_TIME = "END_TIME";
119 
120 // for general skip frame
121 const std::string KEY_SKIPPED_FRAME_TIME = "SKIPPED_FRAME_TIME";
122 
123 // for DH jank frame
124 const std::string DH_JANK_FRAME_HAPPEN_TIME = "HAPPEN_TIME";
125 const std::string DH_JANK_FRAME_TOTAL_TIME_SPENT = "TOTAL_TIME_SPENT";
126 const std::string DH_JANK_FRAME_PACKAGE_NAME = "PACKAGE_NAME";
127 const std::string DH_JANK_FRAME_VERSION = "VERSION";
128 
129 // for DH compose jank frame
130 const std::string DH_COMPOSE_JANK_FRAME_START_TIME = "START_TIME";
131 const std::string DH_COMPOSE_JANK_FRAME_END_TIME = "END_TIME";
132 const std::string DH_COMPOSE_JANK_FRAME_SKIP_FRAME = "SKIP_FRAME";
133 const std::string DH_COMPOSE_JANK_FRAME_VSYNC_INTERVAL = "VSYNC_INTERVAL";
134 
135 // for DH app start
136 const std::string DH_APP_START_MISSION_ID = "MISSION_ID";
137 const std::string DH_APP_START_TASK_ID = "TASK_ID";
138 const std::string DH_APP_START_TIMESTAMP = "TIMESTAMP";
139 // for screen Fold open and close
140 const std::string KEY_POWER_OFF_SCREEN = "POWER_OFF_SCREEN";
141 const std::string KEY_POWER_ON_SCREEN = "POWER_ON_SCREEN";
142 
143 const std::string KEY_HAPPEN_TIME = "HAPPEN_TIME";
144 
145 // for perf factory test mode
146 const std::string PERF_FACTORY_TEST_TITLE = "TEST_TITLE";
147 
148 // for frequency limit
149 const std::string KEY_CLIENT_ID = "CLIENT_ID";
150 const std::string KEY_RES_ID = "RES_ID";
151 const std::string KEY_CONFIG = "CONFIG";
152 // for boost limit
153 const std::string KEY_ON_OFF_TAG = "ON_OFF_TAG";
154 // for shader malfunction
155 const std::string KEY_SHADER_MALFUNCTION_PID = "PID";
156 const std::string KEY_SHADER_MALFUNCTION_PROCESS_NAME = "PROCESS_NAME";
157 const std::string KEY_SHADER_MALFUNCTION_HASH_CODE = "HASH_CODE";
158 const std::string KEY_SHADER_MALFUNCTION_COMPILE_TIME = "COMPILE_TIME";
159 const std::string KEY_SHADER_MALFUNCTION_TIME_STAMP = "TIME_STAMP";
160 const std::string KEY_SHADER_MALFUNCTION_PART_FLAG = "PART_FLAG";
161 // for shader stats
162 const std::string KEY_SHADER_STATS_PID = "PID";
163 const std::string KEY_SHADER_STATS_PROCESS_NAME = "PROCESS_NAME";
164 const std::string KEY_SHADER_STATS_TIME_STAMP = "TIME_STAMP";
165 const std::string KEY_SHADER_STATS_PART_FLAG = "PART_FLAG";
166 // for webview page load
167 const std::string NAVIGATION_ID = "NAVIGATION_ID";
168 const std::string NAVIGATION_START = "NAVIGATION_START";
169 const std::string REDIRECT_COUNT = "REDIRECT_COUNT";
170 const std::string REDIRECT_START = "REDIRECT_START";
171 const std::string REDIRECT_END = "REDIRECT_END";
172 const std::string FETCH_START = "FETCH_START";
173 const std::string WORKER_START = "WORKER_START";
174 const std::string DOMAIN_LOOKUP_START = "DOMAIN_LOOKUP_START";
175 const std::string DOMAIN_LOOKUP_END = "DOMAIN_LOOKUP_END";
176 const std::string CONNECT_START = "CONNECT_START";
177 const std::string SECURE_CONNECT_START = "SECURE_CONNECT_START";
178 const std::string CONNECT_END = "CONNECT_END";
179 const std::string REQUEST_START = "REQUEST_START";
180 const std::string RESPONSE_START = "RESPONSE_START";
181 const std::string RESPONSE_END = "RESPONSE_END";
182 const std::string DOM_INTERACTIVE = "DOM_INTERACTIVE";
183 const std::string DOM_CONTENT_LOADED_EVENT_START = "DOM_CONTENT_LOADED_EVENT_START";
184 const std::string DOM_CONTENT_LOADED_EVENT_END = "DOM_CONTENT_LOADED_EVENT_END";
185 const std::string LOAD_EVENT_START = "LOAD_EVENT_START";
186 const std::string LOAD_EVENT_END = "LOAD_EVENT_END";
187 const std::string FIRST_PAINT = "FIRST_PAINT";
188 const std::string FIRST_CONTENTFUL_PAINT = "FIRST_CONTENTFUL_PAINT";
189 const std::string LARGEST_CONTENTFUL_PAINT = "LARGEST_CONTENTFUL_PAINT";
190 // for webview dynamic frame drop
191 const std::string DURATION = "DURATION";
192 const std::string TOTAL_APP_FRAMES = "TOTAL_APP_FRAMES";
193 const std::string TOTAL_APP_MISSED_FRAMES = "TOTAL_APP_MISSED_FRAMES";
194 const std::string MAX_APP_FRAMETIME = "MAX_APP_FRAMETIME";
195 // for webview audio frame drop
196 const std::string AUDIO_BLANK_FRAME_COUNT = "AUDIO_BLANK_FRAME_COUNT";
197 // for webview video frame drop
198 const std::string VIDEO_FRAME_DROPPED_COUNT = "VIDEO_FRAME_DROPPED_COUNT";
199 const std::string VIDEO_FRAME_DROPPED_DURATION = "VIDEO_FRAME_DROPPED_DURATION";
200 // for hitch time ratio
201 const std::string UI_START_TIME = "UI_START_TIME";
202 const std::string RS_START_TIME = "RS_START_TIME";
203 const std::string HITCH_TIME = "HITCH_TIME";
204 const std::string KEY_HITCH_TIME_RATIO = "HITCH_TIME_RATIO";
205 
206 #define US_TO_S 1000000
207 
208 class EvtParser {
209     using Event = OHOS::HiviewDFX::Event;
210     using SysEvent = OHOS::HiviewDFX::SysEvent;
211 
212 public:
213     static const std::string separator;
214     static const std::map<std::string, unsigned int> logIdMap;
215 
ExtractLogIdFromEvt(const SysEvent & sysEvent)216     static unsigned int ExtractLogIdFromEvt(const SysEvent &sysEvent)
217     {
218         std::string logIdStr = std::string(sysEvent.domain_ + separator + sysEvent.eventName_);
219         unsigned int logId = logIdMap.at(logIdStr); // this might throw std::out_of_range
220         return logId;
221     }
222 
FromHivewEvt(const SysEvent & e)223     static std::shared_ptr <XperfEvt> FromHivewEvt(const SysEvent &e)
224     {
225         Validate(e);
226         XperfEvt evt = ConvertToXperfEvent(e);
227         std::shared_ptr <XperfEvt> ret = std::make_shared<XperfEvt>(evt);
228         return ret;
229     }
230 
231 private:
ConvertToXperfEvent(const SysEvent & event)232     static XperfEvt ConvertToXperfEvent(const SysEvent &event)
233     {
234         SysEvent &sysEvent = (SysEvent &) event;
235         XperfEvt evt;
236         evt.logId = ExtractLogIdFromEvt(sysEvent);
237         evt.domain = sysEvent.domain_;
238         evt.eventName = std::string(sysEvent.eventName_);
239         evt.pid = sysEvent.GetPid();
240         evt.versionCode = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_VERSION_CODE));
241         evt.appPid = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_APP_PID));
242         evt.sourceType = sysEvent.GetEventValue(KEY_SOURCE_TYPE);
243         evt.pageUrl = sysEvent.GetEventValue(PAGE_URL);
244         evt.sceneId = sysEvent.GetEventValue(SCENE_ID);
245         evt.eventTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(TIMER));
246         evt.inputTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(INPUT_TIME));
247         evt.renderTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(RENDER_TIME));
248         evt.responseLatency = static_cast<uint64_t>(sysEvent.GetEventIntValue(RESPONSE_LATENCY));
249         evt.e2eLatency = static_cast<uint64_t>(sysEvent.GetEventIntValue(E2E_LATENCY));
250         evt.bundleName = sysEvent.GetEventValue(KEY_BUNDLE_NAME);
251         evt.bundleType = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_BUNDLE_TYPE));
252         evt.abilityName = sysEvent.GetEventValue(KEY_ABILITY_NAME);
253         evt.processName = sysEvent.GetEventValue(KEY_PNAME);
254         evt.moduleName = sysEvent.GetEventValue(KEY_MODULE_NAME);
255         evt.versionName = sysEvent.GetEventValue(KEY_APP_VERSION);
256         evt.startType = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_START_TYPE));
257         evt.startupTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(KEY_STARTUP_TIME));
258         evt.startupAbilityType = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_STARTUP_ABILITY_TYPE));
259         evt.startupExtensionType = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_STARTUP_EXTENSION_TYPE));
260         evt.callerBundleName = sysEvent.GetEventValue(KEY_CALLER_BUNDLE_NAME);
261         evt.callerUid = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_CALLER_UID));
262         evt.callerProcessName = sysEvent.GetEventValue(KEY_CALLER_PROCESS_NAME);
263         evt.windowName = sysEvent.GetEventValue(KEY_WINDOW_NAME);
264         evt.time = evt.eventTime;
265         evt.animationStartTime = evt.animStartTime;
266         evt.animationStartLatency = static_cast<uint64_t>(sysEvent.GetEventIntValue(KEY_ANIMATION_START_LATENCY));
267         evt.animationEndLatency = evt.animationLatency;
268         evt.appUid = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_APP_UID));
269         ConvertToXperfAnimatorEvent(evt, sysEvent);
270         evt.exitTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(KEY_EXIT_TIME));
271         evt.exitResult = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_EXIT_RESULT));
272         evt.exitPid = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_EXIT_PID));
273         evt.note = sysEvent.GetEventValue(KEY_NOTE);
274         return evt;
275     }
276 
ConvertToXperfAnimatorEvent(XperfEvt & evt,SysEvent & sysEvent)277     static void ConvertToXperfAnimatorEvent(XperfEvt &evt, SysEvent &sysEvent)
278     {
279         evt.animatorInfo.basicInfo.uniqueId = static_cast<int32_t>(sysEvent.GetEventIntValue(UNIQUE_ID));
280         evt.animatorInfo.basicInfo.sceneId = sysEvent.GetEventValue(SCENE_ID);
281         evt.animatorInfo.basicInfo.moduleName = sysEvent.GetEventValue(KEY_MODULE_NAME);
282         evt.animatorInfo.basicInfo.processName = sysEvent.GetEventValue(KEY_PNAME);
283         evt.animatorInfo.basicInfo.abilityName = sysEvent.GetEventValue(KEY_ABILITY_NAME);
284         evt.animatorInfo.basicInfo.pageUrl = sysEvent.GetEventValue(PAGE_URL);
285         evt.animatorInfo.basicInfo.sourceType = sysEvent.GetEventValue(KEY_SOURCE_TYPE);
286         evt.animatorInfo.basicInfo.versionCode = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_VERSION_CODE));
287         evt.animatorInfo.basicInfo.versionName = sysEvent.GetEventValue(KEY_APP_VERSION);
288         evt.animatorInfo.basicInfo.bundleNameEx = sysEvent.GetEventValue(KEY_NOTE);
289         evt.animatorInfo.commonInfo.appPid = sysEvent.GetPid();
290         evt.animatorInfo.commonInfo.durition = static_cast<uint64_t>(sysEvent.GetEventIntValue(DURITION));
291         evt.animatorInfo.commonInfo.startTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(STARTTIME));
292         evt.animatorInfo.commonInfo.totalFrames = static_cast<int32_t>(sysEvent.GetEventIntValue(TOTAL_FRAMES));
293         evt.animatorInfo.commonInfo.totalMissedFrames
294             = static_cast<int32_t>(sysEvent.GetEventIntValue(TOTAL_MISSED_FRAMES));
295         evt.animatorInfo.commonInfo.maxSeqMissedFrames
296             = static_cast<int32_t>(sysEvent.GetEventIntValue(MAX_SEQ_MISSED_FRAMES));
297         evt.animatorInfo.commonInfo.maxFrameTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(MAX_FRAMETIME));
298         evt.animatorInfo.commonInfo.averageFrameTime
299             = static_cast<int32_t>(sysEvent.GetEventIntValue(AVERAGE_FRAMETIME));
300         evt.animatorInfo.commonInfo.isFoldDisp = static_cast<bool>(sysEvent.GetEventIntValue(IS_FOLD_DISP));
301         evt.animatorInfo.commonInfo.isDisplayAnimator
302             = static_cast<bool>(sysEvent.GetEventIntValue(IS_DISPLAY_ANIMATOR));
303         evt.animatorInfo.commonInfo.happenTime = static_cast<uint64_t>(sysEvent.GetEventIntValue(TIMER));
304     }
305 
Validate(const SysEvent & event)306     static void Validate(const SysEvent &event)
307     {
308         SysEvent &sysEvent = (SysEvent &) event;
309         if (sysEvent.eventName_ == JANK_FRAME_SKIP) {
310             std::string appName = sysEvent.GetEventValue(KEY_ABILITY_NAME);
311             if (appName == "") {
312                 throw std::invalid_argument("invalid sysEvent JANK_FRAME_SKIP");
313             }
314         }
315         if (sysEvent.eventName_ == ABILITY_ONACTIVE) {
316             int32_t type = static_cast<int32_t>(sysEvent.GetEventIntValue(KEY_ABILITY_TYPE));
317             if (type != 1) {
318                 throw std::invalid_argument("invalid sysEvent ABILITY_ONACTIVE");
319             }
320         }
321         if (sysEvent.eventName_ == KEY_STARTUP_TIME) {
322             std::string detailedTime = sysEvent.GetEventValue(DETAILED_TIME);
323             if (detailedTime == "") {
324                 throw std::invalid_argument("invalid sysEvent STARTUP_TIME");
325             }
326         }
327         // what follows cannot be understood
328     }
329 };
330 
331 #endif
332