• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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