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