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