• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 
19 #include "app_mgr_constants.h"
20 
21 #include "res_type.h"
22 #include "res_sched_log.h"
23 #include "plugin_mgr.h"
24 #include "config_info.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 SUB_ITEM_KEY_NAME_SOCPERF_ON_DEMAND = "socperf_on_demand";
34     const int32_t PERF_REQUEST_CMD_ID_APP_START             = 10000;
35     const int32_t PERF_REQUEST_CMD_ID_WARM_START            = 10001;
36     const int32_t PERF_REQUEST_CMD_ID_WINDOW_SWITCH         = 10002;
37     const int32_t PERF_REQUEST_CMD_ID_EVENT_CLICK           = 10006;
38     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_START       = 10007;
39     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE           = 10008;
40     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER      = 10009;
41     const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH           = 10010;
42     const int32_t PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE    = 10011;
43     const int32_t PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE     = 10012;
44     const int32_t PERF_REQUEST_CMD_ID_POP_PAGE              = 10016;
45     const int32_t PERF_REQUEST_CMD_ID_RESIZE_WINDOW         = 10018;
46     const int32_t PERF_REQUEST_CMD_ID_MOVE_WINDOW           = 10019;
47     const int32_t PERF_REQUEST_CMD_ID_REMOTE_ANIMATION      = 10030;
48     const int32_t PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR       = 10034;
49 }
IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)50 IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)
51 
52 void SocPerfPlugin::Init()
53 {
54     functionMap = {
55         { RES_TYPE_WINDOW_FOCUS,
56             [this](const std::shared_ptr<ResData>& data) { HandleWindowFocus(data); } },
57         { RES_TYPE_CLICK_RECOGNIZE,
58             [this](const std::shared_ptr<ResData>& data) { HandleEventClick(data); } },
59         { RES_TYPE_LOAD_PAGE,
60             [this](const std::shared_ptr<ResData>& data) { HandleLoadPage(data); } },
61         { RES_TYPE_SLIDE_RECOGNIZE,
62             [this](const std::shared_ptr<ResData>& data) { HandleEventSlide(data); } },
63         { RES_TYPE_WEB_GESTURE,
64             [this](const std::shared_ptr<ResData>& data) { HandleEventWebGesture(data); } },
65         { RES_TYPE_POP_PAGE,
66             [this](const std::shared_ptr<ResData>& data) { HandlePopPage(data); } },
67         { RES_TYPE_APP_ABILITY_START,
68             [this](const std::shared_ptr<ResData>& data) { HandleAppAbilityStart(data); } },
69         { RES_TYPE_RESIZE_WINDOW,
70             [this](const std::shared_ptr<ResData>& data) { HandleResizeWindow(data); } },
71         { RES_TYPE_MOVE_WINDOW,
72             [this](const std::shared_ptr<ResData>& data) { HandleMoveWindow(data); } },
73         { RES_TYPE_SHOW_REMOTE_ANIMATION,
74                 [this](const std::shared_ptr<ResData>& data) { HandleRemoteAnimation(data); } },
75         { RES_TYPE_DRAG_STATUS_BAR,
76             [this](const std::shared_ptr<ResData>& data) { HandleDragStatusBar(data); } },
77     };
78     resTypes = {
79         RES_TYPE_WINDOW_FOCUS,
80         RES_TYPE_CLICK_RECOGNIZE,
81         RES_TYPE_LOAD_PAGE,
82         RES_TYPE_SLIDE_RECOGNIZE,
83         RES_TYPE_WEB_GESTURE,
84         RES_TYPE_POP_PAGE,
85         RES_TYPE_APP_ABILITY_START,
86         RES_TYPE_RESIZE_WINDOW,
87         RES_TYPE_MOVE_WINDOW,
88         RES_TYPE_SHOW_REMOTE_ANIMATION,
89         RES_TYPE_DRAG_STATUS_BAR,
90     };
91     for (auto resType : resTypes) {
92         PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);
93     }
94     socperfOnDemandSwitch_ = InitFeatureSwitch(SUB_ITEM_KEY_NAME_SOCPERF_ON_DEMAND);
95     RESSCHED_LOGI("SocPerfPlugin::Init success");
96 }
97 
Disable()98 void SocPerfPlugin::Disable()
99 {
100     functionMap.clear();
101     for (auto resType : resTypes) {
102         PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);
103     }
104     resTypes.clear();
105     RESSCHED_LOGI("SocPerfPlugin::Disable success");
106 }
107 
DispatchResource(const std::shared_ptr<ResData> & data)108 void SocPerfPlugin::DispatchResource(const std::shared_ptr<ResData>& data)
109 {
110     auto funcIter = functionMap.find(data->resType);
111     if (funcIter != functionMap.end()) {
112         auto function = funcIter->second;
113         if (function) {
114             function(data);
115         }
116     }
117 }
118 
InitFeatureSwitch(std::string featureName)119 bool SocPerfPlugin::InitFeatureSwitch(std::string featureName)
120 {
121     PluginConfig itemLists = PluginMgr::GetInstance().GetConfig(PLUGIN_NAME, CONFIG_NAME_SOCPERF_FEATURE_SWITCH);
122     for (const Item& item : itemLists.itemList) {
123         for (SubItem sub : item.subItemList) {
124             if (sub.name == featureName) {
125                 return sub.value == "1";
126             }
127         }
128     }
129     return false;
130 }
131 
HandleAppAbilityStart(const std::shared_ptr<ResData> & data)132 void SocPerfPlugin::HandleAppAbilityStart(const std::shared_ptr<ResData>& data)
133 {
134     if (data->value == AppStartType::APP_COLD_START) {
135         RESSCHED_LOGI("SocPerfPlugin: socperf->APP_COLD_START");
136         if (socperfOnDemandSwitch_) {
137             OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, true, "");
138         } else {
139             OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
140         }
141     } else if (data->value == AppStartType::APP_WARM_START) {
142         RESSCHED_LOGI("SocPerfPlugin: socperf->APP_WARM_START");
143         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WARM_START, "");
144     }
145 }
146 
HandleWindowFocus(const std::shared_ptr<ResData> & data)147 void SocPerfPlugin::HandleWindowFocus(const std::shared_ptr<ResData>& data)
148 {
149     if (data->value == WindowFocusStatus::WINDOW_FOCUS) {
150         RESSCHED_LOGI("SocPerfPlugin: socperf->WINDOW_SWITCH");
151         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WINDOW_SWITCH, "");
152     }
153 }
154 
HandleEventClick(const std::shared_ptr<ResData> & data)155 void SocPerfPlugin::HandleEventClick(const std::shared_ptr<ResData>& data)
156 {
157     RESSCHED_LOGI("SocPerfPlugin: socperf->EVENT_CLICK: %{public}lld", (long long)data->value);
158     if (data->value == ClickEventType::TOUCH_EVENT) {
159         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH, "");
160     } else if (data->value == ClickEventType::CLICK_EVENT) {
161         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_CLICK, "");
162     }
163 }
164 
HandleLoadPage(const std::shared_ptr<ResData> & data)165 void SocPerfPlugin::HandleLoadPage(const std::shared_ptr<ResData>& data)
166 {
167     if (data->value == LOAD_PAGE_START) {
168         RESSCHED_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_START");
169         if (socperfOnDemandSwitch_) {
170             OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_APP_START, false, "");
171         }
172         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, true, "");
173     } else if (data->value == LOAD_PAGE_COMPLETE) {
174         RESSCHED_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_COMPLETE");
175         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_LOAD_PAGE_START, false, "");
176         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_LOAD_PAGE_COMPLETE, "");
177     }
178 }
179 
HandlePopPage(const std::shared_ptr<ResData> & data)180 void SocPerfPlugin::HandlePopPage(const std::shared_ptr<ResData>& data)
181 {
182     RESSCHED_LOGI("SocPerfPlugin: socperf->POP_PAGE: %{public}lld", (long long)data->value);
183     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POP_PAGE, "");
184 }
185 
HandleEventSlide(const std::shared_ptr<ResData> & data)186 void SocPerfPlugin::HandleEventSlide(const std::shared_ptr<ResData>& data)
187 {
188     RESSCHED_LOGI("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
189     if (data->value == SlideEventStatus::SLIDE_EVENT_ON) {
190         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, true, "");
191     } else if (data->value == SlideEventStatus::SLIDE_EVENT_OFF) {
192         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, false, "");
193     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_BEGIN) {
194         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, "");
195     } else if (data->value == SlideEventStatus::SLIDE_NORMAL_END) {
196         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, false, "");
197     }
198 }
199 
HandleEventWebGesture(const std::shared_ptr<ResData> & data)200 void SocPerfPlugin::HandleEventWebGesture(const std::shared_ptr<ResData>& data)
201 {
202     RESSCHED_LOGI("SocPerfPlugin: socperf->WEB_GESTURE: %{public}lld", (long long)data->value);
203     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, true, "");
204 }
205 
HandleResizeWindow(const std::shared_ptr<ResData> & data)206 void SocPerfPlugin::HandleResizeWindow(const std::shared_ptr<ResData>& data)
207 {
208     if (data == nullptr) {
209         return;
210     }
211     RESSCHED_LOGI("SocPerfPlugin: socperf->RESIZE_WINDOW: %{public}lld", (long long)data->value);
212     if (data->value == WindowResizeType::WINDOW_RESIZING) {
213         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, "");
214     } else if (data->value == WindowResizeType::WINDOW_RESIZE_STOP) {
215         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, false, "");
216     }
217 }
218 
HandleMoveWindow(const std::shared_ptr<ResData> & data)219 void SocPerfPlugin::HandleMoveWindow(const std::shared_ptr<ResData>& data)
220 {
221     if (data == nullptr) {
222         return;
223     }
224     RESSCHED_LOGI("SocPerfPlugin: socperf->MOVE_WINDOW: %{public}lld", (long long)data->value);
225     if (data->value == WindowMoveType::WINDOW_MOVING) {
226         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOVE_WINDOW, "");
227     } else if (data->value == WindowMoveType::WINDOW_MOVE_STOP) {
228         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_WINDOW, false, "");
229     }
230 }
231 
HandleRemoteAnimation(const std::shared_ptr<ResData> & data)232 void SocPerfPlugin::HandleRemoteAnimation(const std::shared_ptr<ResData>& data)
233 {
234     if (!socperfOnDemandSwitch_) {
235         return;
236     }
237     if (data->value == ShowRemoteAnimationStatus::ANIMATION_BEGIN) {
238         RESSCHED_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
239         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, true, "");
240     } else if (data->value == ShowRemoteAnimationStatus::ANIMATION_END) {
241         RESSCHED_LOGI("SocPerfPlugin: socperf->REMOTE_ANIMATION: %{public}lld", (long long)data->value);
242         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_REMOTE_ANIMATION, false, "");
243     }
244 }
245 
HandleDragStatusBar(const std::shared_ptr<ResData> & data)246 void SocPerfPlugin::HandleDragStatusBar(const std::shared_ptr<ResData>& data)
247 {
248     if (data == nullptr) {
249         return;
250     }
251     RESSCHED_LOGI("SocPerfPlugin: socperf->DRAG_STATUS_BAR: %{public}lld", (long long)data->value);
252     if (data->value == StatusBarDragStatus::DRAG_START) {
253         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, "");
254     } else if (data->value == StatusBarDragStatus::DRAG_END) {
255         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_DRAG_STATUS_BAR, false, "");
256     }
257 }
258 
OnPluginInit(std::string & libName)259 extern "C" bool OnPluginInit(std::string& libName)
260 {
261     if (libName != LIB_NAME) {
262         RESSCHED_LOGE("SocPerfPlugin::OnPluginInit lib name is not match");
263         return false;
264     }
265     SocPerfPlugin::GetInstance().Init();
266     return true;
267 }
268 
OnPluginDisable()269 extern "C" void OnPluginDisable()
270 {
271     SocPerfPlugin::GetInstance().Disable();
272 }
273 
OnDispatchResource(const std::shared_ptr<ResData> & data)274 extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
275 {
276     SocPerfPlugin::GetInstance().DispatchResource(data);
277 }
278 } // namespace ResourceSchedule
279 } // namespace OHOS
280 #endif // RESSCHED_RESOURCESCHEDULE_SOC_PERF_ENABLE