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