• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 ITEM_KEY_CAPACITY = "capacity";
37     const std::string CONFIG_NAME_SOCPERF_FEATURE_SWITCH = "socperfFeatureSwitch";
38     const std::string CONFIG_NAME_SOCPERF_EVENT_ID = "socperfEventId";
39     const std::string CONFIG_NAME_SOCPERF_POLICY_MODE = "socperfPolicyMode";
40     const std::string CONFIG_NAME_SOCPERF_LIMIT_POLICY = "limitPolicy";
41     const std::string SUB_ITEM_KEY_NAME_SOCPERF_ON_DEMAND = "socperf_on_demand";
42     const std::string SUB_ITEM_KEY_NAME_SOCPERF_GAME_BOOST = "socperf_game_boost";
43     const std::string CONFIG_NAME_SOCPERF_BUNDLE_NAME_BOOST_LIST = "socperfBundleNameBoostList";
44     const std::string SUB_ITEM_KEY_NAME_APP_USE_CAMERA_BOOST = "app_use_camera_boost";
45     const std::string SUB_ITEM_KEY_NAME_APP_MOVE_EVENT_BOOST = "app_move_event_boost";
46     const std::string CNOFIG_NAME_SOCPERF_CRUCIAL_FUNC = "socperfCrucialFunc";
47     const std::string SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_PATH = "socperf_req_apptype_path";
48     const std::string SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_FUNC = "socperf_req_apptype_func";
49     const std::string CONFIG_NAME_SOCPERF_BATTERY_CAPACITY_LIMIT_FREQ = "socperfBatteryCapacityLimitFreq";
50     const std::string BUNDLE_NAME = "bundleName";
51     const std::string CALLER_BUNDLE_NAME = "callerBundleName";
52     const std::string SPECIAL_EXTENSION_STRING = "specialExtension";
53     const std::string INFO_STRING = "info";
54     const std::string PID_NAME = "pid";
55     const std::string CLIENT_PID_NAME = "clientPid";
56     const std::string UID_NAME = "uid";
57     const std::string CALLING_UID_NAME = "callingUid";
58     const std::string SOCPERF_TYPE_ID = "socperf_type_id";
59     const std::string SOCPERF_TYPE_RGM = "socperf_type_rgm";
60     const std::string SOCPERF_POLICY_MODE = "socperf_mode";
61     const std::string EXTENSION_TYPE_KEY = "extensionType";
62     const std::string DEVICE_MODE_TYPE_KEY = "deviceModeType";
63     const std::string DEVICE_MODE_PAYMODE_NAME = "deviceMode";
64     const std::string DISPLAY_MODE_KEY = "display";
65     const std::string DEVICE_ORIENTATION_TYPE_KEY = "deviceOrientation";
66     const std::string DISPLAY_MODE_FULL = "displayFull";
67     const std::string DISPLAY_MODE_MAIN = "displayMain";
68     const std::string DISPLAY_MODE_SUB = "displaySub";
69     const std::string DISPLAY_MODE_GLOBAL_FULL = "displayGlobalFull";
70     const std::string DISPLAY_ORIENTAYION_LANDSCAPE = "displayLandscape";
71     const std::string DISPLAY_ORIENTAYION_PORTRAIT = "displayPortrait";
72     const std::string SCREEN_MODE_KEY = "screenStatus";
73     const std::string SCREEN_MODE_ON = "screen_on";
74     const std::string SCREEN_MODE_OFF = "screen_off";
75     const std::string POWER_MODE_KEY = "power";
76     const std::string POWER_MODE = "powerMode";
77     const std::string POWER_STATUS_KEY = "powerStatus";
78     const std::string PRELOAD_MODE = "isPreload";
79     const std::string WEAK_ACTION_STRING = "weakInterAction";
80     const std::string WEAK_ACTION_MODE = "actionmode:weakaction";
81     const std::string KEY_APP_TYPE = "key_app_type";
82     const std::string GAME_ENV = "env";
83     const std::string RES_ID = "resId";
84     const std::string COMMON_EVENT_CHARGE_STATE = "chargeState";
85     const std::string SCHED_MODE_KEY = "schedMode";
86     const std::string CLOUD_PARAMS = "params";
87     const std::string ENABLE_STRING = "enable";
88     const int32_t SOC_PERF_SA_ID                            = 1906;
89     const int32_t INVALID_VALUE                             = -1;
90     const int32_t APP_TYPE_GAME                             = 2;
91     const int32_t INVALID_APP_TYPE                          = 0;
92     const int32_t POWERMODE_ON                              = 601;
93     const int64_t TIME_INTERVAL                             = 4500;
94     const int64_t SCREEN_OFF_TIME_DELAY                     = 5000000L;
95     const int32_t PERF_REQUEST_CMD_ID_RGM_BOOTING_START     = 1000;
96     const int32_t PERF_REQUEST_CMD_ID_POWERMODE_CHANGED     = 9000;
97     const int32_t PERF_REQUEST_CMD_ID_APP_START             = 10000;
98     const int32_t PERF_REQUEST_CMD_ID_WARM_START            = 10001;
99     const int32_t PERF_REQUEST_CMD_ID_WINDOW_SWITCH         = 10002;
100     const int32_t PERF_REQUEST_CMD_ID_EVENT_CLICK           = 10006;
101     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_START       = 10007;
102     const int32_t PERF_REQUEST_CMD_ID_EVENT_FLING           = 10008;
103     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER      = 10009;
104     const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN      = 10010;
105     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE    = 10011;
106     const int32_t PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE     = 10012;
107     const int32_t PERF_REQUEST_CMD_ID_POP_PAGE              = 10016;
108     const int32_t PERF_REQUEST_CMD_ID_RESIZE_WINDOW         = 10018;
109     const int32_t PERF_REQUEST_CMD_ID_MOVE_WINDOW           = 10019;
110     const int32_t PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE      = 10020;
111     const int32_t PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL      = 10025;
112     const int32_t PERF_REQUEST_CMD_ID_ROTATION              = 10027;
113     const int32_t PERF_REQUEST_CMD_ID_SCREEN_ON             = 10028;
114     const int32_t PERF_REQUEST_CMD_ID_SCREEN_OFF            = 10029;
115     const int32_t PERF_REQUEST_CMD_ID_REMOTE_ANIMATION      = 10030;
116     const int32_t PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR       = 10034;
117     const int32_t PERF_REQUEST_CMD_ID_GAME_START            = 10036;
118     const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH_UP        = 10040;
119     const int32_t PERF_REQUEST_CMD_ID_REMOTE_UNLOCK         = 10041;
120     const int32_t PERF_REQUEST_CMD_ID_ACCOUNT_ACTIVATING    = 10043;
121     const int32_t PERF_REQUEST_CMD_ID_EVENT_KEY_DOWN        = 10044;
122 #ifdef RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
123     const int32_t PERF_REQUEST_CMD_ID_POWER_KEY             = 10045;
124     const int32_t PERF_REQUEST_CMD_ID_CROWN_ROTATION        = 10046;
125 #endif // RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
126     const int32_t PERF_REQUEST_CMD_ID_LOAD_URL              = 10070;
127     const int32_t PERF_REQUEST_CMD_ID_MOUSEWHEEL            = 10071;
128     const int32_t PERF_REQUEST_CMD_ID_WEB_DRAG_RESIZE       = 10073;
129     const int32_t PERF_REQUEST_CMD_ID_BMM_MONITER_START     = 10081;
130     const int32_t PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL     = 10082;
131     const int32_t PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN     = 10083;
132     const int32_t PERF_REQUEST_CMD_ID_GAME_BOOST            = 10085;
133     const int32_t PERF_REQUEST_CMD_ID_APP_USE_CAMERA        = 10086;
134 #ifdef RESSCHED_RESOURCESCHEDULE_FILE_COPY_SOC_PERF_ENABLE
135     const int32_t PERF_REQUEST_CMD_ID_FILE_COPY             = 10087;
136 #endif
137     const int32_t PERF_REQUEST_CMD_ID_SCREEN_SWITCHED       = 10090;
138     const int32_t PERF_REQUEST_CMD_ID_MOVE_EVENT_BOOST      = 10091;
139     const int32_t PERF_REQUEST_CMD_ID_EVENT_DRAG            = 10092;
140     const int32_t PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL1     = 10093;
141     const int32_t PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL2     = 10094;
142     const int32_t PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL3     = 10095;
143     const int32_t PERF_REQUEST_CMD_ID_WEB_SLIDE_SCROLL      = 10097;
144     const int32_t PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L      = 10098;
145     const int32_t PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P      = 10203;
146     const int32_t PERF_REQUEST_CMD_ID_RECENT_BUILD          = 10200;
147 }
IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)148 IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)
149 
150 void SocPerfPlugin::Init()
151 {
152     InitEventId();
153     InitResTypes();
154     InitFunctionMap();
155     InitSpecialExtension();
156     for (auto resType : resTypes) {
157         PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);
158     }
159     InitPerfCrucialSo();
160     InitBundleNameBoostList();
161     InitWeakInterAction();
162     InitBatteryCapacityLimitFreq();
163     InitPolicyMode();
164     SOC_PERF_LOGI("SocPerfPlugin::Init success");
165 }
166 
InitPerfCrucialSo()167 void SocPerfPlugin::InitPerfCrucialSo()
168 {
169     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CNOFIG_NAME_SOCPERF_CRUCIAL_FUNC);
170     for (const Item& item : itemLists.itemList) {
171         for (SubItem sub : item.subItemList) {
172             if (sub.name == SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_PATH) {
173                 perfReqAppTypeSoPath_ = sub.value;
174             }
175             if (sub.name == SUB_ITEM_KEY_NAME_SOCPERF_RERQ_APPTYPE_FUNC) {
176                 perfReqAppTypeSoFunc_ = sub.value;
177             }
178         }
179     }
180 
181     if (!perfReqAppTypeSoPath_.empty() && !perfReqAppTypeSoFunc_.empty()) {
182         InitPerfCrucialFunc(perfReqAppTypeSoPath_.c_str(), perfReqAppTypeSoFunc_.c_str());
183     }
184     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CNOFIG_NAME_SOCPERF_CRUCIAL_FUNC);
185 }
186 
InitWeakInterAction()187 void SocPerfPlugin::InitWeakInterAction()
188 {
189     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, WEAK_ACTION_STRING);
190     LoadWeakInterAction(itemLists);
191     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, WEAK_ACTION_STRING);
192 }
193 
LoadWeakInterAction(const PluginConfig & itemLists)194 void SocPerfPlugin::LoadWeakInterAction(const PluginConfig& itemLists)
195 {
196     for (const Item& item : itemLists.itemList) {
197         for (SubItem sub : item.subItemList) {
198             if (sub.name == ENABLE_STRING) {
199                 SetWeakActionEnable(sub.value);
200             } else if (sub.name == BUNDLE_NAME) {
201                 AddKeyAppName(sub.value);
202             } else if (sub.name == KEY_APP_TYPE) {
203                 AddKeyAppType(sub.value);
204             }
205         }
206     }
207 }
208 
SetWeakActionEnable(const std::string & subValue)209 void SocPerfPlugin::SetWeakActionEnable(const std::string& subValue)
210 {
211     if (subValue.empty()) {
212         return;
213     }
214     weakActionEnable_ = (bool)atoi(subValue.c_str());
215     SOC_PERF_LOGI("SocPerfPlugin::Init weakActionEnable %{public}d", weakActionEnable_);
216     UpdateWeakActionStatus();
217 }
218 
AddKeyAppName(const std::string & subValue)219 void SocPerfPlugin::AddKeyAppName(const std::string& subValue)
220 {
221     if (subValue.empty()) {
222         return;
223     }
224     keyAppName_.insert(subValue);
225 }
226 
AddKeyAppType(const std::string & subValue)227 void SocPerfPlugin::AddKeyAppType(const std::string& subValue)
228 {
229     if (subValue.empty()) {
230         return;
231     }
232     keyAppType_.insert(atoi(subValue.c_str()));
233 }
234 
InitPerfCrucialFunc(const char * perfSoPath,const char * perfSoFunc)235 void SocPerfPlugin::InitPerfCrucialFunc(const char* perfSoPath, const char* perfSoFunc)
236 {
237     if (!perfSoPath || !perfSoFunc) {
238         return;
239     }
240     handle_ = dlopen(perfSoPath, RTLD_NOW);
241     if (!handle_) {
242         SOC_PERF_LOGE("perf so doesn't exist");
243         return;
244     }
245 
246     reqAppTypeFunc_ = reinterpret_cast<ReqAppTypeFunc>(dlsym(handle_, perfSoFunc));
247     if (!reqAppTypeFunc_) {
248         SOC_PERF_LOGE("perf func req app type doesn't exist");
249         dlclose(handle_);
250         handle_ = nullptr;
251     }
252 }
253 
InitEventId()254 void SocPerfPlugin::InitEventId()
255 {
256     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_EVENT_ID);
257     for (const Item& item : itemLists.itemList) {
258         for (SubItem sub : item.subItemList) {
259             if (sub.name == SOCPERF_TYPE_ID) {
260                 RES_TYPE_SCENE_BOARD_ID = atoi(sub.value.c_str());
261             } else if (sub.name == SOCPERF_TYPE_RGM) {
262                 RES_TYPE_RGM_BOOTING_STATUS = atoi(sub.value.c_str());
263             }
264         }
265     }
266     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_EVENT_ID);
267 }
268 
GetPolicyMode(const PluginConfig & socperfPolicy)269 static std::string GetPolicyMode(const PluginConfig& socperfPolicy)
270 {
271     std::string policyMode;
272     for (const Item& item : socperfPolicy.itemList) {
273         for (const SubItem& sub : item.subItemList) {
274             if (sub.name == SOCPERF_POLICY_MODE) {
275                 policyMode = sub.value;
276             }
277         }
278     }
279     return policyMode;
280 }
281 
ApplyPolicyLimits(const PluginConfig & limitPolicy,const std::string & policyMode,std::optional<bool> & powerLimit,std::optional<bool> & thermalLimit)282 static void ApplyPolicyLimits(const PluginConfig& limitPolicy, const std::string& policyMode,
283                               std::optional<bool>& powerLimit, std::optional<bool>& thermalLimit)
284 {
285     auto it = std::find_if(limitPolicy.itemList.begin(), limitPolicy.itemList.end(), [&policyMode](const Item& item) {
286         auto tempIt = item.itemProperties.find("key");
287         if (tempIt == item.itemProperties.end()) {
288             return false;
289         }
290         return tempIt->second == policyMode;
291     });
292     if (it == limitPolicy.itemList.end()) {
293         return;
294     }
295 
296     const auto& itemList = it->subItemList;
297     for (const auto& item : itemList) {
298         if (item.name == "power_limit") {
299             powerLimit = static_cast<bool>(atoi(item.value.c_str()));
300         }
301         if (item.name == "thermal_limit") {
302             thermalLimit = static_cast<bool>(atoi(item.value.c_str()));
303         }
304     }
305 }
306 
InitPolicyMode()307 void SocPerfPlugin::InitPolicyMode()
308 {
309     PluginConfig socperfPolicy = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_POLICY_MODE);
310     PluginConfig limitPolicy = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_LIMIT_POLICY);
311     if (!socperfPolicy.itemList.empty() && !limitPolicy.itemList.empty()) {
312         std::string policyMode = GetPolicyMode(socperfPolicy);
313         ApplyPolicyLimits(limitPolicy, policyMode, powerLimit_, thermalLimit_);
314     }
315 
316     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_POLICY_MODE);
317     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_LIMIT_POLICY);
318 }
319 
InitBundleNameBoostList()320 bool SocPerfPlugin::InitBundleNameBoostList()
321 {
322     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME,
323         CONFIG_NAME_SOCPERF_BUNDLE_NAME_BOOST_LIST);
324     bool ret = false;
325     for (const Item& item : itemLists.itemList) {
326         for (SubItem sub : item.subItemList) {
327             if (sub.name == SUB_ITEM_KEY_NAME_APP_USE_CAMERA_BOOST) {
328                 ret = HandleSubValue(sub.value.c_str(), appNameUseCamera_);
329             } else if (sub.name == SUB_ITEM_KEY_NAME_APP_MOVE_EVENT_BOOST) {
330                 ret = HandleSubValue(sub.value.c_str(), appNameMoveEvent_);
331             }
332         }
333     }
334     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_BUNDLE_NAME_BOOST_LIST);
335     return ret;
336 }
337 
HandleSubValue(const std::string & subValue,std::set<std::string> & nameSet)338 bool SocPerfPlugin::HandleSubValue(const std::string& subValue, std::set<std::string>& nameSet)
339 {
340     if (subValue.empty()) {
341         return false;
342     }
343     std::stringstream sstream(subValue);
344     std::string bundleName;
345     while (std::getline(sstream, bundleName, ',')) {
346         nameSet.insert(bundleName);
347     }
348     return true;
349 }
350 
InitBatteryCapacityLimitFreq()351 bool SocPerfPlugin::InitBatteryCapacityLimitFreq()
352 {
353     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME,
354         CONFIG_NAME_SOCPERF_BATTERY_CAPACITY_LIMIT_FREQ);
355     bool ret = false;
356     for (Item& item : itemLists.itemList) {
357         std::string itemCapacity = item.itemProperties[ITEM_KEY_CAPACITY];
358         for (SubItem sub : item.subItemList) {
359             ret = HandleBatterySubValue(atoi(itemCapacity.c_str()),
360                 atoi(sub.properties[RES_ID].c_str()), atoi(sub.value.c_str()));
361         }
362     }
363     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_BATTERY_CAPACITY_LIMIT_FREQ);
364     return ret;
365 }
366 
HandleBatterySubValue(const int32_t capacity,const int32_t tag,const int64_t config)367 bool SocPerfPlugin::HandleBatterySubValue(const int32_t capacity,
368     const int32_t tag, const int64_t config)
369 {
370     struct Frequencies frequencies;
371     if (socperfBatteryConfig_.find(capacity) != socperfBatteryConfig_.end()) {
372         frequencies = socperfBatteryConfig_[capacity];
373     }
374     if (capacity > maxBatteryLimitCapacity_) {
375         maxBatteryLimitCapacity_ = capacity;
376     }
377     frequencies.tags.push_back(tag);
378     frequencies.configs.push_back(config);
379     socperfBatteryConfig_[capacity] = frequencies;
380     return true;
381 }
382 
StringToSet(const std::string & str,char pattern)383 std::set<std::string> SocPerfPlugin::StringToSet(const std::string& str, char pattern)
384 {
385     std::set<std::string> result;
386     std::string token;
387     std::istringstream tokenStream(str);
388     while (getline(tokenStream, token, pattern)) {
389         result.insert(token);
390     }
391     return result;
392 }
393 
AddSpecialExtension(SubItem & sub)394 void SocPerfPlugin::AddSpecialExtension(SubItem& sub)
395 {
396     if (!sub.properties.count(BUNDLE_NAME) || !sub.properties.count(CALLER_BUNDLE_NAME)) {
397         return;
398     }
399     std::string bundleName = sub.properties.at(BUNDLE_NAME);
400     std::string callerBundleNames = sub.properties.at(CALLER_BUNDLE_NAME);
401     SOC_PERF_LOGI("AddSpecialExtension:[%{public}s],[%{public}s]", bundleName.c_str(), callerBundleNames.c_str());
402     std::set<std::string> callerBundleNamesList = StringToSet(callerBundleNames, '|');
403     specialExtensionMap_[bundleName] = callerBundleNamesList;
404 }
405 
InitSpecialExtension()406 void SocPerfPlugin::InitSpecialExtension()
407 {
408     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, SPECIAL_EXTENSION_STRING);
409     LoadSpecialExtension(itemLists);
410     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, SPECIAL_EXTENSION_STRING);
411 }
412 
LoadSpecialExtension(const PluginConfig & itemLists)413 void SocPerfPlugin::LoadSpecialExtension(const PluginConfig& itemLists)
414 {
415     for (const Item& item : itemLists.itemList) {
416         for (SubItem sub : item.subItemList) {
417             if (sub.name == INFO_STRING) {
418                 AddSpecialExtension(sub);
419             }
420         }
421     }
422 }
423 
InitFunctionMap()424 void SocPerfPlugin::InitFunctionMap()
425 {
426     functionMap = {
427         { RES_TYPE_WINDOW_FOCUS,
428             [this](const std::shared_ptr<ResData>& data) { HandleWindowFocus(data); } },
429         { RES_TYPE_CLICK_RECOGNIZE,
430             [this](const std::shared_ptr<ResData>& data) { HandleEventClick(data); } },
431         { RES_TYPE_LOAD_PAGE,
432             [this](const std::shared_ptr<ResData>& data) { HandleLoadPage(data); } },
433         { RES_TYPE_SLIDE_RECOGNIZE,
434             [this](const std::shared_ptr<ResData>& data) { HandleEventSlide(data); } },
435         { RES_TYPE_WEB_GESTURE,
436             [this](const std::shared_ptr<ResData>& data) { HandleEventWebGesture(data); } },
437         { RES_TYPE_POP_PAGE,
438             [this](const std::shared_ptr<ResData>& data) { HandlePopPage(data); } },
439         { RES_TYPE_APP_ABILITY_START,
440             [this](const std::shared_ptr<ResData>& data) { HandleAppAbilityStart(data); } },
441         { RES_TYPE_RESIZE_WINDOW,
442             [this](const std::shared_ptr<ResData>& data) { HandleResizeWindow(data); } },
443         { RES_TYPE_MOVE_WINDOW,
444             [this](const std::shared_ptr<ResData>& data) { HandleMoveWindow(data); } },
445         { RES_TYPE_SHOW_REMOTE_ANIMATION,
446             [this](const std::shared_ptr<ResData>& data) { HandleRemoteAnimation(data); } },
447         { RES_TYPE_DRAG_STATUS_BAR,
448             [this](const std::shared_ptr<ResData>& data) { HandleDragStatusBar(data); } },
449         { RES_TYPE_WEB_GESTURE_MOVE,
450             [this](const std::shared_ptr<ResData>& data) { HandleWebGestureMove(data); } },
451         { RES_TYPE_WEB_SLIDE_NORMAL,
452             [this](const std::shared_ptr<ResData>& data) { HandleWebSlideNormal(data); } },
453         { RES_TYPE_LOAD_URL,
454             [this](const std::shared_ptr<ResData>& data) { HandleLoadUrl(data); } },
455         { RES_TYPE_MOUSEWHEEL,
456             [this](const std::shared_ptr<ResData>& data) { HandleMousewheel(data); } },
457         { RES_TYPE_APP_STATE_CHANGE,
458             [this](const std::shared_ptr<ResData>& data) { HandleAppStateChange(data); } },
459         { RES_TYPE_DEVICE_MODE_STATUS,
460             [this](const std::shared_ptr<ResData>& data) { HandleDeviceModeStatusChange(data); } },
461         { RES_TYPE_ACCOUNT_ACTIVATING,
462             [this](const std::shared_ptr<ResData>& data) { HandleSocperfAccountActivating(data); } },
463         { RES_TYPE_WEB_DRAG_RESIZE,
464             [this](const std::shared_ptr<ResData>& data) { HandleWebDragResize(data); } },
465 #ifdef RESSCHED_RESOURCESCHEDULE_FILE_COPY_SOC_PERF_ENABLE
466         { RES_TYPE_FILE_COPY_STATUS,
467             [this](const std::shared_ptr<ResData>& data) { HandleFileCopyStatus(data); } },
468 #endif
469         { RES_TYPE_WEB_SLIDE_SCROLL,
470             [this](const std::shared_ptr<ResData>& data) { HandleWebSildeScroll(data); } },
471     };
472     AddEventToFunctionMap();
473 }
474 
AddEventToFunctionMap()475 void SocPerfPlugin::AddEventToFunctionMap()
476 {
477 #ifdef RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
478     functionMap.insert(std::make_pair(RES_TYPE_ANCO_CUST,
479         [this](const std::shared_ptr<ResData>& data) { HandleCustEvent(data); }));
480     functionMap.insert(std::make_pair(RES_TYPE_SOCPERF_CUST_EVENT_BEGIN,
481         [this](const std::shared_ptr<ResData>& data) { HandleCustEventBegin(data); }));
482     functionMap.insert(std::make_pair(RES_TYPE_SOCPERF_CUST_EVENT_END,
483         [this](const std::shared_ptr<ResData>& data) { HandleCustEventEnd(data); }));
484     functionMap.insert(std::make_pair(RES_TYPE_SOCPERF_CUST_ACTION,
485         [this](const std::shared_ptr<ResData>& data) { HandleCustAction(data); }));
486 #endif // RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
487     functionMap.insert(std::make_pair(RES_TYPE_ONLY_PERF_APP_COLD_START,
488         [this](const std::shared_ptr<ResData>& data) { HandleAppColdStartEx(data); }));
489     functionMap.insert(std::make_pair(RES_TYPE_SCENE_ROTATION,
490         [this](const std::shared_ptr<ResData>& data) { HandleSceneRotation(data); }));
491     functionMap.insert(std::make_pair(RES_TYPE_BMM_MONITER_CHANGE_EVENT,
492         [this](const std::shared_ptr<ResData>& data) { HandleBmmMoniterStatus(data); }));
493     functionMap.insert(std::make_pair(RES_TYPE_POWER_MODE_CHANGED,
494         [this](const std::shared_ptr<ResData>& data) { HandlePowerModeChanged(data); }));
495     functionMap.insert(std::make_pair(RES_TYPE_SCREEN_STATUS,
496         [this](const std::shared_ptr<ResData>& data) { HandleScreenStatusAnalysis(data); }));
497     functionMap.insert(std::make_pair(RES_TYPE_APP_GAME_BOOST_EVENT,
498         [this](const std::shared_ptr<ResData>& data) { HandleGameBoost(data); }));
499     functionMap.insert(std::make_pair(RES_TYPE_KEY_EVENT,
500         [this](const std::shared_ptr<ResData>& data) { HandleEventKey(data); }));
501 #ifdef RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
502     functionMap.insert(std::make_pair(RES_TYPE_MMI_INPUT_POWER_KEY,
503         [this](const std::shared_ptr<ResData>& data) { HandlePowerEventKey(data); }));
504     functionMap.insert(std::make_pair(RES_TYPE_CROWN_ROTATION_STATUS,
505         [this](const std::shared_ptr<ResData>& data) { HandleCrownRotation(data); }));
506 #endif // RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
507     functionMap.insert(std::make_pair(RES_TYPE_APP_INSTALL_UNINSTALL,
508         [this](const std::shared_ptr<ResData>& data) { HandleUninstallEvent(data); }));
509     functionMap.insert(std::make_pair(RES_TYPE_PROCESS_STATE_CHANGE,
510         [this](const std::shared_ptr<ResData>& data) { HandleProcessStateChange(data); }));
511     functionMap.insert(std::make_pair(RES_TYPE_REPORT_CAMERA_STATE,
512         [this](const std::shared_ptr<ResData>& data) { HandleCameraStateChange(data); }));
513     functionMap.insert(std::make_pair(RES_TYPE_REPORT_GAME_STATE_CHANGE,
514         [this](const std::shared_ptr<ResData>& data) { HandleGameStateChange(data); }));
515     if (RES_TYPE_SCENE_BOARD_ID != 0) {
516         functionMap.insert(std::make_pair(RES_TYPE_SCENE_BOARD_ID,
517             [this](const std::shared_ptr<ResData>& data) { HandleSocperfSceneBoard(data); }));
518     }
519     if (RES_TYPE_RGM_BOOTING_STATUS != 0) {
520         functionMap.insert(std::make_pair(RES_TYPE_RGM_BOOTING_STATUS,
521             [this](const std::shared_ptr<ResData>& data) { HandleRgmBootingStatus(data); }));
522     }
523     AddOtherEventToFunctionMap();
524 }
525 
AddOtherEventToFunctionMap()526 void SocPerfPlugin::AddOtherEventToFunctionMap()
527 {
528     functionMap.insert(std::make_pair(RES_TYPE_RECENT_BUILD,
529         [this](const std::shared_ptr<ResData>& data) { HandleRecentBuild(data); }));
530     functionMap.insert(std::make_pair(RES_TYPE_DEVICE_ORIENTATION_STATUS,
531         [this](const std::shared_ptr<ResData>& data) { HandleDeviceOrientationStatusChange(data); }));
532     functionMap.insert(std::make_pair(RES_TYPE_REPORT_BATTERY_STATUS_CHANGE,
533         [this](const std::shared_ptr<ResData>& data) { HandleBatteryStatusChange(data); }));
534     functionMap.insert(std::make_pair(RES_TYPE_SCHED_MODE_CHANGE,
535         [this](const std::shared_ptr<ResData>& data) { HandleSchedModeChange(data); }));
536     functionMap.insert(std::make_pair(RES_TYPE_RSS_CLOUD_CONFIG_UPDATE,
537         [this](const std::shared_ptr<ResData>& data) { HandleRssCloudConfigUpdate(data); }));
538     functionMap.insert(std::make_pair(RES_TYPE_SYSTEM_ABILITY_STATUS_CHANGE,
539         [this](const std::shared_ptr<ResData>& data) { ReportAbilityStatus(data); }));
540     socperfGameBoostSwitch_ = InitFeatureSwitch(SUB_ITEM_KEY_NAME_SOCPERF_GAME_BOOST);
541 }
542 
InitResTypes()543 void SocPerfPlugin::InitResTypes()
544 {
545     resTypes = {
546         RES_TYPE_WINDOW_FOCUS,
547         RES_TYPE_CLICK_RECOGNIZE,
548         RES_TYPE_KEY_EVENT,
549         RES_TYPE_LOAD_PAGE,
550         RES_TYPE_SLIDE_RECOGNIZE,
551         RES_TYPE_WEB_GESTURE,
552         RES_TYPE_POP_PAGE,
553         RES_TYPE_APP_ABILITY_START,
554         RES_TYPE_RESIZE_WINDOW,
555         RES_TYPE_MOVE_WINDOW,
556         RES_TYPE_SHOW_REMOTE_ANIMATION,
557         RES_TYPE_DRAG_STATUS_BAR,
558         RES_TYPE_WEB_GESTURE_MOVE,
559         RES_TYPE_WEB_SLIDE_NORMAL,
560         RES_TYPE_LOAD_URL,
561         RES_TYPE_MOUSEWHEEL,
562         RES_TYPE_APP_STATE_CHANGE,
563         RES_TYPE_DEVICE_MODE_STATUS,
564         RES_TYPE_ACCOUNT_ACTIVATING,
565         RES_TYPE_DEVICE_ORIENTATION_STATUS,
566 #ifdef RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
567         RES_TYPE_ANCO_CUST,
568         RES_TYPE_SOCPERF_CUST_EVENT_BEGIN,
569         RES_TYPE_SOCPERF_CUST_EVENT_END,
570         RES_TYPE_SOCPERF_CUST_ACTION,
571 #endif // RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
572         RES_TYPE_ONLY_PERF_APP_COLD_START,
573         RES_TYPE_SCENE_ROTATION,
574         RES_TYPE_BMM_MONITER_CHANGE_EVENT,
575         RES_TYPE_POWER_MODE_CHANGED,
576         RES_TYPE_SCREEN_STATUS,
577         RES_TYPE_APP_GAME_BOOST_EVENT,
578         RES_TYPE_APP_INSTALL_UNINSTALL,
579         RES_TYPE_MMI_INPUT_POWER_KEY,
580         RES_TYPE_CROWN_ROTATION_STATUS,
581         RES_TYPE_WEB_DRAG_RESIZE,
582         RES_TYPE_PROCESS_STATE_CHANGE,
583         RES_TYPE_REPORT_CAMERA_STATE,
584         RES_TYPE_REPORT_GAME_STATE_CHANGE,
585 #ifdef RESSCHED_RESOURCESCHEDULE_FILE_COPY_SOC_PERF_ENABLE
586         RES_TYPE_FILE_COPY_STATUS,
587 #endif
588         RES_TYPE_WEB_SLIDE_SCROLL,
589     };
590     InitOtherResTypes();
591 }
592 
InitOtherResTypes()593 void SocPerfPlugin::InitOtherResTypes()
594 {
595     resTypes.insert(RES_TYPE_REPORT_BATTERY_STATUS_CHANGE);
596     resTypes.insert(RES_TYPE_RECENT_BUILD);
597     resTypes.insert(RES_TYPE_SCHED_MODE_CHANGE);
598     resTypes.insert(RES_TYPE_RSS_CLOUD_CONFIG_UPDATE);
599     resTypes.insert(RES_TYPE_SYSTEM_ABILITY_STATUS_CHANGE);
600     if (RES_TYPE_SCENE_BOARD_ID != 0) {
601         resTypes.insert(RES_TYPE_SCENE_BOARD_ID);
602     }
603     if (RES_TYPE_RGM_BOOTING_STATUS != 0) {
604         resTypes.insert(RES_TYPE_RGM_BOOTING_STATUS);
605     }
606 }
607 
Disable()608 void SocPerfPlugin::Disable()
609 {
610     functionMap.clear();
611     for (auto resType : resTypes) {
612         PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);
613     }
614     resTypes.clear();
615     if (handle_ != nullptr) {
616         dlclose(handle_);
617         handle_ = nullptr;
618     }
619     SOC_PERF_LOGI("SocPerfPlugin::Disable success");
620 }
621 
DispatchResource(const std::shared_ptr<ResData> & data)622 void SocPerfPlugin::DispatchResource(const std::shared_ptr<ResData>& data)
623 {
624     auto funcIter = functionMap.find(data->resType);
625     if (funcIter != functionMap.end()) {
626         auto function = funcIter->second;
627         if (function) {
628             function(data);
629         }
630     }
631 }
632 
InitFeatureSwitch(std::string featureName)633 bool SocPerfPlugin::InitFeatureSwitch(std::string featureName)
634 {
635     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_FEATURE_SWITCH);
636     for (const Item& item : itemLists.itemList) {
637         for (SubItem sub : item.subItemList) {
638             if (sub.name == featureName) {
639                 return sub.value == "1";
640             }
641         }
642     }
643     PluginMgr::GetInstance().RemoveConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_FEATURE_SWITCH);
644     return false;
645 }
646 
ParsePayload(const std::shared_ptr<ResData> & data,const std::string & key)647 static int32_t ParsePayload(const std::shared_ptr<ResData>& data, const std::string& key)
648 {
649     if (!data->payload.contains(key)) {
650         return INVALID_VALUE;
651     }
652     if (data->payload.at(key).is_string()) {
653         return atoi(data->payload[key].get<std::string>().c_str());
654     }
655     if (data->payload.at(key).is_number_integer()) {
656         return data->payload[key].get<int32_t>();
657     }
658     return INVALID_VALUE;
659 }
660 
HandleAppAbilityStart(const std::shared_ptr<ResData> & data)661 void SocPerfPlugin::HandleAppAbilityStart(const std::shared_ptr<ResData>& data)
662 {
663     if (data->value == AppStartType::APP_COLD_START) {
664         if (data->payload != nullptr && data->payload.contains(PRELOAD_MODE) &&
665             atoi(data->payload[PRELOAD_MODE].get<std::string>().c_str()) == 1) {
666             SOC_PERF_LOGI("SocPerfPlugin: socperf->APP_COLD_START is invalid as preload");
667             return;
668         }
669         SOC_PERF_LOGD("SocPerfPlugin: socperf->APP_COLD_START");
670         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
671         int32_t appType = INVALID_VALUE;
672         if (reqAppTypeFunc_ != nullptr && data->payload != nullptr && data->payload.contains(BUNDLE_NAME)) {
673             std::string bundleName = data->payload[BUNDLE_NAME].get<std::string>().c_str();
674             appType = reqAppTypeFunc_(bundleName);
675             UpdateUidToAppMsgMap(data, appType, bundleName);
676         }
677         if (appType == APP_TYPE_GAME) {
678             SOC_PERF_LOGI("SocPerfPlugin: socperf->Game cold start");
679             OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_GAME_START, "");
680         }
681     } else if (data->value == AppStartType::APP_WARM_START) {
682         SOC_PERF_LOGD("SocPerfPlugin: socperf->APP_WARM_START");
683         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WARM_START, "");
684     }
685 }
686 
HandleSocperfSceneBoard(const std::shared_ptr<ResData> & data)687 bool SocPerfPlugin::HandleSocperfSceneBoard(const std::shared_ptr<ResData> &data)
688 {
689     if (data == nullptr) {
690         return false;
691     }
692     SOC_PERF_LOGD("SocPerfPlugin: socperf->ANIMATION: %{public}lld", (long long)data->value);
693     if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
694         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
695     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
696         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
697     }
698     return true;
699 }
700 
UpdateUidToAppMsgMap(const std::shared_ptr<ResData> & data,int32_t appType,const std::string & bundleName)701 bool SocPerfPlugin::UpdateUidToAppMsgMap(const std::shared_ptr<ResData>& data, int32_t appType,
702     const std::string& bundleName)
703 {
704     int32_t uid = GetUidByData(data);
705     if (appType != INVALID_VALUE && appType != INVALID_APP_TYPE && uid != INVALID_VALUE) {
706         AppKeyMessage appMsg(appType, bundleName);
707         uidToAppMsgMap_[uid] = appMsg;
708         return true;
709     }
710     return false;
711 }
712 
HandleWindowFocus(const std::shared_ptr<ResData> & data)713 void SocPerfPlugin::HandleWindowFocus(const std::shared_ptr<ResData>& data)
714 {
715     if (data->value == WindowFocusStatus::WINDOW_FOCUS) {
716         SOC_PERF_LOGD("SocPerfPlugin: socperf->WINDOW_SWITCH focus");
717         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WINDOW_SWITCH, "");
718         UpdateFocusAppType(data, true);
719     } else if (data->value == WindowFocusStatus::WINDOW_UNFOCUS) {
720         UpdateFocusAppType(data, false);
721     }
722 }
723 
UpdateWeakActionStatus()724 void SocPerfPlugin::UpdateWeakActionStatus()
725 {
726     bool status = weakActionEnable_;
727     for (const int32_t& appUid : focusAppUids_) {
728         if (uidToAppMsgMap_.find(appUid) != uidToAppMsgMap_.end()) {
729             if (keyAppName_.find(uidToAppMsgMap_[appUid].GetBundleName()) != keyAppName_.end()) {
730                 status = false;
731                 break;
732             } else if (keyAppType_.find(uidToAppMsgMap_[appUid].GetAppType()) != keyAppType_.end()) {
733                 status = false;
734                 break;
735             }
736         }
737     }
738     if (status != weakActionStatus_) {
739         weakActionStatus_ = status;
740         OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(WEAK_ACTION_MODE, weakActionStatus_);
741     }
742 }
743 
UpdateFocusAppType(const std::shared_ptr<ResData> & data,bool focusStatus)744 bool SocPerfPlugin::UpdateFocusAppType(const std::shared_ptr<ResData>& data, bool focusStatus)
745 {
746     int32_t uid = GetUidByData(data);
747     if (uid == INVALID_VALUE) {
748         return false;
749     }
750     SOC_PERF_LOGD("SocPerfPlugin: socperf->UpdateFocusAppType, %{public}d", uid);
751     if (!focusStatus) {
752         focusAppUids_.erase(uid);
753         UpdateWeakActionStatus();
754         isFocusAppsGameType_ = IsFocusAppsAllGame();
755         return true;
756     }
757     focusAppUids_.insert(uid);
758     UpdateWeakActionStatus();
759     int32_t pid = GetPidByData(data, PID_NAME);
760     if (uidToAppMsgMap_.find(uid) != uidToAppMsgMap_.end()) {
761         if (pid != INVALID_VALUE) {
762             pidToAppTypeMap_[pid] = uidToAppMsgMap_[uid].GetAppType();
763         }
764         isFocusAppsGameType_ = UpdatesFocusAppsType(uidToAppMsgMap_[uid].GetAppType());
765         return true;
766     }
767     if (reqAppTypeFunc_ == nullptr) {
768         SOC_PERF_LOGD("SocPerfPlugin: socperf->WINDOW_SWITCH reqAppTypeFunc_ is null");
769         return false;
770     }
771     std::string bundleName = GetBundleNameByUid(uid);
772     int32_t focusAppType = reqAppTypeFunc_(bundleName);
773     if (focusAppType != INVALID_VALUE && focusAppType != INVALID_APP_TYPE) {
774         if (pid != INVALID_VALUE) {
775             pidToAppTypeMap_[pid] = focusAppType;
776         }
777         AppKeyMessage appMsg(focusAppType, bundleName);
778         uidToAppMsgMap_[uid] = appMsg;
779     }
780     isFocusAppsGameType_ = UpdatesFocusAppsType(focusAppType);
781     return true;
782 }
783 
IsFocusAppsAllGame()784 bool SocPerfPlugin::IsFocusAppsAllGame()
785 {
786     if (focusAppUids_.empty() || uidToAppMsgMap_.empty()) {
787         SOC_PERF_LOGD("SocPerfPlugin: IsFoucsAppsAllGame data is empty, %{public}zu, %{public}zu",
788             focusAppUids_.size(), uidToAppMsgMap_.size());
789         return false;
790     }
791     bool isAllGame = true;
792     for (const int32_t& uid : focusAppUids_) {
793         if (uidToAppMsgMap_.find(uid) == uidToAppMsgMap_.end() ||
794             uidToAppMsgMap_[uid].GetAppType() != APP_TYPE_GAME) {
795             isAllGame = false;
796             break;
797         }
798     }
799     SOC_PERF_LOGI("SocPerfPlugin: IsFoucsAppsAllGame is %{public}d", isAllGame);
800     return isAllGame;
801 }
802 
UpdatesFocusAppsType(int32_t appType)803 bool SocPerfPlugin::UpdatesFocusAppsType(int32_t appType)
804 {
805     if (focusAppUids_.size() == 1) {
806         return appType == APP_TYPE_GAME;
807     }
808     return isFocusAppsGameType_ && (appType == APP_TYPE_GAME);
809 }
810 
GetBundleNameByUid(const int32_t uid)811 std::string SocPerfPlugin::GetBundleNameByUid(const int32_t uid)
812 {
813     std::string bundleName = "";
814     OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
815         OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
816     if (systemAbilityManager == nullptr) {
817         return bundleName;
818     }
819     OHOS::sptr<OHOS::IRemoteObject> object =
820         systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
821     sptr<AppExecFwk::IBundleMgr> iBundleMgr = OHOS::iface_cast<OHOS::AppExecFwk::IBundleMgr>(object);
822     if (!iBundleMgr) {
823         SOC_PERF_LOGD("%{public}s null bundle manager.", __func__);
824         return bundleName;
825     }
826 
827     ErrCode ret = iBundleMgr->GetNameForUid(uid, bundleName);
828     if (ret != ERR_OK) {
829         SOC_PERF_LOGE("%{public}s get bundle name failed for %{public}d, err_code:%{public}d.", __func__, uid, ret);
830     }
831     return bundleName;
832 }
833 
HandleEventClick(const std::shared_ptr<ResData> & data)834 void SocPerfPlugin::HandleEventClick(const std::shared_ptr<ResData>& data)
835 {
836     if (socperfGameBoostSwitch_ && (isFocusAppsGameType_ || IsGameEvent(data))) {
837         SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_CLICK game can not get click");
838         return;
839     }
840     if (custGameState_) {
841         SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_CLICK cust game can not get click");
842         return;
843     }
844     SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_CLICK: %{public}lld", (long long)data->value);
845     // touch down event
846     if (data->value == ClickEventType::TOUCH_EVENT_DOWN_MMI) {
847         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN, "");
848     } else if (data->value == ClickEventType::TOUCH_EVENT_DOWN) {
849         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH_DOWN, "");
850     } else if (data->value == ClickEventType::TOUCH_EVENT_UP) {
851         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH_UP, "");
852         HandleMoveEventBoost(data, false);
853     } else if (data->value == ClickEventType::CLICK_EVENT) {
854         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_CLICK, "");
855     }
856 }
857 
HandleMoveEventBoost(const std::shared_ptr<ResData> & data,bool isSet)858 bool SocPerfPlugin::HandleMoveEventBoost(const std::shared_ptr<ResData>& data, bool isSet)
859 {
860     if (data->payload == nullptr || !data->payload.contains(BUNDLE_NAME) ||
861         !data->payload[BUNDLE_NAME].is_string()) {
862         SOC_PERF_LOGE("SocPerfPlugin: socperf->MOVE_EVENT param invalid");
863         return false;
864     }
865     std::string bundleName = data->payload[BUNDLE_NAME].get<std::string>();
866     SOC_PERF_LOGD("SocPerfPlugin: socperf->MOVE_EVENT for %{public}s", bundleName.c_str());
867     if (appNameMoveEvent_.find(bundleName) != appNameMoveEvent_.end()) {
868         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_EVENT_BOOST, isSet, "");
869     }
870     return true;
871 }
872 
HandleEventKey(const std::shared_ptr<ResData> & data)873 void SocPerfPlugin::HandleEventKey(const std::shared_ptr<ResData>& data)
874 {
875     if (socperfGameBoostSwitch_ && isFocusAppsGameType_) {
876         SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_KEY game can not get key_event");
877         return;
878     }
879     SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_KEY: %{public}lld", (long long)data->value);
880     // key down event
881     if (data->value == KeyEventType::KEY_EVENT_DOWN) {
882         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_KEY_DOWN, "");
883     } else if (data->value == KeyEventType::KEY_EVENT_UP) {
884         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_KEY_DOWN, "");
885     }
886 }
887 
888 #ifdef RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
HandlePowerEventKey(const std::shared_ptr<ResData> & data)889 void SocPerfPlugin::HandlePowerEventKey(const std::shared_ptr<ResData>& data)
890 {
891     if (data == nullptr) {
892         SOC_PERF_LOGD("SocPerfPlugin: socperf->POWER_KEY null data");
893         return;
894     }
895     SOC_PERF_LOGD("SocPerfPlugin:socperf->POWER_KEY: %{public}lld", (long long)data->value);
896     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POWER_KEY, "powerkey");
897 }
898 
HandleCrownRotation(const std::shared_ptr<ResData> & data)899 void SocPerfPlugin::HandleCrownRotation(const std::shared_ptr<ResData>& data)
900 {
901     if (data == nullptr) {
902         SOC_PERF_LOGD("SocPerfPlugin: socperf->CROWN_ROTATION_STATUS null data");
903         return;
904     }
905     SOC_PERF_LOGD("SocPerfPlugin:socperf->CROWN_ROTATION_STATUS: %{public}lld", (long long)data->value);
906     if (data->value == CrownRotationStatus::CROWN_ROTATION_START) {
907         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_CROWN_ROTATION, true, "");
908     } else if (data->value == CrownRotationStatus::CROWN_ROTATION_END) {
909         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_CROWN_ROTATION, false, "");
910     }
911 }
912 #endif // RESSCHED_RESOURCESCHEDULE_CROWN_POWER_KEY_ENABLE
913 
HandleGameBoost(const std::shared_ptr<ResData> & data)914 bool SocPerfPlugin::HandleGameBoost(const std::shared_ptr<ResData>& data)
915 {
916     if (!socperfGameBoostSwitch_ || data == nullptr) {
917         SOC_PERF_LOGD("SocPerfPlugin: socperf->GAME_BOOST null data");
918         return false;
919     }
920     SOC_PERF_LOGD("SocPerfPlugin:socperf->GAME_BOOST: %{public}lld", (long long)data->value);
921     if (data->value == GameBoostState::GAME_BOOST_LEVEL0) {
922         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST, true, "");
923     } else if (data->value == GameBoostState::GAME_BOOST_LEVEL1) {
924         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST, true, "");
925         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL1, true, "");
926     } else if (data->value == GameBoostState::GAME_BOOST_LEVEL2) {
927         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST, true, "");
928         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL2, true, "");
929     } else if (data->value == GameBoostState::GAME_BOOST_LEVEL3) {
930         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST, true, "");
931         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_GAME_BOOST_LEVEL3, true, "");
932     }
933     return true;
934 }
935 
IsGameEvent(const std::shared_ptr<ResData> & data)936 bool SocPerfPlugin::IsGameEvent(const std::shared_ptr<ResData>& data)
937 {
938     int32_t pid = GetPidByData(data, CLIENT_PID_NAME);
939     if (pid == INVALID_VALUE) {
940         SOC_PERF_LOGD("SocPerfPlugin:socperf->IsGameEvent: %{public}d", pid);
941         return false;
942     }
943     return pidToAppTypeMap_[pid] == APP_TYPE_GAME;
944 }
945 
HandleUninstallEvent(const std::shared_ptr<ResData> & data)946 bool SocPerfPlugin::HandleUninstallEvent(const std::shared_ptr<ResData>& data)
947 {
948     if (data == nullptr) {
949         SOC_PERF_LOGD("SocPerfPlugin: socperf->UNINSTALL null data");
950         return false;
951     }
952     if (data->value != AppInstallStatus::APP_UNINSTALL) {
953         return false;
954     }
955     int32_t uid = INVALID_VALUE;
956     if (data->payload == nullptr || !data->payload.contains(UID_NAME) ||
957         !data->payload.at(UID_NAME).is_number_integer()) {
958         return false;
959     }
960     uid = data->payload[UID_NAME].get<std::int32_t>();
961     if (uid == INVALID_VALUE) {
962         return false;
963     }
964     SOC_PERF_LOGI("SocPerfPlugin: socperf->UNINSTALL:%{public}d", uid);
965     uidToAppMsgMap_.erase(uid);
966     return true;
967 }
968 
GetUidByData(const std::shared_ptr<ResData> & data)969 int32_t SocPerfPlugin::GetUidByData(const std::shared_ptr<ResData>& data)
970 {
971     int32_t uid = INVALID_VALUE;
972     if (data->payload == nullptr || !data->payload.contains(UID_NAME) || !data->payload.at(UID_NAME).is_string()) {
973         return uid;
974     }
975     uid = atoi(data->payload[UID_NAME].get<std::string>().c_str());
976     return uid;
977 }
978 
HandleLoadPage(const std::shared_ptr<ResData> & data)979 void SocPerfPlugin::HandleLoadPage(const std::shared_ptr<ResData>& data)
980 {
981     if (data->value == LOAD_PAGE_START) {
982         SOC_PERF_LOGD("SocPerfPlugin: socperf->PUSH_PAGE_START");
983         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, true, "");
984     } else if (data->value == LOAD_PAGE_COMPLETE) {
985         SOC_PERF_LOGD("SocPerfPlugin: socperf->PUSH_PAGE_COMPLETE");
986         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, false, "");
987         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE, "");
988     }
989 }
990 
HandlePopPage(const std::shared_ptr<ResData> & data)991 void SocPerfPlugin::HandlePopPage(const std::shared_ptr<ResData>& data)
992 {
993     SOC_PERF_LOGI("SocPerfPlugin: socperf->POP_PAGE: %{public}lld", (long long)data->value);
994     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POP_PAGE, "");
995 }
996 
HandleEventSlide(const std::shared_ptr<ResData> & data)997 void SocPerfPlugin::HandleEventSlide(const std::shared_ptr<ResData>& data)
998 {
999     if (socperfGameBoostSwitch_ && (isFocusAppsGameType_ || IsGameEvent(data))) {
1000         SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_SLIDE game can not get slide");
1001         return;
1002     }
1003     if (custGameState_) {
1004         SOC_PERF_LOGD("SocPerfPlugin: socperf->EVENT_SLIDE cust game can not get slide");
1005         return;
1006     }
1007     SOC_PERF_LOGD("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
1008     if (data->value == SlideEventStatus::SLIDE_EVENT_ON) {
1009         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_FLING, true, "");
1010     } else if (data->value == SlideEventStatus::SLIDE_EVENT_OFF) {
1011         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_FLING, false, "");
1012     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_BEGIN) {
1013         HandleContinuousDrag(data->value);
1014     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_END) {
1015         HandleContinuousDrag(data->value);
1016     } else if (data->value == SlideEventStatus::MOVE_EVENT_ON) {
1017         HandleMoveEventBoost(data, true);
1018         HandleContinuousDrag(data->value);
1019     }
1020 }
1021 
HandleContinuousDrag(int64_t dragStatus)1022 void SocPerfPlugin::HandleContinuousDrag(int64_t dragStatus)
1023 {
1024     static uint64_t lastTime = 0;
1025     auto now = std::chrono::steady_clock::now();
1026     uint64_t curMs = static_cast<uint64_t>(
1027         std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count());
1028     static int64_t lastStatus = SlideEventStatus::SLIDE_NORMAL_END;
1029     if (lastStatus == SlideEventStatus::SLIDE_NORMAL_END && dragStatus == SlideEventStatus::MOVE_EVENT_ON) {
1030         return;
1031     }
1032     lastStatus = dragStatus;
1033     if (dragStatus == SlideEventStatus::SLIDE_NORMAL_END) {
1034         lastTime = 0;
1035         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_DRAG, false, "");
1036         return;
1037     }
1038     if (curMs > lastTime && curMs - lastTime >= TIME_INTERVAL) {
1039         lastTime = curMs;
1040         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_DRAG, true, "");
1041     }
1042 }
1043 
HandleEventWebGesture(const std::shared_ptr<ResData> & data)1044 void SocPerfPlugin::HandleEventWebGesture(const std::shared_ptr<ResData>& data)
1045 {
1046     if (data == nullptr) {
1047         return;
1048     }
1049     SOC_PERF_LOGD("SocPerfPlugin: socperf->WEB_GESTURE: %{public}lld", (long long)data->value);
1050     if (data->value == WebGesture::WEB_GESTURE_START) {
1051         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, true, "");
1052     } else if (data->value == WebGesture::WEB_GESTURE_END) {
1053         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, false, "");
1054     }
1055 }
1056 
HandleResizeWindow(const std::shared_ptr<ResData> & data)1057 void SocPerfPlugin::HandleResizeWindow(const std::shared_ptr<ResData>& data)
1058 {
1059     if (data == nullptr) {
1060         return;
1061     }
1062     SOC_PERF_LOGI("SocPerfPlugin: socperf->RESIZE_WINDOW: %{public}lld", (long long)data->value);
1063     if (data->value == WindowResizeType::WINDOW_RESIZING) {
1064         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, "");
1065     } else if (data->value == WindowResizeType::WINDOW_RESIZE_STOP) {
1066         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, false, "");
1067     }
1068 }
1069 
HandleMoveWindow(const std::shared_ptr<ResData> & data)1070 void SocPerfPlugin::HandleMoveWindow(const std::shared_ptr<ResData>& data)
1071 {
1072     if (data == nullptr) {
1073         return;
1074     }
1075     SOC_PERF_LOGI("SocPerfPlugin: socperf->MOVE_WINDOW: %{public}lld", (long long)data->value);
1076     if (data->value == WindowMoveType::WINDOW_MOVING) {
1077         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOVE_WINDOW, "");
1078     } else if (data->value == WindowMoveType::WINDOW_MOVE_STOP) {
1079         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_WINDOW, false, "");
1080     }
1081 }
1082 
HandleRemoteAnimation(const std::shared_ptr<ResData> & data)1083 void SocPerfPlugin::HandleRemoteAnimation(const std::shared_ptr<ResData>& data)
1084 {
1085     SOC_PERF_LOGD("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
1086     if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
1087         SOC_PERF_LOGD("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
1088         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
1089     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
1090         SOC_PERF_LOGD("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
1091         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
1092     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_UNLOCK_BEGIN) {
1093         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_UNLOCK, true, "");
1094     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_UNLOCK_END) {
1095         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_UNLOCK, false, "");
1096     }
1097 }
1098 
HandleDragStatusBar(const std::shared_ptr<ResData> & data)1099 void SocPerfPlugin::HandleDragStatusBar(const std::shared_ptr<ResData>& data)
1100 {
1101     if (data == nullptr) {
1102         return;
1103     }
1104     SOC_PERF_LOGI("SocPerfPlugin: socperf->DRAG_STATUS_BAR: %{public}lld", (long long)data->value);
1105     if (data->value == StatusBarDragStatus::DRAG_START) {
1106         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, "");
1107     } else if (data->value == StatusBarDragStatus::DRAG_END) {
1108         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, false, "");
1109     }
1110 }
1111 
HandleWebGestureMove(const std::shared_ptr<ResData> & data)1112 void SocPerfPlugin::HandleWebGestureMove(const std::shared_ptr<ResData>& data)
1113 {
1114     if (data == nullptr) {
1115         return;
1116     }
1117     SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_GESTURE_MOVE: %{public}lld", (long long)data->value);
1118     if (data->value == WebGestureMove::WEB_GESTURE_MOVE_START) {
1119         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, true, "");
1120     } else if (data->value == WebGestureMove::WEB_GESTURE_MOVE_END) {
1121         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_GESTURE_MOVE, false, "");
1122     }
1123 }
1124 
HandleWebSlideNormal(const std::shared_ptr<ResData> & data)1125 void SocPerfPlugin::HandleWebSlideNormal(const std::shared_ptr<ResData>& data)
1126 {
1127     if (data == nullptr) {
1128         return;
1129     }
1130     SOC_PERF_LOGD("SocPerfPlugin: socperf->WEB_SLIDE_NORMAL: %{public}lld", (long long)data->value);
1131     if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_START) {
1132         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, true, "");
1133     } else if (data->value == WebSlideNormal::WEB_SLIDE_NORMAL_END) {
1134         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_NORMAL, false, "");
1135     }
1136 }
1137 
HandleLoadUrl(const std::shared_ptr<ResData> & data)1138 void SocPerfPlugin::HandleLoadUrl(const std::shared_ptr<ResData>& data)
1139 {
1140     SOC_PERF_LOGD("SocPerfPlugin: socperf->LOAD_URL");
1141     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_URL, "");
1142 }
1143 
HandleMousewheel(const std::shared_ptr<ResData> & data)1144 void SocPerfPlugin::HandleMousewheel(const std::shared_ptr<ResData>& data)
1145 {
1146     SOC_PERF_LOGI("SocPerfPlugin: socperf->MOUSEWHEEL");
1147     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOUSEWHEEL, "");
1148 }
1149 
HandleAppStateChange(const std::shared_ptr<ResData> & data)1150 bool SocPerfPlugin::HandleAppStateChange(const std::shared_ptr<ResData>& data)
1151 {
1152     if (data->value != ResType::ProcessStatus::PROCESS_CREATED) {
1153         return false;
1154     }
1155     int extensionType = ParsePayload(data, EXTENSION_TYPE_KEY);
1156     if (std::find(ResType::UI_SENSITIVE_EXTENSION.begin(), ResType::UI_SENSITIVE_EXTENSION.end(), extensionType) !=
1157         ResType::UI_SENSITIVE_EXTENSION.end()) {
1158         if (data->payload != nullptr && data->payload.contains(PRELOAD_MODE) &&
1159             atoi(data->payload[PRELOAD_MODE].get<std::string>().c_str()) == 1) {
1160             SOC_PERF_LOGI("SocPerfPlugin: socperf->APPSTATECHANGE is invalid as preload");
1161             return false;
1162         }
1163         SOC_PERF_LOGD("SocPerfPlugin: socperf->APPSTATECHANGE");
1164         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
1165         UpdateUidToAppMsgMap(data);
1166         return true;
1167     }
1168     if (data->payload.contains(BUNDLE_NAME) && data->payload.contains(CALLER_BUNDLE_NAME) &&
1169         data->payload.at(BUNDLE_NAME).is_string() && data->payload.at(CALLER_BUNDLE_NAME).is_string()) {
1170         std::string bundleName = data->payload[BUNDLE_NAME].get<std::string>();
1171         std::string callerBundleName = data->payload[CALLER_BUNDLE_NAME].get<std::string>();
1172         if (specialExtensionMap_.count(bundleName)) {
1173             std::set<std::string>& callerBundleNames = specialExtensionMap_[bundleName];
1174             if (callerBundleNames.empty() || callerBundleNames.count(callerBundleName)) {
1175                 SOC_PERF_LOGI("SocPerfPlugin: socperf->EXTENSION %{public}d,%{public}s,%{public}s",
1176                     extensionType, bundleName.c_str(), callerBundleName.c_str());
1177                 OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
1178                 return true;
1179             }
1180         }
1181     }
1182     return false;
1183 }
1184 
UpdateUidToAppMsgMap(const std::shared_ptr<ResData> & data)1185 bool SocPerfPlugin::UpdateUidToAppMsgMap(const std::shared_ptr<ResData>& data)
1186 {
1187     int32_t uid = GetUidByData(data);
1188     if (uid == INVALID_VALUE) {
1189         return false;
1190     }
1191     if (uidToAppMsgMap_.find(uid) != uidToAppMsgMap_.end()) {
1192         return true;
1193     }
1194     if (reqAppTypeFunc_ == nullptr || !data->payload.contains(BUNDLE_NAME)) {
1195         return false;
1196     }
1197     std::string bundleName = data->payload[BUNDLE_NAME].get<std::string>().c_str();
1198     int32_t appType = reqAppTypeFunc_(bundleName);
1199     if (appType != INVALID_VALUE && appType != INVALID_APP_TYPE) {
1200         AppKeyMessage appMsg(appType, bundleName);
1201         uidToAppMsgMap_[uid] = appMsg;
1202     }
1203     return true;
1204 }
1205 
HandleScreenOn()1206 void SocPerfPlugin::HandleScreenOn()
1207 {
1208     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_SCREEN_OFF, false, "");
1209     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_SCREEN_ON, true, "");
1210     if (deviceMode_ == DISPLAY_MODE_FULL) {
1211         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, true, "");
1212     } else if (deviceMode_ == DISPLAY_MODE_MAIN) {
1213         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, true, "");
1214     }  else if (deviceMode_ == DISPLAY_MODE_GLOBAL_FULL && deviceOrientation_ == DISPLAY_ORIENTAYION_LANDSCAPE) {
1215         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1216         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1217         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1218         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, true, "");
1219     } else if (deviceMode_ == DISPLAY_MODE_GLOBAL_FULL && deviceOrientation_ == DISPLAY_ORIENTAYION_PORTRAIT) {
1220         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1221         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1222         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1223         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, true, "");
1224     }
1225     const std::string screenModeOnStr = SCREEN_MODE_KEY + ":" + SCREEN_MODE_ON;
1226     OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(screenModeOnStr, true);
1227 }
1228 
HandleScreenOff()1229 void SocPerfPlugin::HandleScreenOff()
1230 {
1231     std::lock_guard<ffrt::mutex> xmlLock(screenMutex_);
1232     if (screenStatus_ == SCREEN_OFF) {
1233         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_SCREEN_ON, false, "");
1234         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_SCREEN_OFF, true, "");
1235         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1236         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1237         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1238         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1239         const std::string screenModeOffStr = SCREEN_MODE_KEY + ":" + SCREEN_MODE_OFF;
1240         OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(screenModeOffStr, true);
1241     }
1242 }
1243 
HandleScreenStatusAnalysis(const std::shared_ptr<ResData> & data)1244 bool SocPerfPlugin::HandleScreenStatusAnalysis(const std::shared_ptr<ResData>& data)
1245 {
1246     if (data == nullptr) {
1247         return false;
1248     }
1249     std::lock_guard<ffrt::mutex> xmlLock(screenMutex_);
1250     screenStatus_ = data->value;
1251     SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleScreenStatusAnalysis: %{public}lld", (long long)screenStatus_);
1252     if (screenStatus_ == SCREEN_ON) {
1253         HandleScreenOn();
1254     } else if (screenStatus_ == SCREEN_OFF) {
1255         // post screen off task with 5000 milliseconds delay, to avoid frequent screen status change.
1256         std::function<void()> screenOffFunc = [this]() {
1257             HandleScreenOff();
1258         };
1259         ffrt::submit(screenOffFunc, {}, {}, ffrt::task_attr().delay(SCREEN_OFF_TIME_DELAY));
1260     }
1261     return true;
1262 }
1263 
HandleDeviceModeStatusChange(const std::shared_ptr<ResData> & data)1264 void SocPerfPlugin::HandleDeviceModeStatusChange(const std::shared_ptr<ResData>& data)
1265 {
1266     if ((data->value != DeviceModeStatus::MODE_ENTER) && (data->value != DeviceModeStatus::MODE_QUIT)) {
1267         SOC_PERF_LOGW("SocPerfPlugin: device mode status value is error");
1268         return;
1269     }
1270 
1271     if (!data->payload.contains(DEVICE_MODE_TYPE_KEY) || !data->payload[DEVICE_MODE_TYPE_KEY].is_string() ||
1272         !data->payload.contains(DEVICE_MODE_PAYMODE_NAME) || !data->payload[DEVICE_MODE_PAYMODE_NAME].is_string()) {
1273         SOC_PERF_LOGW("SocPerfPlugin: device mode status payload is error");
1274         return;
1275     }
1276     deviceMode_ = data->payload[DEVICE_MODE_PAYMODE_NAME];
1277     bool status = (data->value == DeviceModeStatus::MODE_ENTER);
1278     const std::string deviceModeType = data->payload[DEVICE_MODE_TYPE_KEY];
1279     const std::string deviceModeStr = deviceModeType + ":" + deviceMode_;
1280     OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(deviceModeStr, status);
1281     SOC_PERF_LOGI("SocPerfPlugin: device mode %{public}s  status%{public}d", deviceModeStr.c_str(), status);
1282     HandleSceenModeBoost(deviceModeType);
1283 }
1284 
HandleSceenModeBoost(const std::string & deviceModeType)1285 bool SocPerfPlugin::HandleSceenModeBoost(const std::string& deviceModeType)
1286 {
1287     if (deviceModeType != DISPLAY_MODE_KEY) {
1288         return false;
1289     }
1290     std::lock_guard<ffrt::mutex> xmlLock(screenMutex_);
1291     if (deviceMode_ == DISPLAY_MODE_FULL && screenStatus_ == SCREEN_ON) {
1292         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1293         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, true, "");
1294         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1295         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1296     } else if (deviceMode_ == DISPLAY_MODE_MAIN && screenStatus_ == SCREEN_ON) {
1297         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1298         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1299         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1300         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, true, "");
1301     } else if (deviceMode_ == DISPLAY_MODE_GLOBAL_FULL && screenStatus_ == SCREEN_ON &&
1302         deviceOrientation_ == DISPLAY_ORIENTAYION_LANDSCAPE) {
1303         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1304         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1305         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1306         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, true, "");
1307     } else if (deviceMode_ == DISPLAY_MODE_GLOBAL_FULL && screenStatus_ == SCREEN_ON &&
1308         deviceOrientation_ == DISPLAY_ORIENTAYION_PORTRAIT) {
1309         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1310         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1311         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1312         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, true, "");
1313     }
1314 
1315     // Check if the device changes the display mode to FULL.
1316     if (deviceMode_ == DISPLAY_MODE_FULL || deviceMode_ == DISPLAY_MODE_GLOBAL_FULL) {
1317         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_SCREEN_SWITCHED, true, "");
1318     }
1319     return true;
1320 }
1321 
HandleDeviceOrientationStatusChange(const std::shared_ptr<ResData> & data)1322 void SocPerfPlugin::HandleDeviceOrientationStatusChange(const std::shared_ptr<ResData>& data)
1323 {
1324     if ((data->value != DeviceModeStatus::MODE_ENTER) && (data->value != DeviceModeStatus::MODE_QUIT)) {
1325         SOC_PERF_LOGW("SocPerfPlugin: device mode status value is error");
1326         return;
1327     }
1328 
1329     if (!data->payload.contains(DEVICE_MODE_TYPE_KEY) || !data->payload[DEVICE_MODE_TYPE_KEY].is_string() ||
1330         !data->payload.contains(DEVICE_MODE_PAYMODE_NAME) || !data->payload[DEVICE_MODE_PAYMODE_NAME].is_string()) {
1331         SOC_PERF_LOGW("SocPerfPlugin: device mode status payload is error");
1332         return;
1333     }
1334     deviceOrientation_ = data->payload[DEVICE_MODE_PAYMODE_NAME];
1335     const std::string deviceOrientationType = data->payload[DEVICE_MODE_TYPE_KEY];
1336     bool status = (data->value == DeviceModeStatus::MODE_ENTER);
1337     SOC_PERF_LOGI("SocPerfPlugin: device mode %{public}s status%{public}d", deviceOrientation_.c_str(), status);
1338     HandleSceenOrientationBoost(deviceOrientationType);
1339 }
1340 
HandleSceenOrientationBoost(const std::string & deviceOrientationType)1341 bool SocPerfPlugin::HandleSceenOrientationBoost(const std::string& deviceOrientationType)
1342 {
1343     if (deviceOrientationType != DEVICE_ORIENTATION_TYPE_KEY) {
1344         return false;
1345     }
1346 
1347     if (deviceMode_ != DISPLAY_MODE_GLOBAL_FULL) {
1348         return false;
1349     }
1350     std::lock_guard<ffrt::mutex> xmlLock(screenMutex_);
1351     if (screenStatus_ == SCREEN_ON && deviceOrientation_ == DISPLAY_ORIENTAYION_LANDSCAPE) {
1352         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1353         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1354         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, false, "");
1355         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, true, "");
1356     } else if (screenStatus_ == SCREEN_ON && deviceOrientation_ == DISPLAY_ORIENTAYION_PORTRAIT) {
1357         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_FULL, false, "");
1358         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_MODE_MAIN, false, "");
1359         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_L, false, "");
1360         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DISPLAY_GLOBAL_P, true, "");
1361     }
1362 
1363     return true;
1364 }
1365 
HandlePowerModeChanged(const std::shared_ptr<ResData> & data)1366 bool SocPerfPlugin::HandlePowerModeChanged(const std::shared_ptr<ResData> &data)
1367 {
1368     if (data == nullptr) {
1369         return false;
1370     }
1371     SOC_PERF_LOGI("SocPerfPlugin: socperf->HandlePowerModeChanged: %{public}lld", (long long)data->value);
1372     const std::string powerModeStr = POWER_MODE_KEY + ":" + POWER_MODE;
1373     if (data->value == POWERMODE_ON) {
1374         OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(powerModeStr, true);
1375     } else {
1376         OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(powerModeStr, false);
1377     }
1378     return true;
1379 }
1380 
HandleCameraStateChange(const std::shared_ptr<ResData> & data)1381 bool SocPerfPlugin::HandleCameraStateChange(const std::shared_ptr<ResData>& data)
1382 {
1383     if (data == nullptr) {
1384         return false;
1385     }
1386     SOC_PERF_LOGD("SocPerfPlugin: socperf->CAMERA_STATE_CHANGE: %{public}lld", (long long)data->value);
1387     if (data->value == CameraState::CAMERA_CONNECT) {
1388         if (IsAllowBoostScene()) {
1389             OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_USE_CAMERA, true, "");
1390         }
1391     } else if (data->value == CameraState::CAMERA_DISCONNECT) {
1392         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_USE_CAMERA, false, "");
1393     }
1394     return true;
1395 }
1396 
HandleGameStateChange(const std::shared_ptr<ResData> & data)1397 bool SocPerfPlugin::HandleGameStateChange(const std::shared_ptr<ResData>& data)
1398 {
1399     bool ret = false;
1400     if (data == nullptr || data->payload == nullptr) {
1401         return ret;
1402     }
1403     if (!data->payload.contains(UID_NAME) || !data->payload.at(UID_NAME).is_number_integer() ||
1404         !data->payload.contains(GAME_ENV) || !data->payload.at(GAME_ENV).is_number_integer()) {
1405         SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleGameStateChange invalid data");
1406         return ret;
1407     }
1408     if (data->payload[GAME_ENV] == GameEnvType::GAME_CUST) {
1409         SOC_PERF_LOGI("SocPerfPlugin: socperf->HandleGameStateChange: %{public}lld", (long long)data->value);
1410         custGameState_ = UpdateCustGameState(data);
1411     }
1412     return true;
1413 }
1414 
UpdateCustGameState(const std::shared_ptr<ResData> & data)1415 bool SocPerfPlugin::UpdateCustGameState(const std::shared_ptr<ResData>& data)
1416 {
1417     int32_t uid = data->payload[UID_NAME].get<std::int32_t>();
1418     SOC_PERF_LOGI("SocPerfPlugin: socperf->UpdateCustGameState: %{public}d", uid);
1419     if (data->value == GameState::GAME_GEE_FOCUS_STATE) {
1420         focusCustGameUids_.insert(uid);
1421         custGameState_ = true;
1422     } else if (data->value == GameState::GAME_LOST_FOCUS_STATE) {
1423         focusCustGameUids_.erase(uid);
1424         if (focusCustGameUids_.size() == 0) {
1425             custGameState_ = false;
1426         }
1427     }
1428     return custGameState_;
1429 }
1430 
IsAllowBoostScene()1431 bool SocPerfPlugin::IsAllowBoostScene()
1432 {
1433     bool ret = false;
1434     if (focusAppUids_.empty()) {
1435         return ret;
1436     }
1437 
1438     for (const int32_t& uid : focusAppUids_) {
1439         if (uidToAppMsgMap_.find(uid) != uidToAppMsgMap_.end() &&
1440             appNameUseCamera_.find(uidToAppMsgMap_[uid].GetBundleName()) != appNameUseCamera_.end()) {
1441             ret = true;
1442             break;
1443         }
1444     }
1445     return ret;
1446 }
1447 
HandleProcessStateChange(const std::shared_ptr<ResData> & data)1448 bool SocPerfPlugin::HandleProcessStateChange(const std::shared_ptr<ResData> &data)
1449 {
1450     if (data != nullptr && data->value == ResType::ProcessStatus::PROCESS_DIED) {
1451         HandleDeadProcess(data);
1452     }
1453     return true;
1454 }
1455 
HandleDeadProcess(const std::shared_ptr<ResData> & data)1456 bool SocPerfPlugin::HandleDeadProcess(const std::shared_ptr<ResData>& data)
1457 {
1458     int32_t pid = GetPidByData(data, PID_NAME);
1459     if (pid == INVALID_VALUE) {
1460         return false;
1461     }
1462     pidToAppTypeMap_.erase(pid);
1463     return true;
1464 }
1465 
GetPidByData(const std::shared_ptr<ResData> & data,const std::string & key)1466 int32_t SocPerfPlugin::GetPidByData(const std::shared_ptr<ResData>& data, const std::string& key)
1467 {
1468     if (data->payload == nullptr || !data->payload.contains(key) ||
1469         !data->payload.at(key).is_string()) {
1470         SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleDeadProcess invalid data");
1471         return INVALID_VALUE;
1472     }
1473     return atoi(data->payload[key].get<std::string>().c_str());
1474 }
1475 
HandleSocperfAccountActivating(const std::shared_ptr<ResData> & data)1476 bool SocPerfPlugin::HandleSocperfAccountActivating(const std::shared_ptr<ResData> &data)
1477 {
1478     if (data == nullptr) {
1479         return false;
1480     }
1481     SOC_PERF_LOGD("SocPerfPlugin: socperf->AccountActivating: %{public}lld", (long long)data->value);
1482     if (data->value == AccountActivatingStatus::ACCOUNT_ACTIVATING_START) {
1483         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ACCOUNT_ACTIVATING, true, "");
1484     }
1485     return true;
1486 }
1487 
1488 #ifdef RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
HandleCustEvent(const std::shared_ptr<ResData> & data)1489 bool SocPerfPlugin::HandleCustEvent(const std::shared_ptr<ResData> &data)
1490 {
1491     if (data == nullptr || data->value <= 0) {
1492         return false;
1493     }
1494     SOC_PERF_LOGD("SocPerfPlugin: socperf->Anco: %{public}lld", (long long)data->value);
1495     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(data->value, "");
1496     return true;
1497 }
1498 
HandleCustEventBegin(const std::shared_ptr<ResData> & data)1499 bool SocPerfPlugin::HandleCustEventBegin(const std::shared_ptr<ResData> &data)
1500 {
1501     if (data == nullptr || data->value <= 0) {
1502         return false;
1503     }
1504     SOC_PERF_LOGD("SocPerfPlugin: socperf->SOCPERF_CUST_EVENT_BEGIN: %{public}lld", (long long)data->value);
1505     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(data->value, true, "");
1506     return true;
1507 }
1508 
HandleCustEventEnd(const std::shared_ptr<ResData> & data)1509 bool SocPerfPlugin::HandleCustEventEnd(const std::shared_ptr<ResData> &data)
1510 {
1511     if (data == nullptr || data->value <= 0) {
1512         return false;
1513     }
1514     SOC_PERF_LOGD("SocPerfPlugin: socperf->SOCPERF_CUST_EVENT_END: %{public}lld", (long long)data->value);
1515     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(data->value, false, "");
1516     return true;
1517 }
1518 
HandleCustAction(const std::shared_ptr<ResData> & data)1519 bool SocPerfPlugin::HandleCustAction(const std::shared_ptr<ResData> &data)
1520 {
1521     if (data == nullptr || data->value <= 0 || custGameState_) {
1522         SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleCustAction error, %{public}d", custGameState_);
1523         return false;
1524     }
1525     SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleCustAction: %{public}lld", (long long)data->value);
1526     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(data->value, "");
1527     return true;
1528 }
1529 #endif // RESSCHED_RESOURCESCHEDULE_CUST_SOC_PERF_ENABLE
1530 
HandleRgmBootingStatus(const std::shared_ptr<ResData> & data)1531 bool SocPerfPlugin::HandleRgmBootingStatus(const std::shared_ptr<ResData> &data)
1532 {
1533     if (data == nullptr) {
1534         return false;
1535     }
1536     SOC_PERF_LOGD("SocPerfPlugin: socperf->RGM_BOOTING_STATUS: %{public}lld", (long long)data->value);
1537     if (data->value == 0) {
1538         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RGM_BOOTING_START, true, "");
1539     }
1540     return true;
1541 }
1542 
HandleAppColdStartEx(const std::shared_ptr<ResData> & data)1543 bool SocPerfPlugin::HandleAppColdStartEx(const std::shared_ptr<ResData> &data)
1544 {
1545     if (data == nullptr) {
1546         return false;
1547     }
1548     SOC_PERF_LOGD("SocPerfPlugin: socperf->APP_START_ONLY_PERF: %{public}lld", (long long)data->value);
1549     if (data->value == 0) {
1550         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, true, "");
1551     } else if (data->value == 1) {
1552         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, false, "");
1553     }
1554     return true;
1555 }
1556 
HandleSceneRotation(const std::shared_ptr<ResData> & data)1557 bool SocPerfPlugin::HandleSceneRotation(const std::shared_ptr<ResData> &data)
1558 {
1559     if (data == nullptr) {
1560         return false;
1561     }
1562     SOC_PERF_LOGD("SocPerfPlugin: socperf->PERF_REQUEST_CMD_ID_ROTATION: %{public}lld", (long long)data->value);
1563     if (data->value == 0) {
1564         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ROTATION, true, "");
1565     } else if (data->value == 1) {
1566         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_ROTATION, false, "");
1567     }
1568     return true;
1569 }
1570 
HandleBmmMoniterStatus(const std::shared_ptr<ResData> & data)1571 bool SocPerfPlugin::HandleBmmMoniterStatus(const std::shared_ptr<ResData> &data)
1572 {
1573     if (data == nullptr) {
1574         return false;
1575     }
1576     SOC_PERF_LOGD("SocPerfPlugin: socperf->PERF_REQUEST_CMD_ID_BMM_MONITER_CHANGE: %{public}lld",
1577         (long long)data->value);
1578     if (data->value == BmmMoniterStatus::BMM_BACKGROUND) {
1579         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_BMM_MONITER_START, true, "");
1580         return true;
1581     }
1582     if (data->value == BmmMoniterStatus::BMM_CLOSE) {
1583         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_BMM_MONITER_START, false, "");
1584         return true;
1585     }
1586     return false;
1587 }
1588 
HandleWebDragResize(const std::shared_ptr<ResData> & data)1589 void SocPerfPlugin::HandleWebDragResize(const std::shared_ptr<ResData>& data)
1590 {
1591     if (data == nullptr) {
1592         return;
1593     }
1594     SOC_PERF_LOGI("SocPerfPlugin: socperf->WEB_DRAG_RESIZE: %{public}lld", (long long)data->value);
1595     if (data->value == WebDragResizeStatus::WEB_DRAG_START) {
1596         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WEB_DRAG_RESIZE, "");
1597     } else if (data->value == WebDragResizeStatus::WEB_DRAG_END) {
1598         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_DRAG_RESIZE, false, "");
1599     }
1600 }
1601 
1602 #ifdef RESSCHED_RESOURCESCHEDULE_FILE_COPY_SOC_PERF_ENABLE
HandleFileCopyStatus(const std::shared_ptr<ResData> & data)1603 bool SocPerfPlugin::HandleFileCopyStatus(const std::shared_ptr<ResData> &data)
1604 {
1605     if (data == nullptr) {
1606         return false;
1607     }
1608     SOC_PERF_LOGD("SocPerfPlugin: socperf->COPY_STATUS: %{public}lld", (long long)data->value);
1609     if (data->value == CopyStatus::COPY_START) {
1610         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_FILE_COPY, true, "");
1611         return true;
1612     }
1613     if (data->value == CopyStatus::COPY_STOP) {
1614         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_FILE_COPY, false, "");
1615         return true;
1616     }
1617     return false;
1618 }
1619 #endif
1620 
HandleWebSildeScroll(const std::shared_ptr<ResData> & data)1621 void SocPerfPlugin::HandleWebSildeScroll(const std::shared_ptr<ResData>& data)
1622 {
1623     if (data == nullptr) {
1624         return;
1625     }
1626     SOC_PERF_LOGD("SocPerfPlugin: socperf->WEB_SLIDE_SCROLL: %{public}lld", (long long)data->value);
1627     if (data->value == WebDragResizeStatus::WEB_DRAG_START) {
1628         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_SCROLL, true, "");
1629     }
1630     if (data->value == WebDragResizeStatus::WEB_DRAG_END) {
1631         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_WEB_SLIDE_SCROLL, false, "");
1632     }
1633 }
1634 
HandleRecentBuild(const std::shared_ptr<ResData> & data)1635 bool SocPerfPlugin::HandleRecentBuild(const std::shared_ptr<ResData>& data)
1636 {
1637     if (data == nullptr) {
1638         return false;
1639     }
1640     SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleRecentBuild: %{public}lld", (long long)data->value);
1641     if (data->value == RecentBuildStatus::RECENT_BUILD_START) {
1642         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RECENT_BUILD, true, "");
1643     } else if (data->value == RecentBuildStatus::RECENT_BUILD_STOP) {
1644         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RECENT_BUILD, false, "");
1645     }
1646     return true;
1647 }
1648 
HandleSchedModeChange(const std::shared_ptr<ResData> & data)1649 bool SocPerfPlugin::HandleSchedModeChange(const std::shared_ptr<ResData>& data)
1650 {
1651     bool ret = false;
1652     if (data == nullptr) {
1653         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleSchedModeChange invalid data");
1654         return ret;
1655     }
1656     if (data->payload == nullptr || !data->payload.contains(SCHED_MODE_KEY)) {
1657         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleSchedModeChange invalid data payload");
1658         return ret;
1659     }
1660     SchedMode schedMode = static_cast<SchedMode>(data->value);
1661     std::string schedModeStr = data->payload[SCHED_MODE_KEY];
1662     const std::string powerStatusStr = POWER_STATUS_KEY + ":" + schedModeStr;
1663     SOC_PERF_LOGI("SocPerfPlugin: socperf->HandleSchedModeChange, schedMode:%{public}d modeStr:%{public}s",
1664         schedMode, powerStatusStr.c_str());
1665     OHOS::SOCPERF::SocPerfClient::GetInstance().RequestDeviceMode(powerStatusStr, true);
1666     return true;
1667 }
1668 
HandleBatteryStatusChange(const std::shared_ptr<ResData> & data)1669 bool SocPerfPlugin::HandleBatteryStatusChange(const std::shared_ptr<ResData>& data)
1670 {
1671     bool ret = false;
1672     if (data == nullptr || socperfBatteryConfig_.empty()) {
1673         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleBatteryStatusChange invalid data");
1674         return ret;
1675     }
1676     if (data->payload == nullptr || !data->payload.contains(COMMON_EVENT_CHARGE_STATE) ||
1677         !data->payload.at(COMMON_EVENT_CHARGE_STATE).is_number_integer()) {
1678         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleBatteryStatusChange invalid data payload");
1679         return ret;
1680     }
1681     SOC_PERF_LOGD("SocPerfPlugin: socperf->HandleBatteryStatusChange: %{public}lld", (long long)data->value);
1682     int32_t chargeState = data->payload[COMMON_EVENT_CHARGE_STATE];
1683     if (chargeState == static_cast<int32_t>(BatteryChargeState::CHARGE_STATE_ENABLE) ||
1684         chargeState == static_cast<int32_t>(BatteryChargeState::CHARGE_STATE_FULL)) {
1685         ret = HandleFreqLimit(data, true);
1686     } else {
1687         ret = HandleFreqLimit(data, false);
1688     }
1689     return ret;
1690 }
1691 
HandleFreqLimit(const std::shared_ptr<ResData> & data,bool isChargeState)1692 bool SocPerfPlugin::HandleFreqLimit(const std::shared_ptr<ResData>& data, bool isChargeState)
1693 {
1694     if (data->value > maxBatteryLimitCapacity_ || isChargeState) {
1695         HandleRecoverBatteryLimit();
1696     } else {
1697         HandleBatteryLimit(data->value);
1698     }
1699     return true;
1700 }
1701 
GetLimitCapacity(int32_t capacity)1702 int32_t SocPerfPlugin::GetLimitCapacity(int32_t capacity)
1703 {
1704     int32_t tempCap = maxBatteryLimitCapacity_;
1705     for (const auto& pair : socperfBatteryConfig_) {
1706         if (pair.first >= capacity && pair.first <= tempCap) {
1707             tempCap = pair.first;
1708         }
1709     }
1710     return tempCap;
1711 }
1712 
GetConfigs(int32_t size)1713 std::vector<int64_t> SocPerfPlugin::GetConfigs(int32_t size)
1714 {
1715     std::vector<int64_t> configs(size, std::numeric_limits<int32_t>::max());
1716     return configs;
1717 }
1718 
HandleRecoverBatteryLimit()1719 bool SocPerfPlugin::HandleRecoverBatteryLimit()
1720 {
1721     if (lastBatteryLimitCap_ == -1) {
1722         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleRecoverLimit no need to recover limit");
1723         return false;
1724     }
1725     SOC_PERF_LOGI("SocPerfPlugin: socperf->HandleRecoverLimit recover limit on %{public}d", lastBatteryLimitCap_);
1726     OHOS::SOCPERF::SocPerfClient::GetInstance().PowerLimitBoost(false, "type=Low_battery_limit");
1727     OHOS::SOCPERF::SocPerfClient::GetInstance().LimitRequest(OHOS::SOCPERF::ActionType::ACTION_TYPE_BATTERY,
1728         socperfBatteryConfig_[lastBatteryLimitCap_].tags,
1729         GetConfigs(socperfBatteryConfig_[lastBatteryLimitCap_].configs.size()),
1730         "type=Low_battery_limit");
1731     lastBatteryLimitCap_ = -1;
1732     return true;
1733 }
1734 
HandleBatteryLimit(int32_t capacity)1735 bool SocPerfPlugin::HandleBatteryLimit(int32_t capacity)
1736 {
1737     int32_t limitCapacity = GetLimitCapacity(capacity);
1738     if (lastBatteryLimitCap_ == limitCapacity) {
1739         SOC_PERF_LOGE("SocPerfPlugin: socperf->HandleBatteryLimit already trigger: %{public}d", limitCapacity);
1740         return false;
1741     }
1742     SOC_PERF_LOGI("SocPerfPlugin: socperf->HandleBatteryLimit limit on %{public}d", limitCapacity);
1743     OHOS::SOCPERF::SocPerfClient::GetInstance().PowerLimitBoost(true, "type=Low_battery_limit");
1744     OHOS::SOCPERF::SocPerfClient::GetInstance().LimitRequest(OHOS::SOCPERF::ActionType::ACTION_TYPE_BATTERY,
1745         socperfBatteryConfig_[limitCapacity].tags,
1746         socperfBatteryConfig_[limitCapacity].configs,
1747         "type=Low_battery_limit");
1748     lastBatteryLimitCap_ = limitCapacity;
1749     return true;
1750 }
1751 
HandleRssCloudConfigUpdate(const std::shared_ptr<ResData> & data)1752 bool SocPerfPlugin::HandleRssCloudConfigUpdate(const std::shared_ptr<ResData>& data)
1753 {
1754     if (data == nullptr ||
1755         data->payload.is_null() ||
1756         !data->payload.contains(CLOUD_PARAMS) ||
1757         !data->payload[CLOUD_PARAMS].is_object()) {
1758         return false;
1759     }
1760 
1761     if (!data->payload[CLOUD_PARAMS].contains(PLUGIN_NAME) ||
1762         !data->payload[CLOUD_PARAMS].at(PLUGIN_NAME).is_object()) {
1763         return false;
1764     }
1765 
1766     PluginConfigMap pluginConfigs = (data->payload)[CLOUD_PARAMS][PLUGIN_NAME].get<PluginConfigMap>();
1767     if (pluginConfigs.find(SPECIAL_EXTENSION_STRING) != pluginConfigs.end()) {
1768         LoadSpecialExtension(pluginConfigs[SPECIAL_EXTENSION_STRING]);
1769     }
1770     if (pluginConfigs.find(WEAK_ACTION_STRING) != pluginConfigs.end()) {
1771         LoadWeakInterAction(pluginConfigs[WEAK_ACTION_STRING]);
1772     }
1773     return true;
1774 }
1775 
ReportConfiguredLimitBoost(std::optional<bool> & powerLimit,std::optional<bool> & thermalLimit)1776 static void ReportConfiguredLimitBoost(std::optional<bool>& powerLimit, std::optional<bool>& thermalLimit)
1777 {
1778     if (powerLimit) {
1779         OHOS::SOCPERF::SocPerfClient::GetInstance().PowerLimitBoost(*powerLimit, "type=policy_config");
1780     }
1781     if (thermalLimit) {
1782         OHOS::SOCPERF::SocPerfClient::GetInstance().PowerLimitBoost(*thermalLimit, "type=policy_config");
1783     }
1784 }
ReportAbilityStatus(const std::shared_ptr<ResData> & data)1785 bool SocPerfPlugin::ReportAbilityStatus(const std::shared_ptr<ResData>& data)
1786 {
1787     if (data == nullptr || data->payload == nullptr) {
1788         return false;
1789     }
1790 
1791     if (!data->payload.contains("saId") || !data->payload.at("saId").is_number_integer()) {
1792         return false;
1793     }
1794 
1795     int32_t saId = data->payload["saId"].get<int32_t>();
1796     if (saId == SOC_PERF_SA_ID && data->value > 0) {
1797         SOC_PERF_LOGI("SocPerfPlugin: socperf start");
1798         UpdateWeakActionStatus();
1799         ReportConfiguredLimitBoost(powerLimit_, thermalLimit_);
1800         return true;
1801     }
1802     return false;
1803 }
1804 
OnPluginInit(std::string & libName)1805 extern "C" bool OnPluginInit(std::string& libName)
1806 {
1807     if (libName != LIB_NAME) {
1808         SOC_PERF_LOGE("SocPerfPlugin::OnPluginInit lib name is not match");
1809         return false;
1810     }
1811     SocPerfPlugin::GetInstance().Init();
1812     return true;
1813 }
1814 
OnPluginDisable()1815 extern "C" void OnPluginDisable()
1816 {
1817     SocPerfPlugin::GetInstance().Disable();
1818 }
1819 
OnDispatchResource(const std::shared_ptr<ResData> & data)1820 extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
1821 {
1822     SocPerfPlugin::GetInstance().DispatchResource(data);
1823 }
1824 } // namespace ResourceSchedule
1825 } // namespace OHOS
1826 #endif // RESSCHED_RESOURCESCHEDULE_SOC_PERF_ENABLE
1827