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