1 /*
2 * Copyright (c) 2021-2022 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 "ams_mgr_scheduler.h"
17 #include <sys/types.h>
18
19 #include "datetime_ex.h"
20 #include "ipc_skeleton.h"
21 #include "system_ability_definition.h"
22
23 #include "app_death_recipient.h"
24 #include "app_mgr_constants.h"
25 #include "hilog_wrapper.h"
26 #include "perf_profile.h"
27 #include "permission_constants.h"
28 #include "permission_verification.h"
29
30 namespace OHOS {
31 namespace AppExecFwk {
32 namespace {
33 const std::string TASK_LOAD_ABILITY = "LoadAbilityTask";
34 const std::string TASK_TERMINATE_ABILITY = "TerminateAbilityTask";
35 const std::string TASK_UPDATE_ABILITY_STATE = "UpdateAbilityStateTask";
36 const std::string TASK_UPDATE_EXTENSION_STATE = "UpdateExtensionStateTask";
37 const std::string TASK_REGISTER_APP_STATE_CALLBACK = "RegisterAppStateCallbackTask";
38 const std::string TASK_STOP_ALL_PROCESS = "StopAllProcessTask";
39 const std::string TASK_ABILITY_BEHAVIOR_ANALYSIS = "AbilityBehaviorAnalysisTask";
40 const std::string TASK_KILL_PROCESS_BY_ABILITY_TOKEN = "KillProcessByAbilityTokenTask";
41 const std::string TASK_KILL_PROCESSES_BY_USERID = "KillProcessesByUserIdTask";
42 const std::string TASK_KILL_APPLICATION = "KillApplicationTask";
43 }; // namespace
44
AmsMgrScheduler(const std::shared_ptr<AppMgrServiceInner> & mgrServiceInner_,const std::shared_ptr<AAFwk::TaskHandlerWrap> & handler_)45 AmsMgrScheduler::AmsMgrScheduler(
46 const std::shared_ptr<AppMgrServiceInner> &mgrServiceInner_,
47 const std::shared_ptr<AAFwk::TaskHandlerWrap> &handler_)
48 : amsMgrServiceInner_(mgrServiceInner_), amsHandler_(handler_)
49 {}
50
~AmsMgrScheduler()51 AmsMgrScheduler::~AmsMgrScheduler()
52 {
53 HILOG_INFO("AmsMgrScheduler instance destroyed");
54 }
55
LoadAbility(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<ApplicationInfo> & appInfo,const std::shared_ptr<AAFwk::Want> & want)56 void AmsMgrScheduler::LoadAbility(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
57 const std::shared_ptr<AbilityInfo> &abilityInfo, const std::shared_ptr<ApplicationInfo> &appInfo,
58 const std::shared_ptr<AAFwk::Want> &want)
59 {
60 if (!abilityInfo || !appInfo) {
61 HILOG_ERROR("param error");
62 return;
63 }
64
65 if (!IsReady()) {
66 return;
67 }
68
69 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
70 HILOG_ERROR("Permission verification failed.");
71 return;
72 }
73 PerfProfile::GetInstance().SetAbilityLoadStartTime(GetTickCount());
74 std::function<void()> loadAbilityFunc =
75 std::bind(&AppMgrServiceInner::LoadAbility, amsMgrServiceInner_, token, preToken, abilityInfo, appInfo, want);
76
77 amsHandler_->SubmitTask(loadAbilityFunc, TASK_LOAD_ABILITY);
78 }
79
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)80 void AmsMgrScheduler::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
81 {
82 if (!IsReady()) {
83 return;
84 }
85
86 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
87 HILOG_ERROR("Permission verification failed.");
88 return;
89 }
90 std::function<void()> updateAbilityStateFunc =
91 std::bind(&AppMgrServiceInner::UpdateAbilityState, amsMgrServiceInner_, token, state);
92 amsHandler_->SubmitTask(updateAbilityStateFunc, TASK_UPDATE_ABILITY_STATE);
93 }
94
UpdateExtensionState(const sptr<IRemoteObject> & token,const ExtensionState state)95 void AmsMgrScheduler::UpdateExtensionState(const sptr<IRemoteObject> &token, const ExtensionState state)
96 {
97 if (!IsReady()) {
98 return;
99 }
100
101 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
102 HILOG_ERROR("Permission verification failed.");
103 return;
104 }
105 std::function<void()> updateExtensionStateFunc =
106 std::bind(&AppMgrServiceInner::UpdateExtensionState, amsMgrServiceInner_, token, state);
107 amsHandler_->SubmitTask(updateExtensionStateFunc, TASK_UPDATE_EXTENSION_STATE);
108 }
109
TerminateAbility(const sptr<IRemoteObject> & token,bool clearMissionFlag)110 void AmsMgrScheduler::TerminateAbility(const sptr<IRemoteObject> &token, bool clearMissionFlag)
111 {
112 if (!IsReady()) {
113 return;
114 }
115
116 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
117 HILOG_ERROR("Permission verification failed.");
118 return;
119 }
120 std::function<void()> terminateAbilityFunc =
121 std::bind(&AppMgrServiceInner::TerminateAbility, amsMgrServiceInner_, token, clearMissionFlag);
122 amsHandler_->SubmitTask(terminateAbilityFunc, TASK_TERMINATE_ABILITY);
123 }
124
RegisterAppStateCallback(const sptr<IAppStateCallback> & callback)125 void AmsMgrScheduler::RegisterAppStateCallback(const sptr<IAppStateCallback> &callback)
126 {
127 if (!IsReady()) {
128 return;
129 }
130 std::function<void()> registerAppStateCallbackFunc =
131 std::bind(&AppMgrServiceInner::RegisterAppStateCallback, amsMgrServiceInner_, callback);
132 amsHandler_->SubmitTask(registerAppStateCallbackFunc, TASK_REGISTER_APP_STATE_CALLBACK);
133 }
134
AbilityBehaviorAnalysis(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const int32_t visibility,const int32_t perceptibility,const int32_t connectionState)135 void AmsMgrScheduler::AbilityBehaviorAnalysis(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
136 const int32_t visibility, const int32_t perceptibility, const int32_t connectionState)
137 {
138 if (!IsReady()) {
139 return;
140 }
141
142 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
143 HILOG_ERROR("Permission verification failed.");
144 return;
145 }
146 std::function<void()> abilityBehaviorAnalysisFunc = std::bind(&AppMgrServiceInner::AbilityBehaviorAnalysis,
147 amsMgrServiceInner_, token, preToken, visibility, perceptibility, connectionState);
148 amsHandler_->SubmitTask(abilityBehaviorAnalysisFunc, TASK_ABILITY_BEHAVIOR_ANALYSIS);
149 }
150
KillProcessByAbilityToken(const sptr<IRemoteObject> & token)151 void AmsMgrScheduler::KillProcessByAbilityToken(const sptr<IRemoteObject> &token)
152 {
153 if (!IsReady()) {
154 return;
155 }
156
157 if (amsMgrServiceInner_->VerifyProcessPermission(token) != ERR_OK) {
158 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
159 return;
160 }
161
162 std::function<void()> killProcessByAbilityTokenFunc =
163 std::bind(&AppMgrServiceInner::KillProcessByAbilityToken, amsMgrServiceInner_, token);
164 amsHandler_->SubmitTask(killProcessByAbilityTokenFunc, TASK_KILL_PROCESS_BY_ABILITY_TOKEN);
165 }
166
KillProcessesByUserId(int32_t userId)167 void AmsMgrScheduler::KillProcessesByUserId(int32_t userId)
168 {
169 if (!IsReady()) {
170 return;
171 }
172
173 if (!AAFwk::PermissionVerification::GetInstance()->JudgeCallerIsAllowedToUseSystemAPI()) {
174 HILOG_ERROR("The caller is not system-app, can not use system-api");
175 return;
176 }
177
178 auto permission = AAFwk::PermissionConstants::PERMISSION_CLEAN_BACKGROUND_PROCESSES;
179 if (amsMgrServiceInner_->VerifyAccountPermission(permission, userId) == ERR_PERMISSION_DENIED) {
180 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
181 return;
182 }
183
184 std::function<void()> killProcessesByUserIdFunc =
185 std::bind(&AppMgrServiceInner::KillProcessesByUserId, amsMgrServiceInner_, userId);
186 amsHandler_->SubmitTask(killProcessesByUserIdFunc, TASK_KILL_PROCESSES_BY_USERID);
187 }
188
KillProcessWithAccount(const std::string & bundleName,const int accountId)189 int32_t AmsMgrScheduler::KillProcessWithAccount(const std::string &bundleName, const int accountId)
190 {
191 HILOG_INFO("bundleName = %{public}s, accountId = %{public}d", bundleName.c_str(), accountId);
192 if (!IsReady()) {
193 return ERR_INVALID_OPERATION;
194 }
195 return amsMgrServiceInner_->KillApplicationByUserId(bundleName, accountId);
196 }
197
AbilityAttachTimeOut(const sptr<IRemoteObject> & token)198 void AmsMgrScheduler::AbilityAttachTimeOut(const sptr<IRemoteObject> &token)
199 {
200 HILOG_INFO("AmsMgrScheduler AttachTimeOut begin");
201 if (!IsReady()) {
202 return;
203 }
204
205 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
206 HILOG_ERROR("Permission verification failed.");
207 return;
208 }
209 auto task = [=]() { amsMgrServiceInner_->HandleAbilityAttachTimeOut(token); };
210 amsHandler_->SubmitTask(task);
211 }
212
PrepareTerminate(const sptr<IRemoteObject> & token)213 void AmsMgrScheduler::PrepareTerminate(const sptr<IRemoteObject> &token)
214 {
215 HILOG_DEBUG("Notify AppMgrService to prepare to terminate the ability.");
216 if (!IsReady()) {
217 return;
218 }
219
220 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
221 HILOG_ERROR("Permission verification failed.");
222 return;
223 }
224 auto task = [=]() { amsMgrServiceInner_->PrepareTerminate(token); };
225 amsHandler_->SubmitTask(task);
226 }
227
UpdateApplicationInfoInstalled(const std::string & bundleName,const int uid)228 int32_t AmsMgrScheduler::UpdateApplicationInfoInstalled(const std::string &bundleName, const int uid)
229 {
230 if (!IsReady()) {
231 return ERR_INVALID_OPERATION;
232 }
233
234 return amsMgrServiceInner_->UpdateApplicationInfoInstalled(bundleName, uid);
235 }
236
KillApplication(const std::string & bundleName)237 int32_t AmsMgrScheduler::KillApplication(const std::string &bundleName)
238 {
239 HILOG_INFO("bundleName = %{public}s", bundleName.c_str());
240 if (!IsReady()) {
241 return ERR_INVALID_OPERATION;
242 }
243
244 return amsMgrServiceInner_->KillApplication(bundleName);
245 }
246
KillApplicationByUid(const std::string & bundleName,const int uid)247 int32_t AmsMgrScheduler::KillApplicationByUid(const std::string &bundleName, const int uid)
248 {
249 HILOG_INFO("bundleName = %{public}s, uid = %{public}d", bundleName.c_str(), uid);
250 if (!IsReady()) {
251 return ERR_INVALID_OPERATION;
252 }
253 return amsMgrServiceInner_->KillApplicationByUid(bundleName, uid);
254 }
255
KillApplicationSelf()256 int32_t AmsMgrScheduler::KillApplicationSelf()
257 {
258 if (!IsReady()) {
259 return ERR_INVALID_OPERATION;
260 }
261 return amsMgrServiceInner_->KillApplicationSelf();
262 }
263
IsReady() const264 bool AmsMgrScheduler::IsReady() const
265 {
266 if (!amsMgrServiceInner_) {
267 HILOG_ERROR("amsMgrServiceInner_ is null");
268 return false;
269 }
270 if (!amsHandler_) {
271 HILOG_ERROR("amsHandler_ is null");
272 return false;
273 }
274 return true;
275 }
276
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)277 void AmsMgrScheduler::GetRunningProcessInfoByToken(
278 const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
279 {
280 if (!IsReady()) {
281 return;
282 }
283
284 amsMgrServiceInner_->GetRunningProcessInfoByToken(token, info);
285 }
286
GetRunningProcessInfoByPid(const pid_t pid,OHOS::AppExecFwk::RunningProcessInfo & info)287 void AmsMgrScheduler::GetRunningProcessInfoByPid(const pid_t pid, OHOS::AppExecFwk::RunningProcessInfo &info)
288 {
289 if (!IsReady()) {
290 return;
291 }
292
293 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
294 HILOG_ERROR("Permission verification failed.");
295 return;
296 }
297 amsMgrServiceInner_->GetRunningProcessInfoByPid(pid, info);
298 }
299
SetAbilityForegroundingFlagToAppRecord(const pid_t pid)300 void AmsMgrScheduler::SetAbilityForegroundingFlagToAppRecord(const pid_t pid)
301 {
302 if (!IsReady()) {
303 return;
304 }
305 amsMgrServiceInner_->SetAbilityForegroundingFlagToAppRecord(pid);
306 }
307
StartSpecifiedAbility(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo)308 void AmsMgrScheduler::StartSpecifiedAbility(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo)
309 {
310 if (!IsReady()) {
311 return;
312 }
313
314 if (amsMgrServiceInner_->VerifyRequestPermission() != ERR_OK) {
315 HILOG_ERROR("Permission verification failed.");
316 return;
317 }
318 auto task = [=]() { amsMgrServiceInner_->StartSpecifiedAbility(want, abilityInfo); };
319 amsHandler_->SubmitTask(task);
320 }
321
RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> & response)322 void AmsMgrScheduler::RegisterStartSpecifiedAbilityResponse(const sptr<IStartSpecifiedAbilityResponse> &response)
323 {
324 if (!IsReady()) {
325 return;
326 }
327 auto task = [=]() { amsMgrServiceInner_->RegisterStartSpecifiedAbilityResponse(response); };
328 amsHandler_->SubmitTask(task);
329 }
330
GetApplicationInfoByProcessID(const int pid,AppExecFwk::ApplicationInfo & application,bool & debug)331 int AmsMgrScheduler::GetApplicationInfoByProcessID(const int pid, AppExecFwk::ApplicationInfo &application, bool &debug)
332 {
333 if (!IsReady()) {
334 return ERR_INVALID_OPERATION;
335 }
336 return amsMgrServiceInner_->GetApplicationInfoByProcessID(pid, application, debug);
337 }
338
SetCurrentUserId(const int32_t userId)339 void AmsMgrScheduler::SetCurrentUserId(const int32_t userId)
340 {
341 if (!IsReady()) {
342 return;
343 }
344 amsMgrServiceInner_->SetCurrentUserId(userId);
345 }
346
GetBundleNameByPid(const int pid,std::string & bundleName,int32_t & uid)347 int32_t AmsMgrScheduler::GetBundleNameByPid(const int pid, std::string &bundleName, int32_t &uid)
348 {
349 if (!IsReady()) {
350 return ERR_INVALID_OPERATION;
351 }
352 return amsMgrServiceInner_->GetBundleNameByPid(pid, bundleName, uid);
353 }
354 } // namespace AppExecFwk
355 } // namespace OHOS
356