• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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::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 
SetAbilityForegroundingFlagToAppRecord(const pid_t pid) const290 void AppScheduler::SetAbilityForegroundingFlagToAppRecord(const pid_t pid) const
291 {
292     CHECK_POINTER(appMgrClient_);
293     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->SetAbilityForegroundingFlagToAppRecord(pid));
294 }
295 
StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> & bundleInfos)296 void AppScheduler::StartupResidentProcess(const std::vector<AppExecFwk::BundleInfo> &bundleInfos)
297 {
298     CHECK_POINTER(appMgrClient_);
299     appMgrClient_->StartupResidentProcess(bundleInfos);
300 }
301 
StartSpecifiedAbility(const AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo)302 void AppScheduler::StartSpecifiedAbility(const AAFwk::Want &want, const AppExecFwk::AbilityInfo &abilityInfo)
303 {
304     CHECK_POINTER(appMgrClient_);
305     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->StartSpecifiedAbility(want, abilityInfo));
306 }
307 
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)308 void StartSpecifiedAbilityResponse::OnAcceptWantResponse(
309     const AAFwk::Want &want, const std::string &flag)
310 {
311     DelayedSingleton<AbilityManagerService>::GetInstance()->OnAcceptWantResponse(want, flag);
312 }
313 
OnTimeoutResponse(const AAFwk::Want & want)314 void StartSpecifiedAbilityResponse::OnTimeoutResponse(const AAFwk::Want &want)
315 {
316     DelayedSingleton<AbilityManagerService>::GetInstance()->OnStartSpecifiedAbilityTimeoutResponse(want);
317 }
GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> & info)318 int AppScheduler::GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> &info)
319 {
320     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
321     return static_cast<int>(appMgrClient_->GetAllRunningProcesses(info));
322 }
323 
GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> & info,int32_t userId)324 int AppScheduler::GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> &info, int32_t userId)
325 {
326     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
327     return static_cast<int>(appMgrClient_->GetProcessRunningInfosByUserId(info, userId));
328 }
329 
ConvertAppState(const AppState & state)330 std::string AppScheduler::ConvertAppState(const AppState &state)
331 {
332     auto it = appStateToStrMap_.find(state);
333     if (it != appStateToStrMap_.end()) {
334         return it->second;
335     }
336     return "INVALIDSTATE";
337 }
338 
StartUserTest(const Want & want,const sptr<IRemoteObject> & observer,const AppExecFwk::BundleInfo & bundleInfo,int32_t userId)339 int AppScheduler::StartUserTest(
340     const Want &want, const sptr<IRemoteObject> &observer, const AppExecFwk::BundleInfo &bundleInfo, int32_t userId)
341 {
342     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
343     int ret = appMgrClient_->StartUserTestProcess(want, observer, bundleInfo, userId);
344     if (ret != ERR_OK) {
345         HILOG_ERROR("Fail to start user test.");
346         return INNER_ERR;
347     }
348     return ERR_OK;
349 }
350 
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)351 int AppScheduler::FinishUserTest(const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
352 {
353     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
354     int ret = appMgrClient_->FinishUserTest(msg, resultCode, bundleName);
355     if (ret != ERR_OK) {
356         HILOG_ERROR("Fail to start user test.");
357         return INNER_ERR;
358     }
359     return ERR_OK;
360 }
361 
UpdateConfiguration(const AppExecFwk::Configuration & config)362 int AppScheduler::UpdateConfiguration(const AppExecFwk::Configuration &config)
363 {
364     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
365     auto ret = static_cast<int>(appMgrClient_->UpdateConfiguration(config));
366     if (ret != ERR_OK) {
367         HILOG_ERROR("UpdateConfiguration failed.");
368         return INNER_ERR;
369     }
370 
371     return ERR_OK;
372 }
373 
GetConfiguration(AppExecFwk::Configuration & config)374 int AppScheduler::GetConfiguration(AppExecFwk::Configuration &config)
375 {
376     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
377     auto ret = static_cast<int>(appMgrClient_->GetConfiguration(config));
378     if (ret != ERR_OK) {
379         HILOG_ERROR("GetConfiguration failed.");
380         return INNER_ERR;
381     }
382 
383     return ERR_OK;
384 }
385 
GetAbilityRecordsByProcessID(const int pid,std::vector<sptr<IRemoteObject>> & tokens)386 int AppScheduler::GetAbilityRecordsByProcessID(const int pid, std::vector<sptr<IRemoteObject>> &tokens)
387 {
388     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
389     auto ret = static_cast<int>(appMgrClient_->GetAbilityRecordsByProcessID(pid, tokens));
390     if (ret != ERR_OK) {
391         HILOG_ERROR("GetAbilityRecordsByProcessID failed.");
392         return INNER_ERR;
393     }
394 
395     return ERR_OK;
396 }
397 
GetApplicationInfoByProcessID(const int pid,AppExecFwk::ApplicationInfo & application,bool & debug)398 int AppScheduler::GetApplicationInfoByProcessID(const int pid, AppExecFwk::ApplicationInfo &application, bool &debug)
399 {
400     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
401     auto ret = static_cast<int>(appMgrClient_->GetApplicationInfoByProcessID(pid, application, debug));
402     if (ret != ERR_OK) {
403         HILOG_ERROR("GetApplicationInfoByProcessID failed.");
404         return ret;
405     }
406 
407     return ERR_OK;
408 }
409 
410 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAppService()411 int AppScheduler::BlockAppService()
412 {
413     HILOG_INFO("[%{public}s(%{public}s)] enter", __FILE__, __FUNCTION__);
414     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
415     auto ret = static_cast<int>(IN_PROCESS_CALL(appMgrClient_->BlockAppService()));
416     if (ret != ERR_OK) {
417         HILOG_ERROR("BlockAppService failed.");
418         return INNER_ERR;
419     }
420     return ERR_OK;
421 }
422 #endif
423 
GetBundleNameByPid(const int pid,std::string & bundleName,int32_t & uid)424 int32_t AppScheduler::GetBundleNameByPid(const int pid, std::string &bundleName, int32_t &uid)
425 {
426     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
427     int32_t ret = static_cast<int32_t>(IN_PROCESS_CALL(appMgrClient_->GetBundleNameByPid(pid, bundleName, uid)));
428     if (ret != ERR_OK) {
429         HILOG_ERROR("Get bundle name failed.");
430         return INNER_ERR;
431     }
432     return ERR_OK;
433 }
434 
SetCurrentUserId(const int32_t userId)435 void AppScheduler::SetCurrentUserId(const int32_t userId)
436 {
437     CHECK_POINTER(appMgrClient_);
438     IN_PROCESS_CALL_WITHOUT_RET(appMgrClient_->SetCurrentUserId(userId));
439 }
440 
NotifyFault(const AppExecFwk::FaultData & faultData)441 int32_t AppScheduler::NotifyFault(const AppExecFwk::FaultData &faultData)
442 {
443     CHECK_POINTER_AND_RETURN(appMgrClient_, INNER_ERR);
444     auto ret = static_cast<int>(appMgrClient_->NotifyAppFault(faultData));
445     if (ret != ERR_OK) {
446         HILOG_ERROR("NotifyAppFault failed.");
447         return INNER_ERR;
448     }
449 
450     return ERR_OK;
451 }
452 }  // namespace AAFwk
453 }  // namespace OHOS
454