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 #include "plugin_factory.h" 16 #include "app_event_publisher_factory.h" 17 #include "XperfPlugin.h" 18 #include "EvtParser.h" 19 #include "JlogId.h" 20 #include "EventObserverConverter.h" 21 #include "NormalContext.h" 22 #include "hiview_logger.h" 23 24 const std::string EvtParser::separator = ":"; 25 26 const std::map<std::string, unsigned int> EvtParser::logIdMap = { 27 {"GRAPHIC:JANK_FRAME_SKIP", JLID_JANK_FRAME_SKIP}, 28 {"AAFWK:START_ABILITY", JLID_START_ABILITY}, 29 {"AAFWK:ABILITY_ONFOREGROUND", JLID_ABILITY_ONFOREGROUND}, 30 {"AAFWK:APP_FOREGROUND", JLID_APP_FOREGROUND}, 31 {"AAFWK:ABILITY_ONACTIVE", JLID_ABILITY_ONACTIVE}, 32 {"KERNEL_WAKEUP:LID_WAKEUP_END", JLID_LID_WAKEUP_END}, 33 {"LCD:LCD_POWER_OFF", JLID_LCD_POWER_OFF}, 34 {"AAFWK:TERMINATE_ABILITY", JLID_AAFWK_TERMINATE_ABILITY}, 35 {"AAFWK:APP_BACKGROUND", JLID_APP_BACKGROUND}, 36 {"AAFWK:ABILITY_ONBACKGROUND", JLID_ABILITY_ONBACKGROUND}, 37 {"AAFWK:APP_TERMINATE", JLID_APP_TERMINATE}, 38 {"AAFWK:APP_ATTACH", JLID_APP_ATTACH}, 39 {"GRAPHIC:RS_COMPOSITION_TIMEOUT", JLID_RS_COMPOSITION_TIMEOUT}, 40 {"KERNEL_WAKEUP:LID_WAKEUP_START", JLID_LID_WAKEUP_START}, 41 {"SCREENLOCK_APP:SCREENON_EVENT", JLID_SCREENON_EVENT}, 42 {"LCD:LCD_POWER_ON", JLID_LCD_POWER_ON}, 43 {"LCD:LCD_BACKLIGHT_ON", JLID_LCD_BACKLIGHT_ON}, 44 {"MULTIMODALINPUT:INPUT_POWER_DOWN", JLID_INPUT_POWER_DOWN}, 45 {"LCD:LCD_BACKLIGHT_OFF", JLID_LCD_BACKLIGHT_OFF}, 46 {"POWER:STATE", JLID_POWER_STATE}, 47 {"GRAPHIC:INTERACTION_RESPONSE_LATENCY", JLID_GRAPHIC_INTERACTION_RESPONSE_LATENCY}, 48 {"GRAPHIC:INTERACTION_COMPLETED_LATENCY", JLID_GRAPHIC_INTERACTION_COMPLETED_LATENCY}, 49 {"AAFWK:DRAWN_COMPLETED", JLID_AAFWK_DRAWN_COMPLETED}, 50 {"INIT:STARTUP_TIME", JLID_INIT_STARTUP_TIME}, 51 {"AAFWK:APP_STARTUP_TYPE", JLID_AAFWK_APP_STARTUP_TYPE}, 52 {"AAFWK:PROCESS_START", JLID_AAFWK_PROCESS_START}, 53 {"WINDOWMANAGER:START_WINDOW", JLID_WINDOWMANAGER_START_WINDOW}, 54 {"GRAPHIC:FIRST_FRAME_DRAWN", JLID_GRAPHIC_FIRST_FRAME_DRAWN}, 55 {"ACE:INTERACTION_COMPLETED_LATENCY", JLID_ACE_INTERACTION_COMPLETED_LATENCY}, 56 {"ACE:INTERACTION_APP_JANK", JLID_ACE_INTERACTION_APP_JANK}, 57 {"GRAPHIC:INTERACTION_RENDER_JANK", JLID_GRAPHIC_INTERACTION_RENDER_JANK}, 58 {"AAFWK:CLOSE_ABILITY", JLID_AAFWK_CLOSE_ABILITY}, 59 {"AAFWK:PROCESS_EXIT", JLID_AAFWK_PROCESS_EXIT}, 60 {"SCENE_BOARD_APP:SCENE_PANEL_ROTATION_END", JLID_SCENE_BOARD_APP_CONTAINER_ANIMATION_END}, 61 {"SCENE_BOARD_APP:SCREENUNLOCK_EVENT", JLID_BOARD_SCREENUNLOCK_EVENT}, 62 {"SCENE_BOARD_APP:CLICK_BUTTON_EVENT", JLID_BOARD_CLICK_BUTTON_EVENT}, 63 {"SCENE_BOARD_APP:START_UNLOCK", JLID_BOARD_START_UNLOCK}, 64 {"SCENE_BOARD_APP:UNLOCK_TO_GRID_ANIMATION_END", JLID_BOARD_UNLOCK_TO_GRID_ANIMATION_END}, 65 {"SCENE_BOARD_APP:UNLOCK_TO_DOCK_ANIMATION_END", JLID_BOARD_UNLOCK_TO_DOCK_ANIMATION_END}, 66 {"SCREEN_RECORDER:RECORDER_STOP", JLID_SCREEN_RECORDER_STOP}, 67 {"ACE:JANK_FRAME_APP", JLID_JANK_FRAME_APP}, 68 {"WINDOWMANAGER:FOCUS_WINDOW", JLID_WINDOWMANAGER_FOCUS_WINDOW}, 69 {"RSS:APP_ASSOCIATED_START", JLID_APP_ASSOCIATED_START}, 70 {"SCENE_BOARD_APP:SCREEN_ON_ANIMATION", JLID_SCENE_BOARD_APP_SCREEN_ON_ANIMATION}, 71 {"XGATE:XGATE_WIFI_CONNECT_START", JLID_XGATE_WIFI_CONNECT_START}, 72 {"XGATE:XGATE_WIFI_CONNECT_END", JLID_XGATE_WIFI_CONNECT_END}, 73 {"XGATE:XGATE_SPES_LOGIN_START", JLID_XGATE_SPES_LOGIN_START}, 74 {"XGATE:XGATE_SPES_LOGIN_END", JLID_XGATE_SPES_LOGIN_END}, 75 {"XGATE:XGATE_IACCESS_LOGIN_START", JLID_XGATE_IACCESS_LOGIN_START}, 76 {"XGATE:XGATE_IACCESS_LOGIN_END", JLID_XGATE_IACCESS_LOGIN_END}, 77 {"WINDOWMANAGER:FOLD_STATE_CHANGE_BEGIN", JLID_FOLD_STATE_CHANGE_BEGIN}, 78 {"PERFORMANCE:PERF_FACTORY_TEST_START", JLID_PERF_FACTORY_TEST_START}, 79 {"PERFORMANCE:PERF_FACTORY_TEST_STOP", JLID_PERF_FACTORY_TEST_STOP}, 80 {"PERFORMANCE:PERF_FACTORY_TEST_CLEAR", JLID_PERF_FACTORY_TEST_CLEAR}, 81 {"RSS:LIMIT_BOOST", JLID_LIMIT_BOOST}, 82 {"RSS:LIMIT_REQUEST", JLID_LIMIT_FREQUENCY}, 83 {"GRAPHIC:HGM_VOTER_INFO", JLID_LTPO_DYNAMICS_FRAME}, 84 {"GRAPHIC:SHADER_MALFUNCTION", JLID_SHADER_MALFUNCTION}, 85 {"GRAPHIC:SHADER_STATS", JLID_SHADER_STATS}, 86 {"WEBVIEW:PAGE_LOAD_TIME", JLID_WEBVIEW_PAGE_LOAD}, 87 {"WEBVIEW:DYNAMIC_FRAME_DROP_STATISTICS", JLID_WEBVIEW_DYNAMIC_FRAME_DROP}, 88 {"WEBVIEW:AUDIO_FRAME_DROP_STATISTICS", JLID_WEBVIEW_AUDIO_FRAME_DROP}, 89 {"WEBVIEW:VIDEO_FRAME_DROP_STATISTICS", JLID_WEBVIEW_VIDEO_FRAME_DROP}, 90 {"GRAPHIC:INTERACTION_HITCH_TIME_RATIO", JLID_GRAPHIC_INTERACTION_HITCH_TIME_RATIO} 91 }; 92 93 namespace OHOS { 94 namespace HiviewDFX { 95 96 REGISTER(XperfPlugin); 97 REGISTER_PUBLISHER(XperfPlugin); 98 DEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance"); 99 OnLoad()100 void XperfPlugin::OnLoad() 101 { 102 HIVIEW_LOGI("XperfPlugin::OnLoad"); 103 SetName(PLUGIN_NAME); 104 SetVersion(PLUGIN_VERSION); 105 NormalInit(); 106 HIVIEW_LOGI("Xperf Plugin Load Finish"); 107 } 108 OnUnload()109 void XperfPlugin::OnUnload() 110 { 111 HIVIEW_LOGI("Xperf Plugin OnUnload."); 112 } 113 OnEventListeningCallback(const Event & event)114 void XperfPlugin::OnEventListeningCallback(const Event &event) 115 { 116 HIVIEW_LOGD("Xperf Listening Event is %{public}s", (event.eventName_).c_str()); 117 if (event.messageType_ != Event::MessageType::SYS_EVENT) { 118 HIVIEW_LOGW("Event is not Sys event type"); 119 return; 120 } 121 Event& eventRef = const_cast<Event&>(event); 122 SysEvent& sysEvent = static_cast<SysEvent&>(eventRef); 123 XperfDispatch(sysEvent); 124 } 125 AddAppEventHandler(std::shared_ptr<AppEventHandler> handler)126 void XperfPlugin::AddAppEventHandler(std::shared_ptr<AppEventHandler> handler) 127 { 128 this->appEventHandler = handler; 129 } 130 NormalInit()131 void XperfPlugin::NormalInit() 132 { 133 /* create context */ 134 perfContext = std::make_shared<NormalContext>(); 135 /* create monitors here */ 136 perfContext->CreateContext(); 137 /* register Observer */ 138 IEventObservable* eventObservable = perfContext->GetEventObservable(); 139 if (eventObservable != nullptr) { 140 eventObservable->RegObserver(this); 141 } else { 142 HIVIEW_LOGW("[XperfPlugin::OnLoad] eventObservable is null"); 143 } 144 } 145 XperfDispatch(const SysEvent & sysEvent)146 void XperfPlugin::XperfDispatch(const SysEvent& sysEvent) 147 { 148 try { 149 std::shared_ptr<XperfEvt> evt = EvtParser::FromHivewEvt(sysEvent); 150 DispatchToMonitor(evt->logId, evt); 151 } 152 catch (std::out_of_range& outEx) { 153 std::string logIdStr = std::string(sysEvent.domain_ + EvtParser::separator + sysEvent.eventName_); 154 HIVIEW_LOGW("event %{public}s not exist in logIdMap", logIdStr.c_str()); 155 } 156 catch (std::invalid_argument& logIdEx) { 157 HIVIEW_LOGW("dispatch exception: %{public}s", logIdEx.what()); 158 } 159 } 160 DispatchToMonitor(unsigned int logId,std::shared_ptr<XperfEvt> xperfEvt)161 void XperfPlugin::DispatchToMonitor(unsigned int logId, std::shared_ptr<XperfEvt> xperfEvt) 162 { 163 std::vector<IMonitor*> monitorVec; 164 try { 165 monitorVec = perfContext->GetMonitorsByLogID(logId); 166 } catch (const std::invalid_argument& ex) { 167 HIVIEW_LOGW("[XperfPlugin::DispatchToMonitor] no monitor register for %{public}d", logId); 168 return; 169 } 170 for (IMonitor* monitor : monitorVec) { 171 monitor->HandleEvt(xperfEvt); 172 } 173 } 174 PostAppStartEvent(const AppStartInfo & ase)175 void XperfPlugin::PostAppStartEvent(const AppStartInfo& ase) 176 { 177 if (appEventHandler != nullptr) { 178 AppEventHandler::AppLaunchInfo appLaunchInfo = EventObserverConverter::ConvertToAppStartInfo(ase); 179 HIVIEW_LOGD("[XperfPlugin::PostAppStartEvent] PostEvent begin"); 180 appEventHandler->PostEvent(appLaunchInfo); 181 HIVIEW_LOGD("[XperfPlugin::PostAppStartEvent] PostEvent end"); 182 } else { 183 HIVIEW_LOGW("[XperfPlugin::PostAppStartEvent] appEventHandler is null"); 184 } 185 } 186 PostScrollJankEvent(const ScrollJankInfo & sji)187 void XperfPlugin::PostScrollJankEvent(const ScrollJankInfo& sji) 188 { 189 if (appEventHandler != nullptr) { 190 ScrollJankEvtInfo scrollJankEvtInfo = EventObserverConverter::ConvertToScrollJankEvtInfo(sji); 191 HIVIEW_LOGD("[XperfPlugin::PostScrollJankEvent] PostEvent begin"); 192 appEventHandler->PostEvent(scrollJankEvtInfo); 193 HIVIEW_LOGD("[XperfPlugin::PostScrollJankEvent] PostEvent end"); 194 } else { 195 HIVIEW_LOGW("[XperfPlugin::PostScrollJankEvent] appEventHandler is null"); 196 } 197 } 198 199 } // HiviewDFX 200 } // OHOS