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 #include "res_sched_mgr.h"
17
18 #include <cinttypes>
19 #include <map>
20
21 #include "cgroup_sched.h"
22 #include "notifier_mgr.h"
23 #include "res_exe_type.h"
24 #include "res_sched_exe_client.h"
25 #include "res_sched_log.h"
26 #include "res_type.h"
27 #include "plugin_mgr.h"
28 #include "hitrace_meter.h"
29 #include "scene_recognizer_mgr.h"
30
31 namespace OHOS {
32 namespace ResourceSchedule {
33 using namespace AppExecFwk;
34 namespace {
35 const std::map<uint32_t, std::string> resTypeToStr = {
36 { ResType::SYNC_RES_TYPE_THAW_ONE_APP, "SYNC_RES_TYPE_THAW_ONE_APP"},
37 { ResType::SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE, "SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE"},
38 { ResType::SYNC_RES_TYPE_GET_THERMAL_DATA, "SYNC_RES_TYPE_GET_THERMAL_DATA"},
39 { ResType::RES_TYPE_SCREEN_STATUS, "SCREEN_STATUS" },
40 { ResType::RES_TYPE_APP_STATE_CHANGE, "APP_STATE_CHANGE" },
41 { ResType::RES_TYPE_ABILITY_STATE_CHANGE, "ABILITY_STATE_CHANGE" },
42 { ResType::RES_TYPE_EXTENSION_STATE_CHANGE, "EXTENSION_STATE_CHANGE" },
43 { ResType::RES_TYPE_PROCESS_STATE_CHANGE, "PROCESS_STATE_CHANGE" },
44 { ResType::RES_TYPE_WINDOW_FOCUS, "WINDOW_FOCUS" },
45 { ResType::RES_TYPE_TRANSIENT_TASK, "TRANSIENT_TASK" },
46 { ResType::RES_TYPE_CONTINUOUS_TASK, "CONTINUOUS_TASK" },
47 { ResType::RES_TYPE_CGROUP_ADJUSTER, "CGROUP_ADJUSTER" },
48 { ResType::RES_TYPE_CLICK_RECOGNIZE, "CLICK_RECOGNIZE" },
49 { ResType::RES_TYPE_PUSH_PAGE, "PUSH_PAGE" },
50 { ResType::RES_TYPE_SLIDE_RECOGNIZE, "SLIDE_RECOGNIZE" },
51 { ResType::RES_TYPE_WINDOW_VISIBILITY_CHANGE, "WINDOW_VISIBILITY_CHANGE" },
52 { ResType::RES_TYPE_REPORT_MMI_PROCESS, "REPORT_MMI_PROCESS" },
53 { ResType::RES_TYPE_REPORT_RENDER_THREAD, "REPORT_RENDER_THREAD" },
54 { ResType::RES_TYPE_APP_INSTALL_UNINSTALL, "APP_INSTALL_UNINSTALL" },
55 { ResType::RES_TYPE_WIFI_CONNECT_STATE_CHANGE, "WIFI_CONNECT_STATE_CHANGE" },
56 { ResType::RES_TYPE_USER_SWITCH, "USER_SWITCH" },
57 { ResType::RES_TYPE_USER_REMOVE, "USER_REMOVE" },
58 { ResType::RES_TYPE_SCREEN_LOCK, "SCREEN_LOCK" },
59 { ResType::RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE, "BLUETOOTH_A2DP_CONNECT_STATE_CHANGE" },
60 { ResType::RES_TYPE_NETWORK_LATENCY_REQUEST, "NETWORK_LATENCY_REQUEST" },
61 { ResType::RES_TYPE_CALL_STATE_UPDATE, "CALL_STATE_UPDATE" },
62 { ResType::RES_TYPE_THREAD_QOS_CHANGE, "THREAD_QOS_CHANGE" },
63 { ResType::RES_TYPE_AUDIO_RENDER_STATE_CHANGE, "AUDIO_RENDER_STATE_CHANGE" },
64 { ResType::RES_TYPE_AUDIO_RING_MODE_CHANGE, "AUDIO_RING_MODE_CHANGE" },
65 { ResType::RES_TYPE_AUDIO_VOLUME_KEY_CHANGE, "AUDIO_VOLUME_KEY_CHANGE" },
66 { ResType::RES_TYPE_APP_ABILITY_START, "APP_ABILITY_START" },
67 { ResType::RES_TYPE_POP_PAGE, "POP_PAGE" },
68 { ResType::RES_TYPE_WEB_GESTURE, "WEB_GESTURE" },
69 { ResType::RES_TYPE_DEVICE_STILL_STATE_CHANGE, "DEVICE_STILL_STATE_CHANGE" },
70 { ResType::RES_TYPE_RESIZE_WINDOW, "RES_TYPE_RESIZE_WINDOW" },
71 { ResType::RES_TYPE_MOVE_WINDOW, "RES_TYPE_MOVE_WINDOW" },
72 { ResType::RES_TYPE_SHOW_REMOTE_ANIMATION, "RES_TYPE_SHOW_REMOTE_ANIMATION" },
73 { ResType::RES_TYPE_LOAD_PAGE, "RES_TYPE_LOAD_PAGE" },
74 { ResType::RES_TYPE_REPORT_CAMERA_STATE, "RES_TYPE_REPORT_CAMERA_STATE" },
75 { ResType::RES_TYPE_RUNNINGLOCK_STATE, "RES_TYPE_RUNNINGLOCK_STATE" },
76 { ResType::RES_TYPE_DRAG_STATUS_BAR, "RES_TYPE_DRAG_STATUS_BAR" },
77 { ResType::RES_TYPE_REPORT_SCENE_BOARD, "RES_TYPE_REPORT_SCENE_BOARD" },
78 { ResType::RES_TYPE_REPORT_KEY_THREAD, "RES_TYPE_REPORT_KEY_THREAD" },
79 { ResType::RES_TYPE_REPORT_WINDOW_STATE, "RES_TYPE_REPORT_WINDOW_STATE" },
80 { ResType::RES_TYPE_REPORT_SCENE_SCHED, "RES_TYPE_REPORT_SCENE_SCHED" },
81 { ResType::RES_TYPE_WEB_GESTURE_MOVE, "RES_TYPE_WEB_GESTURE_MOVE" },
82 { ResType::RES_TYPE_WEB_SLIDE_NORMAL, "RES_TYPE_WEB_SLIDE_NORMAL" },
83 { ResType::RES_TYPE_LOAD_URL, "RES_TYPE_LOAD_URL" },
84 { ResType::RES_TYPE_MOUSEWHEEL, "RES_TYPE_MOUSEWHEEL" },
85 { ResType::RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE" },
86 { ResType::RES_TYPE_MMI_INPUT_STATE, "RES_TYPE_MMI_INPUT_STATE" },
87 { ResType::RES_TYPE_ANCO_CUST, "RES_TYPE_ANCO_CUST" },
88 { ResType::RES_TYPE_TIMEZONE_CHANGED, "RES_TYPE_TIMEZONE_CHANGED" },
89 { ResType::RES_TYPE_TIME_CHANGED, "RES_TYPE_TIME_CHANGED" },
90 { ResType::RES_TYPE_NITZ_TIME_CHANGED, "RES_TYPE_NITZ_TIME_CHANGED" },
91 { ResType::RES_TYPE_NITZ_TIMEZONE_CHANGED, "RES_TYPE_NITZ_TIMEZONE_CHANGED" },
92 { ResType::RES_TYPE_CHARGING_DISCHARGING, "RES_TYPE_CHARGING_DISCHARGING" },
93 { ResType::RES_TYPE_USB_DEVICE, "RES_TYPE_USB_DEVICE" },
94 { ResType::RES_TYPE_CALL_STATE_CHANGED, "RES_TYPE_CALL_STATE_CHANGED" },
95 { ResType::RES_TYPE_WIFI_P2P_STATE_CHANGED, "RES_TYPE_WIFI_P2P_STATE_CHANGED" },
96 { ResType::RES_TYPE_CONNECTION_OBSERVER, "RES_TYPE_CONNECTION_OBSERVER" },
97 { ResType::RES_TYPE_AV_SESSION_ON_SESSION_CREATE, "RES_TYPE_AV_SESSION_ON_SESSION_CREATE" },
98 { ResType::RES_TYPE_AV_SESSION_ON_SESSION_RELEASE, "RES_TYPE_AV_SESSION_ON_SESSION_RELEASE" },
99 { ResType::RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE, "RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE" },
100 { ResType::RES_TYPE_ON_APP_STATE_CHANGED, "RES_TYPE_ON_APP_STATE_CHANGED" },
101 { ResType::RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED, "RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED" },
102 { ResType::RES_TYPE_AV_CODEC_STATE, "RES_TYPE_AV_CODEC_STATE" },
103 { ResType::RES_TYPE_APP_ASSOCIATED_START, "RES_TYPE_APP_ASSOCIATED_START" },
104 { ResType::RES_TYPE_THERMAL_STATE, "RES_TYPE_THERMAL_STATE"},
105 { ResType::RES_TYPE_SOCPERF_CUST_EVENT_BEGIN, "RES_TYPE_SOCPERF_CUST_EVENT_BEGIN" },
106 { ResType::RES_TYPE_SOCPERF_CUST_EVENT_END, "RES_TYPE_SOCPERF_CUST_EVENT_END" },
107 { ResType::RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE, "RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE" },
108 { ResType::RES_TYPE_REPORT_SCREEN_CAPTURE, "RES_TYPE_REPORT_SCREEN_CAPTURE" },
109 { ResType::RES_TYPE_LONG_FRAME, "RES_TYPE_LONG_FRAME" },
110 { ResType::RES_TYPE_KEY_PERF_SCENE, "RES_TYPE_KEY_PERF_SCENE" },
111 { ResType::RES_TYPE_SUPER_LAUNCHER, "RES_TYPE_SUPER_LAUNCHER" },
112 { ResType::RES_TYPE_CAST_SCREEN, "RES_TYPE_CAST_SCREEN" },
113 { ResType::RES_TYPR_SCREEN_COLLABROATION, "RES_TYPR_SCREEN_COLLABROATION" },
114 { ResType::RES_TYPE_SA_CONTROL_APP_EVENT, "RES_TYPE_SA_CONTROL_APP_EVENT" },
115 { ResType::RES_TYPE_SYSTEM_CPU_LOAD, "RES_TYPE_SYSTEM_CPU_LOAD" },
116 { ResType::RES_TYPE_UPLOAD_DOWNLOAD, "RES_TYPE_UPLOAD_DOWNLOAD" },
117 { ResType::RES_TYPE_SPLIT_SCREEN, "RES_TYPE_SPLIT_SCREEN" },
118 { ResType::RES_TYPE_FLOATING_WINDOW, "RES_TYPE_FLOATING_WINDOW" },
119 { ResType::RES_TYPE_REPORT_DISTRIBUTE_TID, "RES_TYPE_REPORT_DISTRIBUTE_TID"},
120 { ResType::RES_TYPE_FRAME_RATE_REPORT, "RES_TYPE_FRAME_RATE_REPORT"},
121 { ResType::RES_TYPE_WEBVIEW_SCREEN_CAPTURE, "RES_TYPE_WEBVIEW_SCREEN_CAPTURE"},
122 { ResType::RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE"},
123 { ResType::RES_TYPE_LOCATION_STATUS_CHANGE, "RES_TYPE_LOCATION_STATUS_CHANGE"},
124 { ResType::RES_TYPE_AUDIO_SILENT_PLAYBACK, "RES_TYPE_AUDIO_SILENT_PLAYBACK" },
125 { ResType::RES_TYPE_DEVICE_MODE_STATUS, "RES_TYPE_DEVICE_MODE_STATUS"},
126 { ResType::RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE, "RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE"},
127 { ResType::RES_TYPE_FORM_STATE_CHANGE_EVENT, "RES_TYPE_FORM_STATE_CHANGE_EVENT"},
128 { ResType::RES_TYPE_POWER_MODE_CHANGED, "RES_TYPE_POWER_MODE_CHANGED" },
129 { ResType::RES_TYPE_THERMAL_SCENARIO_REPORT, "RES_TYPE_THERMAL_SCENARIO_REPORT" },
130 { ResType::RES_TYPE_BOOT_COMPLETED, "RES_TYPE_BOOT_COMPLETED" },
131 { ResType::RES_TYPE_CONTINUOUS_STARTUP, "RES_TYPE_CONTINUOUS_STARTUP" },
132 { ResType::RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK, "RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK"},
133 { ResType::RES_TYPE_REPORT_GAME_SCHED, "RES_TYPE_REPORT_GAME_SCHED" },
134 { ResType::RES_TYPE_APP_FRAME_DROP, "RES_TYPE_APP_FRAME_DROP"},
135 { ResType::RES_TYPE_RSS_CLOUD_CONFIG_UPDATE, "RES_TYPE_RSS_CLOUD_CONFIG_UPDATE" },
136 { ResType::RES_TYPE_BT_SERVICE_EVENT, "RES_TYPE_BT_SERVICE_EVENT" },
137 { ResType::RES_TYPE_APP_GAME_BOOST_EVENT, "RES_TYPE_APP_GAME_BOOST_EVENT" },
138 { ResType::RES_TYPE_AUDIO_RENDERER_STANDBY, "RES_TYPE_AUDIO_RENDERER_STANDBY" },
139 };
140 }
141
142 IMPLEMENT_SINGLE_INSTANCE(ResSchedMgr);
143
Init()144 void ResSchedMgr::Init()
145 {
146 PluginMgr::GetInstance().Init();
147 PluginMgr::GetInstance().SetResTypeStrMap(resTypeToStr);
148
149 if (!killProcess_) {
150 killProcess_ = std::make_shared<KillProcess>();
151 }
152
153 InitExecutorPlugin(true);
154 }
155
Stop()156 void ResSchedMgr::Stop()
157 {
158 PluginMgr::GetInstance().Stop();
159 }
160
ReportData(uint32_t resType,int64_t value,const nlohmann::json & payload)161 void ResSchedMgr::ReportData(uint32_t resType, int64_t value, const nlohmann::json& payload)
162 {
163 ReportDataInner(resType, value, payload);
164 DispatchResourceInner(resType, value, payload);
165 SceneRecognizerMgr::GetInstance().DispatchResource(resType, value, payload);
166 }
167
ReportDataInner(uint32_t resType,int64_t value,const nlohmann::json & payload)168 void ResSchedMgr::ReportDataInner(uint32_t resType, int64_t value, const nlohmann::json& payload)
169 {
170 RESSCHED_LOGD("%{public}s, receive resType = %{public}u, value = %{public}lld.", __func__,
171 resType, (long long)value);
172 std::string trace_str(__func__);
173 trace_str.append(",resType[").append(std::to_string(resType)).append("]");
174 trace_str.append(",value[").append(std::to_string(value)).append("]");
175 StartTrace(HITRACE_TAG_OHOS, trace_str, -1);
176 PluginMgr::GetInstance().DispatchResource(std::make_shared<ResData>(resType, value, payload));
177 FinishTrace(HITRACE_TAG_OHOS);
178 }
179
KillProcessByClient(const nlohmann::json & payload)180 int32_t ResSchedMgr::KillProcessByClient(const nlohmann::json& payload)
181 {
182 return killProcess_->KillProcessByPidWithClient(payload);
183 }
184
InitExecutorPlugin(bool isProcessInit)185 void ResSchedMgr::InitExecutorPlugin(bool isProcessInit)
186 {
187 std::vector<std::string> configStrs = PluginMgr::GetInstance().GetConfigReaderStr();
188 std::vector<std::string> switchStrs = PluginMgr::GetInstance().GetPluginSwitchStr();
189
190 nlohmann::json payload;
191 nlohmann::json context;
192 payload["config"] = configStrs;
193 payload["switch"] = switchStrs;
194 ResSchedExeClient::GetInstance().SendRequestSync(ResExeType::RES_TYPE_EXECUTOR_PLUGIN_INIT, 0, payload, context);
195
196 if (isProcessInit) {
197 PluginMgr::GetInstance().ParseConfigReader(configStrs);
198 PluginMgr::GetInstance().ParsePluginSwitch(switchStrs);
199 }
200 }
201
DispatchResourceInner(uint32_t resType,int64_t value,const nlohmann::json & payload)202 void ResSchedMgr::DispatchResourceInner(uint32_t resType, int64_t value, const nlohmann::json& payload)
203 {
204 CgroupSchedDispatch(resType, value, payload);
205 }
206
ReportDataInProcess(uint32_t resType,int64_t value,const nlohmann::json & payload)207 extern "C" void ReportDataInProcess(uint32_t resType, int64_t value, const nlohmann::json& payload)
208 {
209 ResSchedMgr::GetInstance().ReportData(resType, value, payload);
210 }
211
ReportAppStateInProcess(int32_t state,int32_t pid)212 extern "C" void ReportAppStateInProcess(int32_t state, int32_t pid)
213 {
214 NotifierMgr::GetInstance().OnApplicationStateChange(state, pid);
215 }
216 } // namespace ResourceSchedule
217 } // namespace OHOS
218