1 /*
2 * Copyright (c) 2022-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
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 "dlfcn.h"
21 #include "fcntl.h"
22 #include "plugin_mgr.h"
23 #include "res_type.h"
24 #include "socperf_log.h"
25
26 namespace OHOS {
27 namespace ResourceSchedule {
28 using namespace ResType;
29 namespace {
30 const std::string LIB_NAME = "libsocperf_plugin.z.so";
31 const std::string PLUGIN_NAME = "SOCPERF";
32 const std::string CONFIG_NAME_SOCPERF_FEATURE_SWITCH = "socperfFeatureSwitch";
33 const std::string CONFIG_NAME_SOCPERF_EVENT_ID = "socperfEventId";
34 const std::string SUB_ITEM_KEY_NAME_SOCPERF_ON_DEMAND = "socperf_on_demand";
35 const std::string CNOFIG_NAME_SOCPERF_CRUCIAL_FUNC = "socperfCrucialFunc";
36 const std::string SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_PATH = "socperf_req_apptype_path";
37 const std::string SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_FUNC = "socperf_req_apptype_func";
38 const std::string BUNDLE_NAME = "bundleName";
39 const std::string SOCPERF_TYPE_ID = "socperf_type_id";
40 const std::string SOCPERF_TYPE_RGM = "socperf_type_rgm";
41 const std::string EXTENSION_TYPE_KEY = "extensionType";
42 const std::string DEVICE_MODE_PAYMODE_NAME = "deviceMode";
43 const int32_t INVALID_VALUE = -1;
44 const int32_t APP_TYPE_GAME = 2;
45 const int64_t TIME_INTERVAL = 5000;
46 const int32_t PERF_REQUEST_CMD_ID_RGM_BOOTING_START = 1000;
47 const int32_t PERF_REQUEST_CMD_ID_APP_START = 10000;
48 const int32_t PERF_REQUEST_CMD_ID_WARM_START = 10001;
49 const int32_t PERF_REQUEST_CMD_ID_WINDOW_SWITCH = 10002;
50 const int32_t PERF_REQUEST_CMD_ID_EVENT_CLICK = 10006;
51 const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_START = 10007;
52 const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE = 10008;
53 const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER = 10009;
54 const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN = 10010;
55 const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE = 10011;
56 const int32_t PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE = 10012;
57 const int32_t PERF_REQUEST_CMD_ID_POP_PAGE = 10016;
58 const int32_t PERF_REQUEST_CMD_ID_RESIZE_WINDOW = 10018;
59 const int32_t PERF_REQUEST_CMD_ID_MOVE_WINDOW = 10019;
60 const int32_t PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE = 10020;
61 const int32_t PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL = 10025;
62 const int32_t PERF_REQUEST_CMD_ID_ROTATION = 10027;
63 const int32_t PERF_REQUEST_CMD_ID_REMOTE_ANIMATION = 10030;
64 const int32_t PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR = 10034;
65 const int32_t PERF_REQUEST_CMD_ID_GAME_START = 10036;
66 const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH_UP = 10040;
67 const int32_t PERF_REQUEST_CMD_ID_REMOTE_UNLOCK = 10041;
68 const int32_t PERF_REQUEST_CMD_ID_ACCOUNT_ACTIVATING = 10043;
69 const int32_t PERF_REQUEST_CMD_ID_LOAD_URL = 10070;
70 const int32_t PERF_REQUEST_CMD_ID_MOUSEWHEEL = 10071;
71 const int32_t PERF_REQUEST_CMD_ID_WEB_DRAG_RESIZE = 10073;
72 const int32_t PERF_REQUEST_CMD_ID_BMM_MONITER_START = 10081;
73 }
IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)74 IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)
75
76 void SocPerfPlugin::Init()
77 {
78 InitEventId();
79 InitResTypes();
80 InitFunctionMap();
81 for (auto resType : resTypes) {
82 PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);
83 }
84 InitPerfCrucialSo();
85 SOC_PERF_LOGI("SocPerfPlugin::Init success");
86 }
87
InitPerfCrucialSo()88 void SocPerfPlugin::InitPerfCrucialSo()
89 {
90 PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CNOFIG_NAME_SOCPERF_CRUCIAL_FUNC);
91 for (const Item& item : itemLists.itemList) {
92 for (SubItem sub : item.subItemList) {
93 if (sub.name == SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_PATH) {
94 perfReqAppTypeSoPath_ = sub.value;
95 }
96 if (sub.name == SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_FUNC) {
97 perfReqAppTypeSoFunc_ = sub.value;
98 }
99 }
100 }
101
102 if (!perfReqAppTypeSoPath_.empty() && !perfReqAppTypeSoFunc_.empty()) {
103 InitPerfCrucialFunc(perfReqAppTypeSoPath_.c_str(), perfReqAppTypeSoFunc_.c_str());
104 }
105 }
106
InitPerfCrucialFunc(const char * perfSoPath,const char * perfSoFunc)107 void SocPerfPlugin::InitPerfCrucialFunc(const char* perfSoPath, const char* perfSoFunc)
108 {
109 if (!perfSoPath || !perfSoFunc) {
110 return;
111 }
112 handle_ = dlopen(perfSoPath, RTLD_NOW);
113 if (!handle_) {
114 SOC_PERF_LOGE("perf so doesn't exist");
115 return;
116 }
117
118 reqAppTypeFunc_ = reinterpret_cast<ReqAppTypeFunc>(dlsym(handle_, perfSoFunc));
119 if (!reqAppTypeFunc_) {
120 SOC_PERF_LOGE("perf func req app type doesn't exist");
121 dlclose(handle_);
122 handle_ = nullptr;
123 }
124 }
125
InitEventId()126 void SocPerfPlugin::InitEventId()
127 {
128 PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_EVENT_ID);
129 for (const Item& item : itemLists.itemList) {
130 for (SubItem sub : item.subItemList) {
131 if (sub.name == SOCPERF_TYPE_ID) {
132 RES_TYPE_SCENE_BOARD_ID = atoi(sub.value.c_str());
133 } else if (sub.name == SOCPERF_TYPE_RGM) {
134 RES_TYPE_RGM_BOOTING_STATUS = atoi(sub.value.c_str());
135 }
136 }
137 }
138 }
139
InitFunctionMap()140 void SocPerfPlugin::InitFunctionMap()
141 {
142 functionMap = {
143 { RES_TYPE_WINDOW_FOCUS,
144 [this](const std::shared_ptr<ResData>& data) { HandleWindowFocus(data); } },
145 { RES_TYPE_CLICK_RECOGNIZE,
146 [this](const std::shared_ptr<ResData>& data) { HandleEventClick(data); } },
147 { RES_TYPE_LOAD_PAGE,
148 [this](const std::shared_ptr<ResData>& data) { HandleLoadPage(data); } },
149 { RES_TYPE_SLIDE_RECOGNIZE,
150 [this](const std::shared_ptr<ResData>& data) { HandleEventSlide(data); } },
151 { RES_TYPE_WEB_GESTURE,
152 [this](const std::shared_ptr<ResData>& data) { HandleEventWebGesture(data); } },
153 { RES_TYPE_POP_PAGE,
154 [this](const std::shared_ptr<ResData>& data) { HandlePopPage(data); } },
155 { RES_TYPE_APP_ABILITY_START,
156 [this](const std::shared_ptr<ResData>& data) { HandleAppAbilityStart(data); } },
157 { RES_TYPE_RESIZE_WINDOW,
158 [this](const std::shared_ptr<ResData>& data) { HandleResizeWindow(data); } },
159 { RES_TYPE_MOVE_WINDOW,
160 [this](const std::shared_ptr<ResData>& data) { HandleMoveWindow(data); } },
161 { RES_TYPE_SHOW_REMOTE_ANIMATION,
162 [this](const std::shared_ptr<ResData>& data) { HandleRemoteAnimation(data); } },
163 { RES_TYPE_DRAG_STATUS_BAR,
164 [this](const std::shared_ptr<ResData>& data) { HandleDragStatusBar(data); } },
165 { RES_TYPE_WEB_GESTURE_MOVE,
166 [this](const std::shared_ptr<ResData>& data) { HandleWebGestureMove(data); } },
167 { RES_TYPE_WEB_SLIDE_NORMAL,
168 [this](const std::shared_ptr<ResData>& data) { HandleWebSlideNormal(data); } },
169 { RES_TYPE_LOAD_URL,
170 [this](const std::shared_ptr<ResData>& data) { HandleLoadUrl(data); } },
171 { RES_TYPE_MOUSEWHEEL,
172 [this](const std::shared_ptr<ResData>& data) { HandleMousewheel(data); } },
173 { RES_TYPE_APP_STATE_CHANGE,
174 [this](const std::shared_ptr<ResData>& data) { HandleAppStateChange(data); } },
175 { RES_TYPE_DEVICE_MODE_STATUS,
176 [this](const std::shared_ptr<ResData>& data) { HandleDeviceModeStatusChange(data); } },
177 { RES_TYPE_ACCOUNT_ACTIVATING,
178 [this](const std::shared_ptr<ResData>& data) { HandleSocperfAccountActivating(data); } },
179 { RES_TYPE_ANCO_CUST,
180 [this](const std::shared_ptr<ResData>& data) { HandleCustEvent(data); } },
181 { RES_TYPE_SOCPERF_CUST_EVENT_BEGIN,
182 [this](const std::shared_ptr<ResData>& data) { HandleCustEventBegin(data); } },
183 { RES_TYPE_SOCPERF_CUST_EVENT_END,
184 [this](const std::shared_ptr<ResData>& data) { HandleCustEventEnd(data); } },
185 };
186 AddEventToFunctionMap();
187 }
188
AddEventToFunctionMap()189 void SocPerfPlugin::AddEventToFunctionMap()
190 {
191 functionMap.insert(std::make_pair(RES_TYPE_ONLY_PERF_APP_COLD_START,
192 [this](const std::shared_ptr<ResData>& data) { HandleAppColdStartEx(data); }));
193 functionMap.insert(std::make_pair(RES_TYPE_SCENE_ROTATION,
194 [this](const std::shared_ptr<ResData>& data) { HandleSceneRotation(data); }));
195 functionMap.insert(std::make_pair(RES_TYPE_BMM_MONITER_CHANGE_EVENT,
196 [this](const std::shared_ptr<ResData>& data) { HandleBmmMoniterStatus(data); }));
197 if (RES_TYPE_SCENE_BOARD_ID != 0) {
198 functionMap.insert(std::make_pair(RES_TYPE_SCENE_BOARD_ID,
199 [this](const std::shared_ptr<ResData>& data) { HandleSocperfSceneBoard(data); }));
200 }
201 if (RES_TYPE_RGM_BOOTING_STATUS != 0) {
202 functionMap.insert(std::make_pair(RES_TYPE_RGM_BOOTING_STATUS,
203 [this](const std::shared_ptr<ResData>& data) { HandleRgmBootingStatus(data); }));
204 }
205 }
206
InitResTypes()207 void SocPerfPlugin::InitResTypes()
208 {
209 resTypes = {
210 RES_TYPE_WINDOW_FOCUS,
211 RES_TYPE_CLICK_RECOGNIZE,
212 RES_TYPE_LOAD_PAGE,
213 RES_TYPE_SLIDE_RECOGNIZE,
214 RES_TYPE_WEB_GESTURE,
215 RES_TYPE_POP_PAGE,
216 RES_TYPE_APP_ABILITY_START,
217 RES_TYPE_RESIZE_WINDOW,
218 RES_TYPE_MOVE_WINDOW,
219 RES_TYPE_SHOW_REMOTE_ANIMATION,
220 RES_TYPE_DRAG_STATUS_BAR,
221 RES_TYPE_WEB_GESTURE_MOVE,
222 RES_TYPE_WEB_SLIDE_NORMAL,
223 RES_TYPE_LOAD_URL,
224 RES_TYPE_MOUSEWHEEL,
225 RES_TYPE_APP_STATE_CHANGE,
226 RES_TYPE_DEVICE_MODE_STATUS,
227 RES_TYPE_ACCOUNT_ACTIVATING,
228 RES_TYPE_ANCO_CUST,
229 RES_TYPE_SOCPERF_CUST_EVENT_BEGIN,
230 RES_TYPE_SOCPERF_CUST_EVENT_END,
231 RES_TYPE_ONLY_PERF_APP_COLD_START,
232 RES_TYPE_SCENE_ROTATION,
233 RES_TYPE_BMM_MONITER_CHANGE_EVENT,
234 };
235 if (RES_TYPE_SCENE_BOARD_ID != 0) {
236 resTypes.insert(RES_TYPE_SCENE_BOARD_ID);
237 }
238 if (RES_TYPE_RGM_BOOTING_STATUS != 0) {
239 resTypes.insert(RES_TYPE_RGM_BOOTING_STATUS);
240 }
241 }
242
Disable()243 void SocPerfPlugin::Disable()
244 {
245 functionMap.clear();
246 for (auto resType : resTypes) {
247 PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);
248 }
249 resTypes.clear();
250 if (handle_ != nullptr) {
251 dlclose(handle_);
252 handle_ = nullptr;
253 }
254 SOC_PERF_LOGI("SocPerfPlugin::Disable success");
255 }
256
DispatchResource(const std::shared_ptr<ResData> & data)257 void SocPerfPlugin::DispatchResource(const std::shared_ptr<ResData>& data)
258 {
259 auto funcIter = functionMap.find(data->resType);
260 if (funcIter != functionMap.end()) {
261 auto function = funcIter->second;
262 if (function) {
263 function(data);
264 }
265 }
266 }
267
InitFeatureSwitch(std::string featureName)268 bool SocPerfPlugin::InitFeatureSwitch(std::string featureName)
269 {
270 PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_FEATURE_SWITCH);
271 for (const Item& item : itemLists.itemList) {
272 for (SubItem sub : item.subItemList) {
273 if (sub.name == featureName) {
274 return sub.value == "1";
275 }
276 }
277 }
278 return false;
279 }
280
ParsePayload(const std::shared_ptr<ResData> & data,const std::string & key)281 static int32_t ParsePayload(const std::shared_ptr<ResData>& data, const std::string& key)
282 {
283 if (!data->payload.contains(key)) {
284 return INVALID_VALUE;
285 }
286 if (data->payload.at(key).is_string()) {
287 return atoi(data->payload[key].get<std::string>().c_str());
288 }
289 if (data->payload.at(key).is_number_integer()) {
290 return data->payload[key].get<int32_t>();
291 }
292 return INVALID_VALUE;
293 }
294
HandleAppAbilityStart(const std::shared_ptr<ResData> & data)295 void SocPerfPlugin::HandleAppAbilityStart(const std::shared_ptr<ResData>& data)
296 {
297 if (data->value == AppStartType::APP_COLD_START) {
298 SOC_PERF_LOGI("SocPerfPlugin: socperf->APP_COLD_START");
299 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
300 int32_t appType = INVALID_VALUE;
301 if (reqAppTypeFunc_ != nullptr && data->payload != nullptr && data->payload.contains(BUNDLE_NAME)) {
302 std::string bundleName = data->payload[BUNDLE_NAME].get<std::string>().c_str();
303 appType = reqAppTypeFunc_(bundleName);
304 }
305 if (appType == APP_TYPE_GAME) {
306 SOC_PERF_LOGI("SocPerfPlugin: socperf->Game cold start");
307 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_GAME_START, "");
308 }
309 } else if (data->value == AppStartType::APP_WARM_START) {
310 SOC_PERF_LOGI("SocPerfPlugin: socperf->APP_WARM_START");
311 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WARM_START, "");
312 }
313 }
314
HandleWindowFocus(const std::shared_ptr<ResData> & data)315 void SocPerfPlugin::HandleWindowFocus(const std::shared_ptr<ResData>& data)
316 {
317 if (data->value == WindowFocusStatus::WINDOW_FOCUS) {
318 SOC_PERF_LOGI("SocPerfPlugin: socperf->WINDOW_SWITCH");
319 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WINDOW_SWITCH, "");
320 }
321 }
322
HandleEventClick(const std::shared_ptr<ResData> & data)323 void SocPerfPlugin::HandleEventClick(const std::shared_ptr<ResData>& data)
324 {
325 SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_CLICK: %{public}lld", (long long)data->value);
326 // touch down event
327 if (data->value == ClickEventType::TOUCH_EVENT_DOWN) {
328 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN, "");
329 } else if (data->value == ClickEventType::TOUCH_EVENT_UP) {
330 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN, "");
331 } else if (data->value == ClickEventType::CLICK_EVENT) {
332 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_CLICK, "");
333 }
334 }
335
HandleLoadPage(const std::shared_ptr<ResData> & data)336 void SocPerfPlugin::HandleLoadPage(const std::shared_ptr<ResData>& data)
337 {
338 if (data->value == LOAD_PAGE_START) {
339 SOC_PERF_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_START");
340 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, true, "");
341 } else if (data->value == LOAD_PAGE_COMPLETE) {
342 SOC_PERF_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_COMPLETE");
343 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, false, "");
344 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE, "");
345 }
346 }
347
HandlePopPage(const std::shared_ptr<ResData> & data)348 void SocPerfPlugin::HandlePopPage(const std::shared_ptr<ResData>& data)
349 {
350 SOC_PERF_LOGI("SocPerfPlugin: socperf->POP_PAGE: %{public}lld", (long long)data->value);
351 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POP_PAGE, "");
352 }
353
HandleEventSlide(const std::shared_ptr<ResData> & data)354 void SocPerfPlugin::HandleEventSlide(const std::shared_ptr<ResData>& data)
355 {
356 SOC_PERF_LOGD("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
357 static int counter = 0;
358 static uint64_t lastTime = 0;
359 if (data->value == SlideEventStatus::SLIDE_EVENT_ON || data->value == SlideEventStatus::SLIDE_NORMAL_BEGIN) {
360 auto now = std::chrono::system_clock::now();
361 uint64_t curMs = static_cast<uint64_t>(
362 std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count());
363 if (curMs - lastTime > TIME_INTERVAL) {
364 counter = 0;
365 }
366 lastTime = curMs;
367 counter++;
368 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, true, "");
369 } else if (data->value == SlideEventStatus::SLIDE_EVENT_OFF || data->value == SlideEventStatus::SLIDE_NORMAL_END) {
370 counter--;
371 if (counter == 0) {
372 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, false, "");
373 }
374 }
375 }
376
HandleEventWebGesture(const std::shared_ptr<ResData> & data)377 void SocPerfPlugin::HandleEventWebGesture(const std::shared_ptr<ResData>& data)
378 {
379 if (data == nullptr) {
380 return;
381 }
382 SOC_PERF_LOGD("SocPerfPlugin: socperf->WEB_GESTURE: %{public}lld", (long long)data->value);
383 if (data->value == WebGesture::WEB_GESTURE_START) {
384 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, true, "");
385 } else if (data->value == WebGesture::WEB_GESTURE_END) {
386 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, false, "");
387 }
388 }
389
HandleResizeWindow(const std::shared_ptr<ResData> & data)390 void SocPerfPlugin::HandleResizeWindow(const std::shared_ptr<ResData>& data)
391 {
392 if (data == nullptr) {
393 return;
394 }
395 SOC_PERF_LOGI("SocPerfPlugin: socperf->RESIZE_WINDOW: %{public}lld", (long long)data->value);
396 if (data->value == WindowResizeType::WINDOW_RESIZING) {
397 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, "");
398 } else if (data->value == WindowResizeType::WINDOW_RESIZE_STOP) {
399 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, false, "");
400 }
401 }
402
HandleMoveWindow(const std::shared_ptr<ResData> & data)403 void SocPerfPlugin::HandleMoveWindow(const std::shared_ptr<ResData>& data)
404 {
405 if (data == nullptr) {
406 return;
407 }
408 SOC_PERF_LOGI("SocPerfPlugin: socperf->MOVE_WINDOW: %{public}lld", (long long)data->value);
409 if (data->value == WindowMoveType::WINDOW_MOVING) {
410 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOVE_WINDOW, "");
411 } else if (data->value == WindowMoveType::WINDOW_MOVE_STOP) {
412 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_WINDOW, false, "");
413 }
414 }
415
HandleRemoteAnimation(const std::shared_ptr<ResData> & data)416 void SocPerfPlugin::HandleRemoteAnimation(const std::shared_ptr<ResData>& data)
417 {
418 SOC_PERF_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
419 if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
420 SOC_PERF_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
421 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
422 } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
423 SOC_PERF_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
424 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
425 } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_UNLOCK_BEGIN) {
426 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_UNLOCK, true, "");
427 } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_UNLOCK_END) {
428 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_UNLOCK, false, "");
429 }
430 }
431
HandleDragStatusBar(const std::shared_ptr<ResData> & data)432 void SocPerfPlugin::HandleDragStatusBar(const std::shared_ptr<ResData>& data)
433 {
434 if (data == nullptr) {
435 return;
436 }
437 SOC_PERF_LOGI("SocPerfPlugin: socperf->DRAG_STATUS_BAR: %{public}lld", (long long)data->value);
438 if (data->value == StatusBarDragStatus::DRAG_START) {
439 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, "");
440 } else if (data->value == StatusBarDragStatus::DRAG_END) {
441 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, false, "");
442 }
443 }
444
HandleWebGestureMove(const std::shared_ptr<ResData> & data)445 void SocPerfPlugin::HandleWebGestureMove(const std::shared_ptr<ResData>& data)
446 {
447 if (data == nullptr) {
448 return;
449 }
450 SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_GESTURE_MOVE: %{public}lld", (long long)data->value);
451 if (data->value == WebGestureMove::WEB_GESTURE_MOVE_START) {
452 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, true, "");
453 } else if (data->value == WebGestureMove::WEB_GESTURE_MOVE_END) {
454 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, false, "");
455 }
456 }
457
HandleWebSlideNormal(const std::shared_ptr<ResData> & data)458 void SocPerfPlugin::HandleWebSlideNormal(const std::shared_ptr<ResData>& data)
459 {
460 if (data == nullptr) {
461 return;
462 }
463 SOC_PERF_LOGD("SocPerfPlugin: socperf->WEB_SLIDE_NORMAL: %{public}lld", (long long)data->value);
464 if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_START) {
465 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, true, "");
466 } else if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_END) {
467 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, false, "");
468 }
469 }
470
HandleLoadUrl(const std::shared_ptr<ResData> & data)471 void SocPerfPlugin::HandleLoadUrl(const std::shared_ptr<ResData>& data)
472 {
473 SOC_PERF_LOGI("SocPerfPlugin: socperf->LOAD_URL");
474 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_URL, "");
475 }
476
HandleMousewheel(const std::shared_ptr<ResData> & data)477 void SocPerfPlugin::HandleMousewheel(const std::shared_ptr<ResData>& data)
478 {
479 SOC_PERF_LOGI("SocPerfPlugin: socperf->MOUSEWHEEL");
480 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOUSEWHEEL, "");
481 }
482
HandleAppStateChange(const std::shared_ptr<ResData> & data)483 bool SocPerfPlugin::HandleAppStateChange(const std::shared_ptr<ResData>& data)
484 {
485 if (data->value != ResType::ProcessStatus::PROCESS_CREATED) {
486 return false;
487 }
488 int extensionType = ParsePayload(data, EXTENSION_TYPE_KEY);
489 if (std::find(ResType::UI_SENSITIVE_EXTENSION.begin(), ResType::UI_SENSITIVE_EXTENSION.end(), extensionType) !=
490 ResType::UI_SENSITIVE_EXTENSION.end()) {
491 SOC_PERF_LOGI("SocPerfPlugin: socperf->APPSTATECHANGE");
492 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
493 return true;
494 }
495 return false;
496 }
497
HandleSocperfSceneBoard(const std::shared_ptr<ResData> & data)498 bool SocPerfPlugin::HandleSocperfSceneBoard(const std::shared_ptr<ResData> &data)
499 {
500 if (data == nullptr) {
501 return false;
502 }
503 SOC_PERF_LOGD("SocPerfPlugin: socperf->ANIMATION: %{public}lld", (long long)data->value);
504 if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
505 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
506 } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
507 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
508 }
509 return true;
510 }
511
HandleDeviceModeStatusChange(const std::shared_ptr<ResData> & data)512 void SocPerfPlugin::HandleDeviceModeStatusChange(const std::shared_ptr<ResData>& data)
513 {
514 if ((data->value != DeviceModeStatus::MODE_ENTER) && (data->value != DeviceModeStatus::MODE_QUIT)) {
515 SOC_PERF_LOGW("SocPerfPlugin: device mode status value is error");
516 return;
517 }
518
519 if (!data->payload.contains(DEVICE_MODE_PAYMODE_NAME) || !data->payload[DEVICE_MODE_PAYMODE_NAME].is_string()) {
520 SOC_PERF_LOGW("SocPerfPlugin: device mode status payload is error");
521 return;
522 }
523
524 std::string deviceMode = data->payload[DEVICE_MODE_PAYMODE_NAME];
525 bool status = (data->value == DeviceModeStatus::MODE_ENTER);
526 OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(deviceMode, status);
527 SOC_PERF_LOGI("SocPerfPlugin: device mode %{public}s status%{public}d", deviceMode.c_str(), status);
528 }
529
HandleSocperfAccountActivating(const std::shared_ptr<ResData> & data)530 bool SocPerfPlugin::HandleSocperfAccountActivating(const std::shared_ptr<ResData> &data)
531 {
532 if (data == nullptr) {
533 return false;
534 }
535 SOC_PERF_LOGD("SocPerfPlugin: socperf->AccountActivating: %{public}lld", (long long)data->value);
536 if (data->value == AccountActivatingStatus::ACCOUNT_ACTIVATING_START) {
537 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ACCOUNT_ACTIVATING, true, "");
538 }
539 return true;
540 }
541
HandleCustEvent(const std::shared_ptr<ResData> & data)542 bool SocPerfPlugin::HandleCustEvent(const std::shared_ptr<ResData> &data)
543 {
544 if (data == nullptr || data->value <= 0) {
545 return false;
546 }
547 SOC_PERF_LOGD("SocPerfPlugin: socperf->Anco: %{public}lld", (long long)data->value);
548 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(data->value, "");
549 return true;
550 }
551
HandleCustEventBegin(const std::shared_ptr<ResData> & data)552 bool SocPerfPlugin::HandleCustEventBegin(const std::shared_ptr<ResData> &data)
553 {
554 if (data == nullptr || data->value <= 0) {
555 return false;
556 }
557 SOC_PERF_LOGD("SocPerfPlugin: socperf->SOCPERF_CUST_EVENT_BEGIN: %{public}lld", (long long)data->value);
558 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(data->value, true, "");
559 return true;
560 }
561
HandleCustEventEnd(const std::shared_ptr<ResData> & data)562 bool SocPerfPlugin::HandleCustEventEnd(const std::shared_ptr<ResData> &data)
563 {
564 if (data == nullptr || data->value <= 0) {
565 return false;
566 }
567 SOC_PERF_LOGD("SocPerfPlugin: socperf->SOCPERF_CUST_EVENT_END: %{public}lld", (long long)data->value);
568 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(data->value, false, "");
569 return true;
570 }
571
HandleRgmBootingStatus(const std::shared_ptr<ResData> & data)572 bool SocPerfPlugin::HandleRgmBootingStatus(const std::shared_ptr<ResData> &data)
573 {
574 if (data == nullptr) {
575 return false;
576 }
577 SOC_PERF_LOGD("SocPerfPlugin: socperf->RGM_BOOTING_STATUS: %{public}lld", (long long)data->value);
578 if (data->value == 0) {
579 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RGM_BOOTING_START, true, "");
580 }
581 return true;
582 }
583
HandleAppColdStartEx(const std::shared_ptr<ResData> & data)584 bool SocPerfPlugin::HandleAppColdStartEx(const std::shared_ptr<ResData> &data)
585 {
586 if (data == nullptr) {
587 return false;
588 }
589 SOC_PERF_LOGD("SocPerfPlugin: socperf->APP_START_ONLY_PERF: %{public}lld", (long long)data->value);
590 if (data->value == 0) {
591 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, true, "");
592 } else if (data->value == 1) {
593 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, false, "");
594 }
595 return true;
596 }
597
HandleSceneRotation(const std::shared_ptr<ResData> & data)598 bool SocPerfPlugin::HandleSceneRotation(const std::shared_ptr<ResData> &data)
599 {
600 if (data == nullptr) {
601 return false;
602 }
603 SOC_PERF_LOGD("SocPerfPlugin: socperf->PERF_REQUEST_CMD_ID_ROTATION: %{public}lld", (long long)data->value);
604 if (data->value == 0) {
605 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ROTATION, true, "");
606 } else if (data->value == 1) {
607 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ROTATION, false, "");
608 }
609 return true;
610 }
611
HandleBmmMoniterStatus(const std::shared_ptr<ResData> & data)612 bool SocPerfPlugin::HandleBmmMoniterStatus(const std::shared_ptr<ResData> &data)
613 {
614 if (data == nullptr) {
615 return false;
616 }
617 SOC_PERF_LOGD("SocPerfPlugin: socperf->PERF_REQUEST_CMD_ID_BMM_MONITER_CHANGE: %{public}lld",
618 (long long)data->value);
619 if (data->value == BmmMoniterStatus::BMM_BACKGROUND) {
620 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_BMM_MONITER_START, true, "");
621 return true;
622 }
623 if (data->value == BmmMoniterStatus::BMM_CLOSE) {
624 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_BMM_MONITER_START, false, "");
625 return true;
626 }
627 return false;
628 }
629
OnPluginInit(std::string & libName)630 extern "C" bool OnPluginInit(std::string& libName)
631 {
632 if (libName != LIB_NAME) {
633 SOC_PERF_LOGE("SocPerfPlugin::OnPluginInit lib name is not match");
634 return false;
635 }
636 SocPerfPlugin::GetInstance().Init();
637 return true;
638 }
639
OnPluginDisable()640 extern "C" void OnPluginDisable()
641 {
642 SocPerfPlugin::GetInstance().Disable();
643 }
644
OnDispatchResource(const std::shared_ptr<ResData> & data)645 extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
646 {
647 SocPerfPlugin::GetInstance().DispatchResource(data);
648 }
649 } // namespace ResourceSchedule
650 } // namespace OHOS
651 #endif // RESSCHED_RESOURCESCHEDULE_SOC_PERF_ENABLE