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