• 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<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