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