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