• 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 "app_scheduler.h"
17 
18 #include "ability_manager_errors.h"
19 #include "ability_manager_service.h"
20 #include "ability_record.h"
21 #include "ability_util.h"
22 #include "appmgr/app_mgr_constants.h"
23 #include "hitrace_meter.h"
24 #include "hilog_wrapper.h"
25 #include "in_process_call_wrapper.h"
26 
27 namespace OHOS {
28 namespace AAFwk {
29 const std::map<AppState, std::string> appStateToStrMap_ = {
30     std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
31     std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
32     std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
33     std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
34     std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
35     std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
36     std::map<AppState, std::string>::value_type(AppState::END, "END"),
37     std::map<AppState, std::string>::value_type(AppState::FOCUS, "FOCUS"),
38 };
AppScheduler()39 AppScheduler::AppScheduler() : appMgrClient_(std::make_unique<AppExecFwk::AppMgrClient>())
40 {}
41 
~AppScheduler()42 AppScheduler::~AppScheduler()
43 {}
44 
Init(const std::weak_ptr<AppStateCallback> & callback)45 bool AppScheduler::Init(const std::weak_ptr<AppStateCallback> &callback)
46 {
47     CHECK_POINTER_RETURN_BOOL(callback.lock());
48     CHECK_POINTER_RETURN_BOOL(appMgrClient_);
49 
50     std::lock_guard<std::recursive_mutex> guard(lock_);
51     if (isInit_) {
52         return true;
53     }
54 
55     callback_ = callback;
56     /* because the errcode type of AppMgr Client API will be changed to int,
57      * so must to covert the return result  */
58     int result = static_cast<int>(appMgrClient_->ConnectAppMgrService());
59     if (result != ERR_OK) {
60         HILOG_ERROR("failed to ConnectAppMgrService");
61         return false;
62     }
63     this->IncStrongRef(this);
64     result = static_cast<int>(appMgrClient_->RegisterAppStateCallback(sptr<AppScheduler>(this)));
65     if (result != ERR_OK) {
66         HILOG_ERROR("failed to RegisterAppStateCallback");
67         return false;
68     }
69 
70     startSpecifiedAbilityResponse_ = new (std::nothrow) StartSpecifiedAbilityResponse();
71     if (startSpecifiedAbilityResponse_ == nullptr) {
72         HILOG_ERROR("startSpecifiedAbilityResponse_ is nullptr.");
73         return false;
74     }
75     appMgrClient_->RegisterStartSpecifiedAbilityResponse(startSpecifiedAbilityResponse_);
76 
77     HILOG_INFO("success to ConnectAppMgrService");
78     isInit_ = true;
79     return true;
80 }
81 
LoadAbility(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,const Want & want)82 int AppScheduler::LoadAbility(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
83     const AppExecFwk::AbilityInfo &abilityInfo, const AppExecFwk::ApplicationInfo &applicationInfo, const Want &want)
84 {
85     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
86     HILOG_DEBUG("Send load ability to AppMgrService.");
87     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
88     /* because the errcode type of AppMgr Client API will be changed to int,
89      * so must to covert the return result  */
90     int ret = static_cast<int>(IN_PROCESS_CALL(
91         appMgrClient_->LoadAbility(token, preToken, abilityInfo, applicationInfo, want)));
92     if (ret != ERR_OK) {
93         HILOG_ERROR("AppScheduler fail to LoadAbility. ret %d", ret);
94         return INNER_ERR;
95     }
96     return ERR_OK;
97 }
98 
TerminateAbility(const sptr<IRemoteObject> & token,bool clearMissionFlag)99 int AppScheduler::TerminateAbility(const sptr<IRemoteObject> &token, bool clearMissionFlag)
100 {
101     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
102     HILOG_DEBUG("Terminate ability.");
103     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
104     /* because the errcode type of AppMgr Client API will be changed to int,
105      * so must to covert the return result  */
106     int ret = static_cast<int>(IN_PROCESS_CALL(appMgrClient_->TerminateAbility(token, clearMissionFlag)));
107     if (ret != ERR_OK) {
108         HILOG_ERROR("AppScheduler fail to TerminateAbility. ret %d", ret);
109         return INNER_ERR;
110     }
111     return ERR_OK;
112 }
113 
UpdateApplicationInfoInstalled(const std::string & bundleName,const int32_t uid)114 int AppScheduler::UpdateApplicationInfoInstalled(const std::string &bundleName, const int32_t uid)
115 {
116     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
117     HILOG_DEBUG("Start to update the application info after new module installed.");
118     int ret = (int)appMgrClient_->UpdateApplicationInfoInstalled(bundleName, uid);
119     if (ret != ERR_OK) {
120         HILOG_ERROR("Fail to UpdateApplicationInfoInstalled.");
121         return INNER_ERR;
122     }
123 
124     return ERR_OK;
125 }
126 
MoveToForeground(const sptr<IRemoteObject> & token)127 void AppScheduler::MoveToForeground(const sptr<IRemoteObject> &token)
128 {
129     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
130     HILOG_DEBUG("Start to move the ability to foreground.");
131     CHECK_POINTER(appMgrClient_);
132     IN_PROCESS_CALL_WITHOUT_RET(
133         appMgrClient_->UpdateAbilityState(token, AppExecFwk::AbilityState::ABILITY_STATE_FOREGROUND));
134 }
135 
MoveToBackground(const sptr<IRemoteObject> & token)136 void AppScheduler::MoveToBackground(const sptr<IRemoteObject> &token)
137 {
138     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
139     HILOG_DEBUG("Move the app to background.");
140     CHECK_POINTER(appMgrClient_);
141     IN_PROCESS_CALL_WITHOUT_RET(
142         appMgrClient_->UpdateAbilityState(token, AppExecFwk::AbilityState::ABILITY_STATE_BACKGROUND));
143 }
144 
UpdateAbilityState(const sptr<IRemoteObject> & token,const AppExecFwk::AbilityState state)145 void AppScheduler::UpdateAbilityState(const sptr<IRemoteObject> &token, const AppExecFwk::AbilityState state)
146 {
147     HILOG_DEBUG("UpdateAbilityState.");
148     CHECK_POINTER(appMgrClient_);
149     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->UpdateAbilityState(token, state));
150 }
151 
UpdateExtensionState(const sptr<IRemoteObject> & token,const AppExecFwk::ExtensionState state)152 void AppScheduler::UpdateExtensionState(const sptr<IRemoteObject> &token, const AppExecFwk::ExtensionState state)
153 {
154     HILOG_DEBUG("UpdateExtensionState.");
155     CHECK_POINTER(appMgrClient_);
156     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->UpdateExtensionState(token, state));
157 }
158 
AbilityBehaviorAnalysis(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & preToken,const int32_t visibility,const int32_t perceptibility,const int32_t connectionState)159 void AppScheduler::AbilityBehaviorAnalysis(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &preToken,
160     const int32_t visibility, const int32_t perceptibility, const int32_t connectionState)
161 {
162     HILOG_DEBUG("Ability behavior analysis.");
163     CHECK_POINTER(appMgrClient_);
164     IN_PROCESS_CALL_WITHOUT_RET(
165         appMgrClient_->AbilityBehaviorAnalysis(token, preToken, visibility, perceptibility, connectionState));
166 }
167 
KillProcessByAbilityToken(const sptr<IRemoteObject> & token)168 void AppScheduler::KillProcessByAbilityToken(const sptr<IRemoteObject> &token)
169 {
170     HILOG_DEBUG("Kill process by ability token.");
171     CHECK_POINTER(appMgrClient_);
172     appMgrClient_->KillProcessByAbilityToken(token);
173 }
174 
KillProcessesByUserId(int32_t userId)175 void AppScheduler::KillProcessesByUserId(int32_t userId)
176 {
177     HILOG_DEBUG("Kill process by user id.");
178     CHECK_POINTER(appMgrClient_);
179     appMgrClient_->KillProcessesByUserId(userId);
180 }
181 
ConvertToAppAbilityState(const int32_t state)182 AppAbilityState AppScheduler::ConvertToAppAbilityState(const int32_t state)
183 {
184     AppExecFwk::AbilityState abilityState = static_cast<AppExecFwk::AbilityState>(state);
185     switch (abilityState) {
186         case AppExecFwk::AbilityState::ABILITY_STATE_FOREGROUND: {
187             return AppAbilityState::ABILITY_STATE_FOREGROUND;
188         }
189         case AppExecFwk::AbilityState::ABILITY_STATE_BACKGROUND: {
190             return AppAbilityState::ABILITY_STATE_BACKGROUND;
191         }
192         default:
193             return AppAbilityState::ABILITY_STATE_UNDEFINED;
194     }
195 }
196 
GetAbilityState() const197 AppAbilityState AppScheduler::GetAbilityState() const
198 {
199     return appAbilityState_;
200 }
201 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const AppExecFwk::AbilityState state)202 void AppScheduler::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const AppExecFwk::AbilityState state)
203 {
204     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
205     HILOG_INFO("On ability request done, state:%{public}d", static_cast<int32_t>(state));
206     auto callback = callback_.lock();
207     CHECK_POINTER(callback);
208     appAbilityState_ = ConvertToAppAbilityState(static_cast<int32_t>(state));
209     callback->OnAbilityRequestDone(token, static_cast<int32_t>(state));
210 }
211 
KillApplication(const std::string & bundleName)212 int AppScheduler::KillApplication(const std::string &bundleName)
213 {
214     HILOG_INFO("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
215     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
216     int ret = (int)appMgrClient_->KillApplication(bundleName);
217     if (ret != ERR_OK) {
218         HILOG_ERROR("Fail to kill application.");
219         return INNER_ERR;
220     }
221 
222     return ERR_OK;
223 }
224 
KillApplicationByUid(const std::string & bundleName,int32_t uid)225 int AppScheduler::KillApplicationByUid(const std::string &bundleName, int32_t uid)
226 {
227     HILOG_INFO("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
228     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
229     int ret = (int)appMgrClient_->KillApplicationByUid(bundleName, uid);
230     if (ret != ERR_OK) {
231         HILOG_ERROR("Fail to kill application by uid.");
232         return INNER_ERR;
233     }
234 
235     return ERR_OK;
236 }
237 
ClearUpApplicationData(const std::string & bundleName)238 int AppScheduler::ClearUpApplicationData(const std::string &bundleName)
239 {
240     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
241     int ret = (int)appMgrClient_->ClearUpApplicationData(bundleName);
242     if (ret != ERR_OK) {
243         HILOG_ERROR("Fail to clear application data.");
244         return INNER_ERR;
245     }
246     return ERR_OK;
247 }
248 
AttachTimeOut(const sptr<IRemoteObject> & token)249 void AppScheduler::AttachTimeOut(const sptr<IRemoteObject> &token)
250 {
251     CHECK_POINTER(appMgrClient_);
252     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->AbilityAttachTimeOut(token));
253 }
254 
PrepareTerminate(const sptr<IRemoteObject> & token)255 void AppScheduler::PrepareTerminate(const sptr<IRemoteObject> &token)
256 {
257     CHECK_POINTER(appMgrClient_);
258     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->PrepareTerminate(token));
259 }
260 
OnAppStateChanged(const AppExecFwk::AppProcessData & appData)261 void AppScheduler::OnAppStateChanged(const AppExecFwk::AppProcessData &appData)
262 {
263     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
264     auto callback = callback_.lock();
265     CHECK_POINTER(callback);
266     AppInfo info;
267     for (const auto &list : appData.appDatas) {
268         AppData data;
269         data.appName = list.appName;
270         data.uid = list.uid;
271         info.appData.push_back(data);
272     }
273     info.processName = appData.processName;
274     info.state = static_cast<AppState>(appData.appState);
275     callback->OnAppStateChanged(info);
276 }
277 
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)278 void AppScheduler::GetRunningProcessInfoByToken(const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
279 {
280     CHECK_POINTER(appMgrClient_);
281     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->GetRunningProcessInfoByToken(token, info));
282 }
283 
GetRunningProcessInfoByPid(const pid_t pid,OHOS::AppExecFwk::RunningProcessInfo & info) const284 void AppScheduler::GetRunningProcessInfoByPid(const pid_t pid, OHOS::AppExecFwk::RunningProcessInfo &info) const
285 {
286     CHECK_POINTER(appMgrClient_);
287     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->GetRunningProcessInfoByPid(pid, info));
288 }
289 
StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> & bundleInfos)290 void AppScheduler::StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> &bundleInfos)
291 {
292     CHECK_POINTER(appMgrClient_);
293     appMgrClient_->StartupResidentProcess(bundleInfos);
294 }
295 
StartSpecifiedAbility(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo)296 void AppScheduler::StartSpecifiedAbility(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo)
297 {
298     CHECK_POINTER(appMgrClient_);
299     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->StartSpecifiedAbility(want, abilityInfo));
300 }
301 
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)302 void StartSpecifiedAbilityResponse::OnAcceptWantResponse(
303     const AAFwk::Want &want, const std::string &flag)
304 {
305     DelayedSingleton<AbilityManagerService>::GetInstance()->OnAcceptWantResponse(want, flag);
306 }
307 
OnTimeoutResponse(const AAFwk::Want & want)308 void StartSpecifiedAbilityResponse::OnTimeoutResponse(const AAFwk::Want &want)
309 {
310     DelayedSingleton<AbilityManagerService>::GetInstance()->OnStartSpecifiedAbilityTimeoutResponse(want);
311 }
GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> & info)312 int AppScheduler::GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> &info)
313 {
314     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
315     return static_cast<int>(appMgrClient_->GetAllRunningProcesses(info));
316 }
317 
GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> & info,int32_t userId)318 int AppScheduler::GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> &info, int32_t userId)
319 {
320     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
321     return static_cast<int>(appMgrClient_->GetProcessRunningInfosByUserId(info, userId));
322 }
323 
ConvertAppState(const AppState & state)324 std::string AppScheduler::ConvertAppState(const AppState &state)
325 {
326     auto it = appStateToStrMap_.find(state);
327     if (it != appStateToStrMap_.end()) {
328         return it->second;
329     }
330     return "INVALIDSTATE";
331 }
332 
StartUserTest(const Want & want,const sptr<IRemoteObject> & observer,const AppExecFwk::BundleInfo & bundleInfo,int32_t userId)333 int AppScheduler::StartUserTest(
334     const Want &want, const sptr<IRemoteObject> &observer, const AppExecFwk::BundleInfo &bundleInfo, int32_t userId)
335 {
336     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
337     int ret = appMgrClient_->StartUserTestProcess(want, observer, bundleInfo, userId);
338     if (ret != ERR_OK) {
339         HILOG_ERROR("Fail to start user test.");
340         return INNER_ERR;
341     }
342     return ERR_OK;
343 }
344 
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)345 int AppScheduler::FinishUserTest(const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
346 {
347     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
348     int ret = appMgrClient_->FinishUserTest(msg, resultCode, bundleName);
349     if (ret != ERR_OK) {
350         HILOG_ERROR("Fail to start user test.");
351         return INNER_ERR;
352     }
353     return ERR_OK;
354 }
355 
UpdateConfiguration(const AppExecFwk::Configuration & config)356 int AppScheduler::UpdateConfiguration(const AppExecFwk::Configuration &config)
357 {
358     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
359     auto ret = static_cast<int>(appMgrClient_->UpdateConfiguration(config));
360     if (ret != ERR_OK) {
361         HILOG_ERROR("UpdateConfiguration failed.");
362         return INNER_ERR;
363     }
364 
365     return ERR_OK;
366 }
367 
GetConfiguration(AppExecFwk::Configuration & config)368 int AppScheduler::GetConfiguration(AppExecFwk::Configuration &config)
369 {
370     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
371     auto ret = static_cast<int>(appMgrClient_->GetConfiguration(config));
372     if (ret != ERR_OK) {
373         HILOG_ERROR("GetConfiguration failed.");
374         return INNER_ERR;
375     }
376 
377     return ERR_OK;
378 }
379 
GetAbilityRecordsByProcessID(const int pid,std::vector<sptr<IRemoteObject>> & tokens)380 int AppScheduler::GetAbilityRecordsByProcessID(const int pid, std::vector<sptr<IRemoteObject>> &tokens)
381 {
382     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
383     auto ret = static_cast<int>(appMgrClient_->GetAbilityRecordsByProcessID(pid, tokens));
384     if (ret != ERR_OK) {
385         HILOG_ERROR("GetAbilityRecordsByProcessID failed.");
386         return INNER_ERR;
387     }
388 
389     return ERR_OK;
390 }
391 
GetApplicationInfoByProcessID(const int pid,AppExecFwk::ApplicationInfo & application,bool & debug)392 int AppScheduler::GetApplicationInfoByProcessID(const int pid, AppExecFwk::ApplicationInfo &application, bool &debug)
393 {
394     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
395     auto ret = static_cast<int>(appMgrClient_->GetApplicationInfoByProcessID(pid, application, debug));
396     if (ret != ERR_OK) {
397         HILOG_ERROR("GetApplicationInfoByProcessID failed.");
398         return ret;
399     }
400 
401     return ERR_OK;
402 }
403 
404 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAppService()405 int AppScheduler::BlockAppService()
406 {
407     HILOG_INFO("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
408     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
409     auto ret = static_cast<int>(IN_PROCESS_CALL(appMgrClient_->BlockAppService()));
410     if (ret != ERR_OK) {
411         HILOG_ERROR("BlockAppService failed.");
412         return INNER_ERR;
413     }
414     return ERR_OK;
415 }
416 #endif
417 }  // namespace AAFwk
418 }  // namespace OHOS
419