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