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