• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 
16 #ifdef RESSCHED_RESOURCESCHEDULE_SOC_PERF_ENABLE
17 #include "socperf_plugin.h"
18 #include "app_mgr_constants.h"
19 #include "config_info.h"
20 #include "plugin_mgr.h"
21 #include "res_type.h"
22 #include "socperf_log.h"
23 
24 namespace OHOS {
25 namespace ResourceSchedule {
26 using namespace ResType;
27 namespace {
28     const std::string LIB_NAME = "libsocperf_plugin.z.so";
29     const std::string PLUGIN_NAME = "SOCPERF";
30     const std::string CONFIG_NAME_SOCPERF_FEATURE_SWITCH = "socperfFeatureSwitch";
31     const std::string SUB_ITEM_KEY_NAME_SOCPERF_ON_DEMAND = "socperf_on_demand";
32     const int32_t PERF_REQUEST_CMD_ID_APP_START             = 10000;
33     const int32_t PERF_REQUEST_CMD_ID_WARM_START            = 10001;
34     const int32_t PERF_REQUEST_CMD_ID_WINDOW_SWITCH         = 10002;
35     const int32_t PERF_REQUEST_CMD_ID_EVENT_CLICK           = 10006;
36     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_START       = 10007;
37     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE           = 10008;
38     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER      = 10009;
39     const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH           = 10010;
40     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE    = 10011;
41     const int32_t PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE     = 10012;
42     const int32_t PERF_REQUEST_CMD_ID_POP_PAGE              = 10016;
43     const int32_t PERF_REQUEST_CMD_ID_RESIZE_WINDOW         = 10018;
44     const int32_t PERF_REQUEST_CMD_ID_MOVE_WINDOW           = 10019;
45     const int32_t PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE      = 10020;
46     const int32_t PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL      = 10025;
47     const int32_t PERF_REQUEST_CMD_ID_REMOTE_ANIMATION      = 10030;
48     const int32_t PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR       = 10034;
49     const int32_t PERF_REQUEST_CMD_ID_LOAD_URL              = 10070;
50     const int32_t PERF_REQUEST_CMD_ID_MOUSEWHEEL            = 10071;
51 }
IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)52 IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)
53 
54 void SocPerfPlugin::Init()
55 {
56     InitFunctionMap();
57     InitResTypes();
58     for (auto resType : resTypes) {
59         PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);
60     }
61     SOC_PERF_LOGI("SocPerfPlugin::Init success");
62 }
63 
InitFunctionMap()64 void SocPerfPlugin::InitFunctionMap()
65 {
66     functionMap = {
67         { RES_TYPE_WINDOW_FOCUS,
68             [this](const std::shared_ptr<ResData>& data) { HandleWindowFocus(data); } },
69         { RES_TYPE_CLICK_RECOGNIZE,
70             [this](const std::shared_ptr<ResData>& data) { HandleEventClick(data); } },
71         { RES_TYPE_LOAD_PAGE,
72             [this](const std::shared_ptr<ResData>& data) { HandleLoadPage(data); } },
73         { RES_TYPE_SLIDE_RECOGNIZE,
74             [this](const std::shared_ptr<ResData>& data) { HandleEventSlide(data); } },
75         { RES_TYPE_WEB_GESTURE,
76             [this](const std::shared_ptr<ResData>& data) { HandleEventWebGesture(data); } },
77         { RES_TYPE_POP_PAGE,
78             [this](const std::shared_ptr<ResData>& data) { HandlePopPage(data); } },
79         { RES_TYPE_APP_ABILITY_START,
80             [this](const std::shared_ptr<ResData>& data) { HandleAppAbilityStart(data); } },
81         { RES_TYPE_RESIZE_WINDOW,
82             [this](const std::shared_ptr<ResData>& data) { HandleResizeWindow(data); } },
83         { RES_TYPE_MOVE_WINDOW,
84             [this](const std::shared_ptr<ResData>& data) { HandleMoveWindow(data); } },
85         { RES_TYPE_SHOW_REMOTE_ANIMATION,
86                 [this](const std::shared_ptr<ResData>& data) { HandleRemoteAnimation(data); } },
87         { RES_TYPE_DRAG_STATUS_BAR,
88             [this](const std::shared_ptr<ResData>& data) { HandleDragStatusBar(data); } },
89         { RES_TYPE_WEB_GESTURE_MOVE,
90             [this](const std::shared_ptr<ResData>& data) { HandleWebGestureMove(data); } },
91         { RES_TYPE_WEB_SLIDE_NORMAL,
92             [this](const std::shared_ptr<ResData>& data) { HandleWebSlideNormal(data); } },
93         { RES_TYPE_LOAD_URL,
94             [this](const std::shared_ptr<ResData>& data) { HandleLoadUrl(data); } },
95         { RES_TYPE_MOUSEWHEEL,
96             [this](const std::shared_ptr<ResData>& data) { HandleMousewheel(data); } },
97         { RES_TYPE_APP_STATE_CHANGE,
98             [this](const std::shared_ptr<ResData>& data) { HandleAppStateChange(data); } },
99     };
100 }
101 
InitResTypes()102 void SocPerfPlugin::InitResTypes()
103 {
104     resTypes = {
105         RES_TYPE_WINDOW_FOCUS,
106         RES_TYPE_CLICK_RECOGNIZE,
107         RES_TYPE_LOAD_PAGE,
108         RES_TYPE_SLIDE_RECOGNIZE,
109         RES_TYPE_WEB_GESTURE,
110         RES_TYPE_POP_PAGE,
111         RES_TYPE_APP_ABILITY_START,
112         RES_TYPE_RESIZE_WINDOW,
113         RES_TYPE_MOVE_WINDOW,
114         RES_TYPE_SHOW_REMOTE_ANIMATION,
115         RES_TYPE_DRAG_STATUS_BAR,
116         RES_TYPE_WEB_GESTURE_MOVE,
117         RES_TYPE_WEB_SLIDE_NORMAL,
118         RES_TYPE_LOAD_URL,
119         RES_TYPE_MOUSEWHEEL,
120         RES_TYPE_APP_STATE_CHANGE,
121     };
122 }
123 
Disable()124 void SocPerfPlugin::Disable()
125 {
126     functionMap.clear();
127     for (auto resType : resTypes) {
128         PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);
129     }
130     resTypes.clear();
131     SOC_PERF_LOGI("SocPerfPlugin::Disable success");
132 }
133 
DispatchResource(const std::shared_ptr<ResData> & data)134 void SocPerfPlugin::DispatchResource(const std::shared_ptr<ResData>& data)
135 {
136     auto funcIter = functionMap.find(data->resType);
137     if (funcIter != functionMap.end()) {
138         auto function = funcIter->second;
139         if (function) {
140             function(data);
141         }
142     }
143 }
144 
InitFeatureSwitch(std::string featureName)145 bool SocPerfPlugin::InitFeatureSwitch(std::string featureName)
146 {
147     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_FEATURE_SWITCH);
148     for (const Item& item : itemLists.itemList) {
149         for (SubItem sub : item.subItemList) {
150             if (sub.name == featureName) {
151                 return sub.value == "1";
152             }
153         }
154     }
155     return false;
156 }
157 
HandleAppAbilityStart(const std::shared_ptr<ResData> & data)158 void SocPerfPlugin::HandleAppAbilityStart(const std::shared_ptr<ResData>& data)
159 {
160     if (data->value == AppStartType::APP_COLD_START) {
161         SOC_PERF_LOGI("SocPerfPlugin: socperf->APP_COLD_START");
162         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
163     } else if (data->value == AppStartType::APP_WARM_START) {
164         SOC_PERF_LOGI("SocPerfPlugin: socperf->APP_WARM_START");
165         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WARM_START, "");
166     }
167 }
168 
HandleWindowFocus(const std::shared_ptr<ResData> & data)169 void SocPerfPlugin::HandleWindowFocus(const std::shared_ptr<ResData>& data)
170 {
171     if (data->value == WindowFocusStatus::WINDOW_FOCUS) {
172         SOC_PERF_LOGI("SocPerfPlugin: socperf->WINDOW_SWITCH");
173         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WINDOW_SWITCH, "");
174     }
175 }
176 
HandleEventClick(const std::shared_ptr<ResData> & data)177 void SocPerfPlugin::HandleEventClick(const std::shared_ptr<ResData>& data)
178 {
179     SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_CLICK: %{public}lld", (long long)data->value);
180     if (data->value == ClickEventType::TOUCH_EVENT) {
181         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH, "");
182     } else if (data->value == ClickEventType::CLICK_EVENT) {
183         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_CLICK, "");
184     }
185 }
186 
HandleLoadPage(const std::shared_ptr<ResData> & data)187 void SocPerfPlugin::HandleLoadPage(const std::shared_ptr<ResData>& data)
188 {
189     if (data->value == LOAD_PAGE_START) {
190         SOC_PERF_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_START");
191         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, true, "");
192     } else if (data->value == LOAD_PAGE_COMPLETE) {
193         SOC_PERF_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_COMPLETE");
194         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, false, "");
195         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE, "");
196     }
197 }
198 
HandlePopPage(const std::shared_ptr<ResData> & data)199 void SocPerfPlugin::HandlePopPage(const std::shared_ptr<ResData>& data)
200 {
201     SOC_PERF_LOGI("SocPerfPlugin: socperf->POP_PAGE: %{public}lld", (long long)data->value);
202     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POP_PAGE, "");
203 }
204 
HandleEventSlide(const std::shared_ptr<ResData> & data)205 void SocPerfPlugin::HandleEventSlide(const std::shared_ptr<ResData>& data)
206 {
207     SOC_PERF_LOGI("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
208     if (data->value == SlideEventStatus::SLIDE_EVENT_ON) {
209         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, true, "");
210     } else if (data->value == SlideEventStatus::SLIDE_EVENT_OFF) {
211         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, false, "");
212     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_BEGIN) {
213         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, "");
214     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_END) {
215         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, false, "");
216     }
217 }
218 
HandleEventWebGesture(const std::shared_ptr<ResData> & data)219 void SocPerfPlugin::HandleEventWebGesture(const std::shared_ptr<ResData>& data)
220 {
221     if (data == nullptr) {
222         return;
223     }
224     SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_GESTURE: %{public}lld", (long long)data->value);
225     if (data->value == WebGesture::WEB_GESTURE_START) {
226         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, true, "");
227     } else if (data->value == WebGesture::WEB_GESTURE_END) {
228         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, false, "");
229     }
230 }
231 
HandleResizeWindow(const std::shared_ptr<ResData> & data)232 void SocPerfPlugin::HandleResizeWindow(const std::shared_ptr<ResData>& data)
233 {
234     if (data == nullptr) {
235         return;
236     }
237     SOC_PERF_LOGI("SocPerfPlugin: socperf->RESIZE_WINDOW: %{public}lld", (long long)data->value);
238     if (data->value == WindowResizeType::WINDOW_RESIZING) {
239         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, "");
240     } else if (data->value == WindowResizeType::WINDOW_RESIZE_STOP) {
241         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, false, "");
242     }
243 }
244 
HandleMoveWindow(const std::shared_ptr<ResData> & data)245 void SocPerfPlugin::HandleMoveWindow(const std::shared_ptr<ResData>& data)
246 {
247     if (data == nullptr) {
248         return;
249     }
250     SOC_PERF_LOGI("SocPerfPlugin: socperf->MOVE_WINDOW: %{public}lld", (long long)data->value);
251     if (data->value == WindowMoveType::WINDOW_MOVING) {
252         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOVE_WINDOW, "");
253     } else if (data->value == WindowMoveType::WINDOW_MOVE_STOP) {
254         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_WINDOW, false, "");
255     }
256 }
257 
HandleRemoteAnimation(const std::shared_ptr<ResData> & data)258 void SocPerfPlugin::HandleRemoteAnimation(const std::shared_ptr<ResData>& data)
259 {
260     if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
261         SOC_PERF_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
262         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
263     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
264         SOC_PERF_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
265         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
266     }
267 }
268 
HandleDragStatusBar(const std::shared_ptr<ResData> & data)269 void SocPerfPlugin::HandleDragStatusBar(const std::shared_ptr<ResData>& data)
270 {
271     if (data == nullptr) {
272         return;
273     }
274     SOC_PERF_LOGI("SocPerfPlugin: socperf->DRAG_STATUS_BAR: %{public}lld", (long long)data->value);
275     if (data->value == StatusBarDragStatus::DRAG_START) {
276         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, "");
277     } else if (data->value == StatusBarDragStatus::DRAG_END) {
278         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, false, "");
279     }
280 }
281 
HandleWebGestureMove(const std::shared_ptr<ResData> & data)282 void SocPerfPlugin::HandleWebGestureMove(const std::shared_ptr<ResData>& data)
283 {
284     if (data == nullptr) {
285         return;
286     }
287     SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_GESTURE_MOVE: %{public}lld", (long long)data->value);
288     if (data->value == WebGestureMove::WEB_GESTURE_MOVE_START) {
289         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, true, "");
290     } else if (data->value == WebGestureMove::WEB_GESTURE_MOVE_END) {
291         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, false, "");
292     }
293 }
294 
HandleWebSlideNormal(const std::shared_ptr<ResData> & data)295 void SocPerfPlugin::HandleWebSlideNormal(const std::shared_ptr<ResData>& data)
296 {
297     if (data == nullptr) {
298         return;
299     }
300     SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_SLIDE_NORMAL: %{public}lld", (long long)data->value);
301     if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_START) {
302         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, true, "");
303     } else if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_END) {
304         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, false, "");
305     }
306 }
307 
HandleLoadUrl(const std::shared_ptr<ResData> & data)308 void SocPerfPlugin::HandleLoadUrl(const std::shared_ptr<ResData>& data)
309 {
310     SOC_PERF_LOGI("SocPerfPlugin: socperf->LOAD_URL");
311     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_URL, "");
312 }
313 
HandleMousewheel(const std::shared_ptr<ResData> & data)314 void SocPerfPlugin::HandleMousewheel(const std::shared_ptr<ResData>& data)
315 {
316     SOC_PERF_LOGI("SocPerfPlugin: socperf->MOUSEWHEEL");
317     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOUSEWHEEL, "");
318 }
319 
HandleAppStateChange(const std::shared_ptr<ResData> & data)320 void SocPerfPlugin::HandleAppStateChange(const std::shared_ptr<ResData>& data)
321 {
322     if (data->value == ResType::ProcessStatus::PROCESS_CREATED) {
323         SOC_PERF_LOGI("SocPerfPlugin: socperf->APPSTATECHANGE");
324         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
325     }
326 }
327 
OnPluginInit(std::string & libName)328 extern "C" bool OnPluginInit(std::string& libName)
329 {
330     if (libName != LIB_NAME) {
331         SOC_PERF_LOGE("SocPerfPlugin::OnPluginInit lib name is not match");
332         return false;
333     }
334     SocPerfPlugin::GetInstance().Init();
335     return true;
336 }
337 
OnPluginDisable()338 extern "C" void OnPluginDisable()
339 {
340     SocPerfPlugin::GetInstance().Disable();
341 }
342 
OnDispatchResource(const std::shared_ptr<ResData> & data)343 extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
344 {
345     SocPerfPlugin::GetInstance().DispatchResource(data);
346 }
347 } // namespace ResourceSchedule
348 } // namespace OHOS
349 #endif // RESSCHED_RESOURCESCHEDULE_SOC_PERF_ENABLE