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