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