1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci#include "plugin_factory.h" 16020a203aSopenharmony_ci#include "app_event_publisher_factory.h" 17020a203aSopenharmony_ci#include "XperfPlugin.h" 18020a203aSopenharmony_ci#include "EvtParser.h" 19020a203aSopenharmony_ci#include "JlogId.h" 20020a203aSopenharmony_ci#include "EventObserverConverter.h" 21020a203aSopenharmony_ci#include "NormalContext.h" 22020a203aSopenharmony_ci#include "hiview_logger.h" 23020a203aSopenharmony_ci 24020a203aSopenharmony_cinamespace OHOS { 25020a203aSopenharmony_ci namespace HiviewDFX { 26020a203aSopenharmony_ci const std::string EvtParser::separator = ":"; 27020a203aSopenharmony_ci 28020a203aSopenharmony_ci const std::map<std::string, unsigned int> EvtParser::logIdMap = { 29020a203aSopenharmony_ci {"GRAPHIC:JANK_FRAME_SKIP", JLID_JANK_FRAME_SKIP}, 30020a203aSopenharmony_ci {"AAFWK:START_ABILITY", JLID_START_ABILITY}, 31020a203aSopenharmony_ci {"AAFWK:ABILITY_ONFOREGROUND", JLID_ABILITY_ONFOREGROUND}, 32020a203aSopenharmony_ci {"AAFWK:APP_FOREGROUND", JLID_APP_FOREGROUND}, 33020a203aSopenharmony_ci {"AAFWK:ABILITY_ONACTIVE", JLID_ABILITY_ONACTIVE}, 34020a203aSopenharmony_ci {"KERNEL_WAKEUP:LID_WAKEUP_END", JLID_LID_WAKEUP_END}, 35020a203aSopenharmony_ci {"LCD:LCD_POWER_OFF", JLID_LCD_POWER_OFF}, 36020a203aSopenharmony_ci {"AAFWK:TERMINATE_ABILITY", JLID_AAFWK_TERMINATE_ABILITY}, 37020a203aSopenharmony_ci {"AAFWK:APP_BACKGROUND", JLID_APP_BACKGROUND}, 38020a203aSopenharmony_ci {"AAFWK:ABILITY_ONBACKGROUND", JLID_ABILITY_ONBACKGROUND}, 39020a203aSopenharmony_ci {"AAFWK:APP_TERMINATE", JLID_APP_TERMINATE}, 40020a203aSopenharmony_ci {"AAFWK:APP_ATTACH", JLID_APP_ATTACH}, 41020a203aSopenharmony_ci {"GRAPHIC:RS_COMPOSITION_TIMEOUT", JLID_RS_COMPOSITION_TIMEOUT}, 42020a203aSopenharmony_ci {"KERNEL_WAKEUP:LID_WAKEUP_START", JLID_LID_WAKEUP_START}, 43020a203aSopenharmony_ci {"SCREENLOCK_APP:SCREENON_EVENT", JLID_SCREENON_EVENT}, 44020a203aSopenharmony_ci {"LCD:LCD_POWER_ON", JLID_LCD_POWER_ON}, 45020a203aSopenharmony_ci {"LCD:LCD_BACKLIGHT_ON", JLID_LCD_BACKLIGHT_ON}, 46020a203aSopenharmony_ci {"MULTIMODALINPUT:INPUT_POWER_DOWN", JLID_INPUT_POWER_DOWN}, 47020a203aSopenharmony_ci {"LCD:LCD_BACKLIGHT_OFF", JLID_LCD_BACKLIGHT_OFF}, 48020a203aSopenharmony_ci {"POWER:STATE", JLID_POWER_STATE}, 49020a203aSopenharmony_ci {"GRAPHIC:INTERACTION_RESPONSE_LATENCY", JLID_GRAPHIC_INTERACTION_RESPONSE_LATENCY}, 50020a203aSopenharmony_ci {"GRAPHIC:INTERACTION_COMPLETED_LATENCY", JLID_GRAPHIC_INTERACTION_COMPLETED_LATENCY}, 51020a203aSopenharmony_ci {"AAFWK:DRAWN_COMPLETED", JLID_AAFWK_DRAWN_COMPLETED}, 52020a203aSopenharmony_ci {"INIT:STARTUP_TIME", JLID_INIT_STARTUP_TIME}, 53020a203aSopenharmony_ci {"AAFWK:APP_STARTUP_TYPE", JLID_AAFWK_APP_STARTUP_TYPE}, 54020a203aSopenharmony_ci {"AAFWK:PROCESS_START", JLID_AAFWK_PROCESS_START}, 55020a203aSopenharmony_ci {"WINDOWMANAGER:START_WINDOW", JLID_WINDOWMANAGER_START_WINDOW}, 56020a203aSopenharmony_ci {"GRAPHIC:FIRST_FRAME_DRAWN", JLID_GRAPHIC_FIRST_FRAME_DRAWN}, 57020a203aSopenharmony_ci {"ACE:INTERACTION_COMPLETED_LATENCY", JLID_ACE_INTERACTION_COMPLETED_LATENCY}, 58020a203aSopenharmony_ci {"ACE:INTERACTION_APP_JANK", JLID_ACE_INTERACTION_APP_JANK}, 59020a203aSopenharmony_ci {"GRAPHIC:INTERACTION_RENDER_JANK", JLID_GRAPHIC_INTERACTION_RENDER_JANK}, 60020a203aSopenharmony_ci {"AAFWK:CLOSE_ABILITY", JLID_AAFWK_CLOSE_ABILITY}, 61020a203aSopenharmony_ci {"AAFWK:PROCESS_EXIT", JLID_AAFWK_PROCESS_EXIT}, 62020a203aSopenharmony_ci {"SCENE_BOARD_APP:SCENE_PANEL_ROTATION_END", JLID_SCENE_BOARD_APP_CONTAINER_ANIMATION_END}, 63020a203aSopenharmony_ci {"SCENE_BOARD_APP:SCREENUNLOCK_EVENT", JLID_BOARD_SCREENUNLOCK_EVENT}, 64020a203aSopenharmony_ci {"SCENE_BOARD_APP:CLICK_BUTTON_EVENT", JLID_BOARD_CLICK_BUTTON_EVENT}, 65020a203aSopenharmony_ci {"SCENE_BOARD_APP:START_UNLOCK", JLID_BOARD_START_UNLOCK}, 66020a203aSopenharmony_ci {"SCENE_BOARD_APP:UNLOCK_TO_GRID_ANIMATION_END", JLID_BOARD_UNLOCK_TO_GRID_ANIMATION_END}, 67020a203aSopenharmony_ci {"SCENE_BOARD_APP:UNLOCK_TO_DOCK_ANIMATION_END", JLID_BOARD_UNLOCK_TO_DOCK_ANIMATION_END}, 68020a203aSopenharmony_ci {"SCREEN_RECORDER:RECORDER_STOP", JLID_SCREEN_RECORDER_STOP}, 69020a203aSopenharmony_ci {"ACE:JANK_FRAME_APP", JLID_JANK_FRAME_APP}, 70020a203aSopenharmony_ci {"WINDOWMANAGER:FOCUS_WINDOW", JLID_WINDOWMANAGER_FOCUS_WINDOW}, 71020a203aSopenharmony_ci {"RSS:APP_ASSOCIATED_START", JLID_APP_ASSOCIATED_START}, 72020a203aSopenharmony_ci {"SCENE_BOARD_APP:SCREEN_ON_ANIMATION", JLID_SCENE_BOARD_APP_SCREEN_ON_ANIMATION}, 73020a203aSopenharmony_ci {"XGATE:XGATE_WIFI_CONNECT_START", JLID_XGATE_WIFI_CONNECT_START}, 74020a203aSopenharmony_ci {"XGATE:XGATE_WIFI_CONNECT_END", JLID_XGATE_WIFI_CONNECT_END}, 75020a203aSopenharmony_ci {"XGATE:XGATE_SPES_LOGIN_START", JLID_XGATE_SPES_LOGIN_START}, 76020a203aSopenharmony_ci {"XGATE:XGATE_SPES_LOGIN_END", JLID_XGATE_SPES_LOGIN_END}, 77020a203aSopenharmony_ci {"XGATE:XGATE_IACCESS_LOGIN_START", JLID_XGATE_IACCESS_LOGIN_START}, 78020a203aSopenharmony_ci {"XGATE:XGATE_IACCESS_LOGIN_END", JLID_XGATE_IACCESS_LOGIN_END}, 79020a203aSopenharmony_ci {"WINDOWMANAGER:FOLD_STATE_CHANGE_BEGIN", JLID_FOLD_STATE_CHANGE_BEGIN}, 80020a203aSopenharmony_ci {"PERFORMANCE:PERF_FACTORY_TEST_START", JLID_PERF_FACTORY_TEST_START}, 81020a203aSopenharmony_ci {"PERFORMANCE:PERF_FACTORY_TEST_STOP", JLID_PERF_FACTORY_TEST_STOP}, 82020a203aSopenharmony_ci {"PERFORMANCE:PERF_FACTORY_TEST_CLEAR", JLID_PERF_FACTORY_TEST_CLEAR}, 83020a203aSopenharmony_ci {"RSS:LIMIT_BOOST", JLID_LIMIT_BOOST}, 84020a203aSopenharmony_ci {"RSS:LIMIT_REQUEST", JLID_LIMIT_FREQUENCY}, 85020a203aSopenharmony_ci {"GRAPHIC:HGM_VOTER_INFO", JLID_LTPO_DYNAMICS_FRAME}, 86020a203aSopenharmony_ci {"GRAPHIC:SHADER_MALFUNCTION", JLID_SHADER_MALFUNCTION}, 87020a203aSopenharmony_ci {"GRAPHIC:SHADER_STATS", JLID_SHADER_STATS}, 88020a203aSopenharmony_ci {"WEBVIEW:PAGE_LOAD_TIME", JLID_WEBVIEW_PAGE_LOAD}, 89020a203aSopenharmony_ci {"WEBVIEW:DYNAMIC_FRAME_DROP_STATISTICS", JLID_WEBVIEW_DYNAMIC_FRAME_DROP}, 90020a203aSopenharmony_ci {"WEBVIEW:AUDIO_FRAME_DROP_STATISTICS", JLID_WEBVIEW_AUDIO_FRAME_DROP}, 91020a203aSopenharmony_ci {"WEBVIEW:VIDEO_FRAME_DROP_STATISTICS", JLID_WEBVIEW_VIDEO_FRAME_DROP}, 92020a203aSopenharmony_ci {"GRAPHIC:INTERACTION_HITCH_TIME_RATIO", JLID_GRAPHIC_INTERACTION_HITCH_TIME_RATIO} 93020a203aSopenharmony_ci }; 94020a203aSopenharmony_ci 95020a203aSopenharmony_ci REGISTER(XperfPlugin); 96020a203aSopenharmony_ci REGISTER_PUBLISHER(XperfPlugin); 97020a203aSopenharmony_ci DEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance"); 98020a203aSopenharmony_ci 99020a203aSopenharmony_ci void XperfPlugin::OnLoad() 100020a203aSopenharmony_ci { 101020a203aSopenharmony_ci HIVIEW_LOGI("XperfPlugin::OnLoad"); 102020a203aSopenharmony_ci SetName(PLUGIN_NAME); 103020a203aSopenharmony_ci SetVersion(PLUGIN_VERSION); 104020a203aSopenharmony_ci NormalInit(); 105020a203aSopenharmony_ci HIVIEW_LOGI("Xperf Plugin Load Finish"); 106020a203aSopenharmony_ci } 107020a203aSopenharmony_ci 108020a203aSopenharmony_ci void XperfPlugin::OnUnload() 109020a203aSopenharmony_ci { 110020a203aSopenharmony_ci HIVIEW_LOGI("Xperf Plugin OnUnload."); 111020a203aSopenharmony_ci } 112020a203aSopenharmony_ci 113020a203aSopenharmony_ci void XperfPlugin::OnEventListeningCallback(const Event &event) 114020a203aSopenharmony_ci { 115020a203aSopenharmony_ci HIVIEW_LOGD("Xperf Listening Event is %{public}s", (event.eventName_).c_str()); 116020a203aSopenharmony_ci if (event.messageType_ != Event::MessageType::SYS_EVENT) { 117020a203aSopenharmony_ci HIVIEW_LOGW("Event is not Sys event type"); 118020a203aSopenharmony_ci return; 119020a203aSopenharmony_ci } 120020a203aSopenharmony_ci Event& eventRef = const_cast<Event&>(event); 121020a203aSopenharmony_ci SysEvent& sysEvent = static_cast<SysEvent&>(eventRef); 122020a203aSopenharmony_ci XperfDispatch(sysEvent); 123020a203aSopenharmony_ci } 124020a203aSopenharmony_ci 125020a203aSopenharmony_ci void XperfPlugin::AddAppEventHandler(std::shared_ptr<AppEventHandler> handler) 126020a203aSopenharmony_ci { 127020a203aSopenharmony_ci this->appEventHandler = handler; 128020a203aSopenharmony_ci } 129020a203aSopenharmony_ci 130020a203aSopenharmony_ci void XperfPlugin::NormalInit() 131020a203aSopenharmony_ci { 132020a203aSopenharmony_ci /* create context */ 133020a203aSopenharmony_ci perfContext = std::make_shared<NormalContext>(); 134020a203aSopenharmony_ci /* create monitors here */ 135020a203aSopenharmony_ci perfContext->CreateContext(); 136020a203aSopenharmony_ci /* register Observer */ 137020a203aSopenharmony_ci IEventObservable* eventObservable = perfContext->GetEventObservable(); 138020a203aSopenharmony_ci if (eventObservable != nullptr) { 139020a203aSopenharmony_ci eventObservable->RegObserver(this); 140020a203aSopenharmony_ci } else { 141020a203aSopenharmony_ci HIVIEW_LOGW("[XperfPlugin::OnLoad] eventObservable is null"); 142020a203aSopenharmony_ci } 143020a203aSopenharmony_ci } 144020a203aSopenharmony_ci 145020a203aSopenharmony_ci void XperfPlugin::XperfDispatch(const SysEvent& sysEvent) 146020a203aSopenharmony_ci { 147020a203aSopenharmony_ci try { 148020a203aSopenharmony_ci std::shared_ptr<XperfEvt> evt = EvtParser::FromHivewEvt(sysEvent); 149020a203aSopenharmony_ci DispatchToMonitor(evt->logId, evt); 150020a203aSopenharmony_ci } 151020a203aSopenharmony_ci catch (std::out_of_range& outEx) { 152020a203aSopenharmony_ci std::string logIdStr = std::string(sysEvent.domain_ + EvtParser::separator + sysEvent.eventName_); 153020a203aSopenharmony_ci HIVIEW_LOGW("event %{public}s not exist in logIdMap", logIdStr.c_str()); 154020a203aSopenharmony_ci } 155020a203aSopenharmony_ci catch (std::invalid_argument& logIdEx) { 156020a203aSopenharmony_ci HIVIEW_LOGW("dispatch exception: %{public}s", logIdEx.what()); 157020a203aSopenharmony_ci } 158020a203aSopenharmony_ci } 159020a203aSopenharmony_ci 160020a203aSopenharmony_ci void XperfPlugin::DispatchToMonitor(unsigned int logId, std::shared_ptr<XperfEvt> xperfEvt) 161020a203aSopenharmony_ci { 162020a203aSopenharmony_ci std::vector<IMonitor*> monitorVec; 163020a203aSopenharmony_ci try { 164020a203aSopenharmony_ci monitorVec = perfContext->GetMonitorsByLogID(logId); 165020a203aSopenharmony_ci } catch (const std::invalid_argument& ex) { 166020a203aSopenharmony_ci HIVIEW_LOGW("[XperfPlugin::DispatchToMonitor] no monitor register for %{public}d", logId); 167020a203aSopenharmony_ci return; 168020a203aSopenharmony_ci } 169020a203aSopenharmony_ci for (IMonitor* monitor : monitorVec) { 170020a203aSopenharmony_ci monitor->HandleEvt(xperfEvt); 171020a203aSopenharmony_ci } 172020a203aSopenharmony_ci } 173020a203aSopenharmony_ci 174020a203aSopenharmony_ci void XperfPlugin::PostAppStartEvent(const AppStartInfo& ase) 175020a203aSopenharmony_ci { 176020a203aSopenharmony_ci if (appEventHandler != nullptr) { 177020a203aSopenharmony_ci AppEventHandler::AppLaunchInfo appLaunchInfo = EventObserverConverter::ConvertToAppStartInfo(ase); 178020a203aSopenharmony_ci HIVIEW_LOGD("[XperfPlugin::PostAppStartEvent] PostEvent begin"); 179020a203aSopenharmony_ci appEventHandler->PostEvent(appLaunchInfo); 180020a203aSopenharmony_ci HIVIEW_LOGD("[XperfPlugin::PostAppStartEvent] PostEvent end"); 181020a203aSopenharmony_ci } else { 182020a203aSopenharmony_ci HIVIEW_LOGW("[XperfPlugin::PostAppStartEvent] appEventHandler is null"); 183020a203aSopenharmony_ci } 184020a203aSopenharmony_ci } 185020a203aSopenharmony_ci 186020a203aSopenharmony_ci void XperfPlugin::PostScrollJankEvent(const ScrollJankInfo& sji) 187020a203aSopenharmony_ci { 188020a203aSopenharmony_ci if (appEventHandler != nullptr) { 189020a203aSopenharmony_ci ScrollJankEvtInfo scrollJankEvtInfo = EventObserverConverter::ConvertToScrollJankEvtInfo(sji); 190020a203aSopenharmony_ci HIVIEW_LOGD("[XperfPlugin::PostScrollJankEvent] PostEvent begin"); 191020a203aSopenharmony_ci appEventHandler->PostEvent(scrollJankEvtInfo); 192020a203aSopenharmony_ci HIVIEW_LOGD("[XperfPlugin::PostScrollJankEvent] PostEvent end"); 193020a203aSopenharmony_ci } else { 194020a203aSopenharmony_ci HIVIEW_LOGW("[XperfPlugin::PostScrollJankEvent] appEventHandler is null"); 195020a203aSopenharmony_ci } 196020a203aSopenharmony_ci } 197020a203aSopenharmony_ci 198020a203aSopenharmony_ci } // HiviewDFX 199020a203aSopenharmony_ci} // OHOS