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