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 #include "res_sched_mgr.h"
17
18 #include <cinttypes>
19 #include <map>
20
21 #include "app_mgr_interface.h"
22 #include "if_system_ability_manager.h"
23 #include "iservice_registry.h"
24 #include "notifier_mgr.h"
25 #include "res_exe_type.h"
26 #include "res_sa_init.h"
27 #include "res_sched_exe_client.h"
28 #include "res_sched_log.h"
29 #include "res_type.h"
30 #include "plugin_mgr.h"
31 #include "hitrace_meter.h"
32 #include "scene_recognizer_mgr.h"
33 #include "system_ability_definition.h"
34
35 namespace OHOS {
36 namespace ResourceSchedule {
37 using namespace AppExecFwk;
38 namespace {
39 static const std::map<uint32_t, std::string> resTypeToStr = {
40 { ResType::SYNC_RES_TYPE_THAW_ONE_APP, "SYNC_RES_TYPE_THAW_ONE_APP"},
41 { ResType::SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE, "SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE"},
42 { ResType::SYNC_RES_TYPE_GET_THERMAL_DATA, "SYNC_RES_TYPE_GET_THERMAL_DATA"},
43 { ResType::RES_TYPE_SCREEN_STATUS, "SCREEN_STATUS" },
44 { ResType::RES_TYPE_APP_STATE_CHANGE, "APP_STATE_CHANGE" },
45 { ResType::RES_TYPE_ABILITY_STATE_CHANGE, "ABILITY_STATE_CHANGE" },
46 { ResType::RES_TYPE_EXTENSION_STATE_CHANGE, "EXTENSION_STATE_CHANGE" },
47 { ResType::RES_TYPE_PROCESS_STATE_CHANGE, "PROCESS_STATE_CHANGE" },
48 { ResType::RES_TYPE_WINDOW_FOCUS, "WINDOW_FOCUS" },
49 { ResType::RES_TYPE_TRANSIENT_TASK, "TRANSIENT_TASK" },
50 { ResType::RES_TYPE_CONTINUOUS_TASK, "CONTINUOUS_TASK" },
51 { ResType::RES_TYPE_CGROUP_ADJUSTER, "CGROUP_ADJUSTER" },
52 { ResType::RES_TYPE_CLICK_RECOGNIZE, "CLICK_RECOGNIZE" },
53 { ResType::RES_TYPE_PUSH_PAGE, "PUSH_PAGE" },
54 { ResType::RES_TYPE_SLIDE_RECOGNIZE, "SLIDE_RECOGNIZE" },
55 { ResType::RES_TYPE_WINDOW_VISIBILITY_CHANGE, "WINDOW_VISIBILITY_CHANGE" },
56 { ResType::RES_TYPE_REPORT_MMI_PROCESS, "REPORT_MMI_PROCESS" },
57 { ResType::RES_TYPE_REPORT_RENDER_THREAD, "REPORT_RENDER_THREAD" },
58 { ResType::RES_TYPE_APP_INSTALL_UNINSTALL, "APP_INSTALL_UNINSTALL" },
59 { ResType::RES_TYPE_WIFI_CONNECT_STATE_CHANGE, "WIFI_CONNECT_STATE_CHANGE" },
60 { ResType::RES_TYPE_USER_SWITCH, "USER_SWITCH" },
61 { ResType::RES_TYPE_USER_REMOVE, "USER_REMOVE" },
62 { ResType::RES_TYPE_SCREEN_LOCK, "SCREEN_LOCK" },
63 { ResType::RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE, "BLUETOOTH_A2DP_CONNECT_STATE_CHANGE" },
64 { ResType::RES_TYPE_NETWORK_LATENCY_REQUEST, "NETWORK_LATENCY_REQUEST" },
65 { ResType::RES_TYPE_CALL_STATE_UPDATE, "CALL_STATE_UPDATE" },
66 { ResType::RES_TYPE_THREAD_QOS_CHANGE, "THREAD_QOS_CHANGE" },
67 { ResType::RES_TYPE_AUDIO_RENDER_STATE_CHANGE, "AUDIO_RENDER_STATE_CHANGE" },
68 { ResType::RES_TYPE_AUDIO_RING_MODE_CHANGE, "AUDIO_RING_MODE_CHANGE" },
69 { ResType::RES_TYPE_AUDIO_VOLUME_KEY_CHANGE, "AUDIO_VOLUME_KEY_CHANGE" },
70 { ResType::RES_TYPE_APP_ABILITY_START, "APP_ABILITY_START" },
71 { ResType::RES_TYPE_PRELOAD_APPLICATION, "RES_TYPE_PRELOAD_APPLICATION" },
72 { ResType::RES_TYPE_POP_PAGE, "POP_PAGE" },
73 { ResType::RES_TYPE_WEB_GESTURE, "WEB_GESTURE" },
74 { ResType::RES_TYPE_DEVICE_STILL_STATE_CHANGE, "DEVICE_STILL_STATE_CHANGE" },
75 { ResType::RES_TYPE_RESIZE_WINDOW, "RES_TYPE_RESIZE_WINDOW" },
76 { ResType::RES_TYPE_MOVE_WINDOW, "RES_TYPE_MOVE_WINDOW" },
77 { ResType::RES_TYPE_SHOW_REMOTE_ANIMATION, "RES_TYPE_SHOW_REMOTE_ANIMATION" },
78 { ResType::RES_TYPE_LOAD_PAGE, "RES_TYPE_LOAD_PAGE" },
79 { ResType::RES_TYPE_REPORT_CAMERA_STATE, "RES_TYPE_REPORT_CAMERA_STATE" },
80 { ResType::RES_TYPE_RUNNINGLOCK_STATE, "RES_TYPE_RUNNINGLOCK_STATE" },
81 { ResType::RES_TYPE_DRAG_STATUS_BAR, "RES_TYPE_DRAG_STATUS_BAR" },
82 { ResType::RES_TYPE_REPORT_SCENE_BOARD, "RES_TYPE_REPORT_SCENE_BOARD" },
83 { ResType::RES_TYPE_REPORT_KEY_THREAD, "RES_TYPE_REPORT_KEY_THREAD" },
84 { ResType::RES_TYPE_REPORT_WINDOW_STATE, "RES_TYPE_REPORT_WINDOW_STATE" },
85 { ResType::RES_TYPE_REPORT_SCENE_SCHED, "RES_TYPE_REPORT_SCENE_SCHED" },
86 { ResType::RES_TYPE_WEB_GESTURE_MOVE, "RES_TYPE_WEB_GESTURE_MOVE" },
87 { ResType::RES_TYPE_WEB_SLIDE_NORMAL, "RES_TYPE_WEB_SLIDE_NORMAL" },
88 { ResType::RES_TYPE_LOAD_URL, "RES_TYPE_LOAD_URL" },
89 { ResType::RES_TYPE_MOUSEWHEEL, "RES_TYPE_MOUSEWHEEL" },
90 { ResType::RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE" },
91 { ResType::RES_TYPE_MMI_INPUT_STATE, "RES_TYPE_MMI_INPUT_STATE" },
92 { ResType::RES_TYPE_ANCO_CUST, "RES_TYPE_ANCO_CUST" },
93 { ResType::RES_TYPE_TIMEZONE_CHANGED, "RES_TYPE_TIMEZONE_CHANGED" },
94 { ResType::RES_TYPE_TIME_CHANGED, "RES_TYPE_TIME_CHANGED" },
95 { ResType::RES_TYPE_NITZ_TIME_CHANGED, "RES_TYPE_NITZ_TIME_CHANGED" },
96 { ResType::RES_TYPE_NITZ_TIMEZONE_CHANGED, "RES_TYPE_NITZ_TIMEZONE_CHANGED" },
97 { ResType::RES_TYPE_CHARGING_DISCHARGING, "RES_TYPE_CHARGING_DISCHARGING" },
98 { ResType::RES_TYPE_USB_DEVICE, "RES_TYPE_USB_DEVICE" },
99 { ResType::RES_TYPE_CALL_STATE_CHANGED, "RES_TYPE_CALL_STATE_CHANGED" },
100 { ResType::RES_TYPE_WIFI_P2P_STATE_CHANGED, "RES_TYPE_WIFI_P2P_STATE_CHANGED" },
101 { ResType::RES_TYPE_CONNECTION_OBSERVER, "RES_TYPE_CONNECTION_OBSERVER" },
102 { ResType::RES_TYPE_AV_SESSION_ON_SESSION_CREATE, "RES_TYPE_AV_SESSION_ON_SESSION_CREATE" },
103 { ResType::RES_TYPE_AV_SESSION_ON_SESSION_RELEASE, "RES_TYPE_AV_SESSION_ON_SESSION_RELEASE" },
104 { ResType::RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE, "RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE" },
105 { ResType::RES_TYPE_ON_APP_STATE_CHANGED, "RES_TYPE_ON_APP_STATE_CHANGED" },
106 { ResType::RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED, "RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED" },
107 { ResType::RES_TYPE_AV_CODEC_STATE, "RES_TYPE_AV_CODEC_STATE" },
108 { ResType::RES_TYPE_APP_ASSOCIATED_START, "RES_TYPE_APP_ASSOCIATED_START" },
109 { ResType::RES_TYPE_THERMAL_STATE, "RES_TYPE_THERMAL_STATE"},
110 { ResType::RES_TYPE_SOCPERF_CUST_EVENT_BEGIN, "RES_TYPE_SOCPERF_CUST_EVENT_BEGIN" },
111 { ResType::RES_TYPE_SOCPERF_CUST_EVENT_END, "RES_TYPE_SOCPERF_CUST_EVENT_END" },
112 { ResType::RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE, "RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE" },
113 { ResType::RES_TYPE_REPORT_SCREEN_CAPTURE, "RES_TYPE_REPORT_SCREEN_CAPTURE" },
114 { ResType::RES_TYPE_LONG_FRAME, "RES_TYPE_LONG_FRAME" },
115 { ResType::RES_TYPE_KEY_PERF_SCENE, "RES_TYPE_KEY_PERF_SCENE" },
116 { ResType::RES_TYPE_SUPER_LAUNCHER, "RES_TYPE_SUPER_LAUNCHER" },
117 { ResType::RES_TYPE_CAST_SCREEN, "RES_TYPE_CAST_SCREEN" },
118 { ResType::RES_TYPR_SCREEN_COLLABROATION, "RES_TYPR_SCREEN_COLLABROATION" },
119 { ResType::RES_TYPE_SA_CONTROL_APP_EVENT, "RES_TYPE_SA_CONTROL_APP_EVENT" },
120 { ResType::RES_TYPE_SYSTEM_CPU_LOAD, "RES_TYPE_SYSTEM_CPU_LOAD" },
121 { ResType::RES_TYPE_UPLOAD_DOWNLOAD, "RES_TYPE_UPLOAD_DOWNLOAD" },
122 { ResType::RES_TYPE_SPLIT_SCREEN, "RES_TYPE_SPLIT_SCREEN" },
123 { ResType::RES_TYPE_FLOATING_WINDOW, "RES_TYPE_FLOATING_WINDOW" },
124 { ResType::RES_TYPE_REPORT_DISTRIBUTE_TID, "RES_TYPE_REPORT_DISTRIBUTE_TID"},
125 { ResType::RES_TYPE_FRAME_RATE_REPORT, "RES_TYPE_FRAME_RATE_REPORT"},
126 { ResType::RES_TYPE_WEB_DRAG_RESIZE, "RES_TYPE_WEB_DRAG_RESIZE"},
127 { ResType::RES_TYPE_WEBVIEW_SCREEN_CAPTURE, "RES_TYPE_WEBVIEW_SCREEN_CAPTURE"},
128 { ResType::RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE"},
129 { ResType::RES_TYPE_LOCATION_STATUS_CHANGE, "RES_TYPE_LOCATION_STATUS_CHANGE"},
130 { ResType::RES_TYPE_DEVICE_MODE_STATUS, "RES_TYPE_DEVICE_MODE_STATUS"},
131 { ResType::RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE, "RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE"},
132 { ResType::RES_TYPE_FORM_STATE_CHANGE_EVENT, "RES_TYPE_FORM_STATE_CHANGE_EVENT"},
133 { ResType::RES_TYPE_POWER_MODE_CHANGED, "RES_TYPE_POWER_MODE_CHANGED" },
134 { ResType::RES_TYPE_THERMAL_SCENARIO_REPORT, "RES_TYPE_THERMAL_SCENARIO_REPORT" },
135 { ResType::SYNC_RES_TYPE_SHOULD_FORCE_KILL_PROCESS, "SYNC_RES_TYPE_SHOULD_FORCE_KILL_PROCESS" },
136 { ResType::RES_TYPE_BOOT_COMPLETED, "RES_TYPE_BOOT_COMPLETED" },
137 { ResType::RES_TYPE_CONTINUOUS_STARTUP, "RES_TYPE_CONTINUOUS_STARTUP" },
138 { ResType::RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK, "RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK"},
139 { ResType::RES_TYPE_REPORT_GAME_SCHED, "RES_TYPE_REPORT_GAME_SCHED" },
140 { ResType::RES_TYPE_REPORT_VSYNC_TID, "RES_TYPE_REPORT_VSYNC_TID" },
141 { ResType::RES_TYPE_BT_SERVICE_EVENT, "RES_TYPE_BT_SERVICE_EVENT"},
142 { ResType::RES_TYPE_APP_FRAME_DROP, "RES_TYPE_APP_FRAME_DROP"},
143 { ResType::RES_TYPE_CLOUD_CONFIG_UPDATE, "RES_TYPE_CLOUD_CONFIG_UPDATE" },
144 { ResType::RES_TYPE_RSS_CLOUD_CONFIG_UPDATE, "RES_TYPE_RSS_CLOUD_CONFIG_UPDATE" },
145 { ResType::RES_TYPE_GAME_INFO_NOTIFY, "RES_TYPE_GAME_INFO_NOTIFY"},
146 { ResType::RES_TYPE_AUDIO_RENDERER_STANDBY, "RES_TYPE_AUDIO_RENDERER_STANDBY" },
147 { ResType::RES_TYPE_APP_GAME_BOOST_EVENT, "RES_TYPE_APP_GAME_BOOST_EVENT" },
148 { ResType::RES_TYPE_GESTURE_ANIMATION, "RES_TYPE_GESTURE_ANIMATION" },
149 { ResType::RES_TYPE_AXIS_EVENT, "RES_TYPE_AXIS_EVENT" },
150 { ResType::RES_TYPE_DISPLAY_MULTI_SCREEN, "RES_TYPE_DISPLAY_MULTI_SCREEN" },
151 { ResType::RES_TYPE_INTENT_CTRL_APP, "RES_TYPE_INTENT_CTRL_APP" },
152 { ResType::RES_TYPE_CROWN_ROTATION_STATUS, "RES_TYPE_CROWN_ROTATION_STATUS" },
153 { ResType::RES_TYPE_RAISE_WORKER_THREAD_PRIORITY, "RES_TYPE_RAISE_WORKER_THREAD_PRIORITY" },
154 { ResType::RES_TYPE_GET_GAME_SCENE_INFO, "RES_TYPE_GET_GAME_SCENE_INFO"},
155 { ResType::RES_TYPE_RED_ENVELOPE, "RES_TYPE_RED_ENVELOPE"},
156 { ResType::RES_TYPE_RECV_ABC_LOAD_COMPLETED, "RES_TYPE_RECV_ABC_LOAD_COMPLETED"},
157 { ResType::RES_TYPE_CHECK_APP_IS_IN_SCHEDULE_LIST, "RES_TYPE_CHECK_APP_IS_IN_SCHEDULE_LIST" },
158 { ResType::RES_TYPE_DYNAMICALLY_SET_SUSPEND_EXEMPT, "RES_TYPE_DYNAMICALLY_SET_SUSPEND_EXEMPT" },
159 #ifdef RESSCHED_RESOURCESCHEDULE_FILE_COPY_SOC_PERF_ENABLE
160 { ResType::RES_TYPE_FILE_COPY_STATUS, "RES_TYPE_FILE_COPY_STATUS" },
161 #endif
162 { ResType::RES_TYPE_PAGE_TRANSITION, "RES_TYPE_PAGE_TRANSITION" },
163 };
GetAppManagerInstance()164 OHOS::sptr<OHOS::AppExecFwk::IAppMgr> GetAppManagerInstance()
165 {
166 OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
167 OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
168 if (!systemAbilityManager) {
169 RESSCHED_LOGE("%{public}s : systemAbilityManager nullptr!", __func__);
170 return nullptr;
171 }
172 OHOS::sptr<OHOS::IRemoteObject> object = systemAbilityManager->GetSystemAbility(OHOS::APP_MGR_SERVICE_ID);
173 return OHOS::iface_cast<OHOS::AppExecFwk::IAppMgr>(object);
174 }
175 }
176
177 IMPLEMENT_SINGLE_INSTANCE(ResSchedMgr);
178
Init()179 void ResSchedMgr::Init()
180 {
181 PluginMgr::GetInstance().Init();
182 PluginMgr::GetInstance().SetResTypeStrMap(resTypeToStr);
183
184 if (!killProcess_) {
185 killProcess_ = std::make_shared<KillProcess>();
186 }
187
188 InitExecutorPlugin(true);
189 }
190
Stop()191 void ResSchedMgr::Stop()
192 {
193 PluginMgr::GetInstance().Stop();
194 }
195
ReportData(uint32_t resType,int64_t value,const nlohmann::json & payload)196 void ResSchedMgr::ReportData(uint32_t resType, int64_t value, const nlohmann::json& payload)
197 {
198 ReportDataInner(resType, value, payload);
199 SceneRecognizerMgr::GetInstance().DispatchResource(resType, value, payload);
200 }
201
ReportDataInner(uint32_t resType,int64_t value,const nlohmann::json & payload)202 void ResSchedMgr::ReportDataInner(uint32_t resType, int64_t value, const nlohmann::json& payload)
203 {
204 RESSCHED_LOGD("%{public}s, receive resType = %{public}u, value = %{public}lld.", __func__,
205 resType, (long long)value);
206 std::string trace_str(__func__);
207 trace_str.append(",resType[").append(std::to_string(resType)).append("]");
208 trace_str.append(",value[").append(std::to_string(value)).append("]");
209 StartTrace(HITRACE_TAG_OHOS, trace_str, -1);
210 PluginMgr::GetInstance().DispatchResource(std::make_shared<ResData>(resType, value, payload));
211 FinishTrace(HITRACE_TAG_OHOS);
212 }
213
KillProcessByClient(const nlohmann::json & payload)214 int32_t ResSchedMgr::KillProcessByClient(const nlohmann::json& payload)
215 {
216 return killProcess_->KillProcessByPidWithClient(payload);
217 }
218
InitExecutorPlugin(bool isProcessInit)219 void ResSchedMgr::InitExecutorPlugin(bool isProcessInit)
220 {
221 std::vector<std::string> configStrs = PluginMgr::GetInstance().GetConfigReaderStr();
222 std::vector<std::string> switchStrs = PluginMgr::GetInstance().GetPluginSwitchStr();
223
224 nlohmann::json payload;
225 nlohmann::json context;
226 payload["config"] = configStrs;
227 payload["switch"] = switchStrs;
228 RESSCHED_LOGI("ResSchedMgr start InitExecutorPlugin");
229 ResSchedExeClient::GetInstance().SendRequestSync(ResExeType::RES_TYPE_EXECUTOR_PLUGIN_INIT, 0, payload, context);
230
231 if (isProcessInit) {
232 PluginMgr::GetInstance().ParseConfigReader(configStrs);
233 PluginMgr::GetInstance().ParsePluginSwitch(switchStrs);
234 }
235 ResSchedIpcThread::GetInstance().SetInitFlag(true);
236 }
237
OnApplicationStateChange(int32_t state,int32_t pid)238 void ResSchedMgr::OnApplicationStateChange(int32_t state, int32_t pid)
239 {
240 RESSCHED_LOGD("OnApplicationStateChange called, state: %{public}d, pid : %{public}d .", state, pid);
241 std::lock_guard<std::mutex> autoLock(foregroundPidsMutex_);
242
243 if (state == static_cast<int32_t>(ApplicationState::APP_STATE_FOREGROUND)) {
244 if (foregroundPids_.find(pid) == foregroundPids_.end()) {
245 foregroundPids_.emplace(pid);
246 }
247 }
248 if (state == static_cast<int32_t>(ApplicationState::APP_STATE_BACKGROUND)
249 || state == static_cast<int32_t>(ApplicationState::APP_STATE_TERMINATED)
250 || state == static_cast<int32_t>(ApplicationState::APP_STATE_END)) {
251 auto item = foregroundPids_.find(pid);
252 if (item != foregroundPids_.end()) {
253 foregroundPids_.erase(item);
254 }
255 }
256 }
257
IsForegroundApp(int32_t pid)258 bool ResSchedMgr::IsForegroundApp(int32_t pid)
259 {
260 std::lock_guard<std::mutex> autoLock(foregroundPidsMutex_);
261 auto item = foregroundPids_.find(pid);
262 return item != foregroundPids_.end();
263 }
264
InitForegroundAppInfo()265 void ResSchedMgr::InitForegroundAppInfo()
266 {
267 sptr<OHOS::AppExecFwk::IAppMgr> appManager = GetAppManagerInstance();
268 if (!appManager) {
269 RESSCHED_LOGE("%{public}s app manager nullptr!", __func__);
270 return;
271 }
272 std::vector<AppExecFwk::AppStateData> fgapplist;
273 int32_t err = appManager->GetForegroundApplications(fgapplist);
274 if (err != ERR_OK) {
275 RESSCHED_LOGE("%{public}s GetForegroundApplications failed. err:%{public}d", __func__, err);
276 return;
277 }
278 std::lock_guard<std::mutex> autoLock(foregroundPidsMutex_);
279 for (const auto& item : fgapplist) {
280 if (foregroundPids_.find(item.pid) == foregroundPids_.end()) {
281 foregroundPids_.emplace(item.pid);
282 }
283 }
284 RESSCHED_LOGI("%{public}s succeed", __func__);
285 }
286
ReportDataInProcess(uint32_t resType,int64_t value,const nlohmann::json & payload)287 extern "C" void ReportDataInProcess(uint32_t resType, int64_t value, const nlohmann::json& payload)
288 {
289 ResSchedMgr::GetInstance().ReportData(resType, value, payload);
290 }
291
ReportAppStateInProcess(int32_t state,int32_t pid)292 extern "C" void ReportAppStateInProcess(int32_t state, int32_t pid)
293 {
294 NotifierMgr::GetInstance().OnApplicationStateChange(state, pid);
295 ResSchedMgr::GetInstance().OnApplicationStateChange(state, pid);
296 }
297
ReportProcessStateInProcess(int32_t state,int32_t pid)298 extern "C" void ReportProcessStateInProcess(int32_t state, int32_t pid)
299 {
300 ResSchedMgr::GetInstance().OnApplicationStateChange(state, pid);
301 }
302
KillProcessInProcess(const nlohmann::json & payload)303 extern "C" int32_t KillProcessInProcess(const nlohmann::json& payload)
304 {
305 return ResSchedMgr::GetInstance().KillProcessByClient(payload);
306 }
307 } // namespace ResourceSchedule
308 } // namespace OHOS
309