• 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_running_manager.h"
17 
18 #include "app_mgr_service_inner.h"
19 #include "datetime_ex.h"
20 #include "iremote_object.h"
21 
22 #include "appexecfwk_errors.h"
23 #include "common_event_support.h"
24 #include "hilog_wrapper.h"
25 #include "hitrace_meter.h"
26 #include "os_account_manager_wrapper.h"
27 #include "perf_profile.h"
28 #include "quick_fix_callback_with_record.h"
29 
30 namespace OHOS {
31 namespace AppExecFwk {
AppRunningManager()32 AppRunningManager::AppRunningManager()
33 {}
~AppRunningManager()34 AppRunningManager::~AppRunningManager()
35 {}
36 
CreateAppRunningRecord(const std::shared_ptr<ApplicationInfo> & appInfo,const std::string & processName,const BundleInfo & bundleInfo)37 std::shared_ptr<AppRunningRecord> AppRunningManager::CreateAppRunningRecord(
38     const std::shared_ptr<ApplicationInfo> &appInfo, const std::string &processName, const BundleInfo &bundleInfo)
39 {
40     if (!appInfo) {
41         HILOG_ERROR("param error");
42         return nullptr;
43     }
44 
45     if (processName.empty()) {
46         HILOG_ERROR("processName error");
47         return nullptr;
48     }
49 
50     auto recordId = AppRecordId::Create();
51     auto appRecord = std::make_shared<AppRunningRecord>(appInfo, recordId, processName);
52 
53     std::regex rule("[a-zA-Z.]+[-_#]{1}");
54     std::string signCode;
55     bool isStageBasedModel = false;
56     ClipStringContent(rule, bundleInfo.appId, signCode);
57     if (!bundleInfo.hapModuleInfos.empty()) {
58         isStageBasedModel = bundleInfo.hapModuleInfos.back().isStageBasedModel;
59     }
60     HILOG_DEBUG("Create AppRunningRecord, processName: %{public}s, StageBasedModel:%{public}d, recordId: %{public}d",
61         processName.c_str(), isStageBasedModel, recordId);
62 
63     appRecord->SetStageModelState(isStageBasedModel);
64     appRecord->SetSignCode(signCode);
65     appRecord->SetJointUserId(bundleInfo.jointUserId);
66     std::lock_guard<std::recursive_mutex> guard(lock_);
67     appRunningRecordMap_.emplace(recordId, appRecord);
68     return appRecord;
69 }
70 
CheckAppRunningRecordIsExist(const std::string & appName,const std::string & processName,const int uid,const BundleInfo & bundleInfo)71 std::shared_ptr<AppRunningRecord> AppRunningManager::CheckAppRunningRecordIsExist(const std::string &appName,
72     const std::string &processName, const int uid, const BundleInfo &bundleInfo)
73 {
74     HILOG_INFO("appName: %{public}s, processName: %{public}s, uid : %{public}d",
75         appName.c_str(), processName.c_str(), uid);
76 
77     std::regex rule("[a-zA-Z.]+[-_#]{1}");
78     std::string signCode;
79     auto jointUserId = bundleInfo.jointUserId;
80     HILOG_INFO("jointUserId : %{public}s", jointUserId.c_str());
81     ClipStringContent(rule, bundleInfo.appId, signCode);
82 
83     auto FindSameProcess = [signCode, processName, jointUserId](const auto &pair) {
84             return ((pair.second->GetSignCode() == signCode) &&
85                     (pair.second->GetProcessName() == processName) &&
86                     (pair.second->GetJointUserId() == jointUserId) &&
87                     !(pair.second->IsTerminating()) &&
88                     !(pair.second->IsKilling()));
89     };
90 
91     // If it is not empty, look for whether it can come in the same process
92     std::lock_guard<std::recursive_mutex> guard(lock_);
93     if (jointUserId.empty()) {
94         for (const auto &item : appRunningRecordMap_) {
95             const auto &appRecord = item.second;
96             if (appRecord && appRecord->GetProcessName() == processName &&
97                 !(appRecord->IsTerminating()) && !(appRecord->IsKilling())) {
98                 HILOG_INFO("appRecord->GetProcessName() : %{public}s", appRecord->GetProcessName().c_str());
99                 auto appInfoList = appRecord->GetAppInfoList();
100                 HILOG_INFO("appInfoList : %{public}zu", appInfoList.size());
101                 auto isExist = [&appName, &uid](const std::shared_ptr<ApplicationInfo> &appInfo) {
102                     HILOG_INFO("appInfo->name : %{public}s", appInfo->name.c_str());
103                     return appInfo->name == appName && appInfo->uid == uid;
104                 };
105                 auto appInfoIter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
106                 if (appInfoIter != appInfoList.end()) {
107                     return appRecord;
108                 }
109             }
110         }
111         return nullptr;
112     }
113 
114     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), FindSameProcess);
115     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
116 }
117 
GetAppRunningRecordByPid(const pid_t pid)118 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByPid(const pid_t pid)
119 {
120     std::lock_guard<std::recursive_mutex> guard(lock_);
121     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
122         return pair.second->GetPriorityObject()->GetPid() == pid;
123     });
124     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
125 }
126 
GetAppRunningRecordByAbilityToken(const sptr<IRemoteObject> & abilityToken)127 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByAbilityToken(
128     const sptr<IRemoteObject> &abilityToken)
129 {
130     std::lock_guard<std::recursive_mutex> guard(lock_);
131     for (const auto &item : appRunningRecordMap_) {
132         const auto &appRecord = item.second;
133         if (appRecord && appRecord->GetAbilityRunningRecordByToken(abilityToken)) {
134             return appRecord;
135         }
136     }
137     return nullptr;
138 }
139 
ProcessExitByBundleName(const std::string & bundleName,std::list<pid_t> & pids)140 bool AppRunningManager::ProcessExitByBundleName(const std::string &bundleName, std::list<pid_t> &pids)
141 {
142     std::lock_guard<std::recursive_mutex> guard(lock_);
143     for (const auto &item : appRunningRecordMap_) {
144         const auto &appRecord = item.second;
145         // Before using this method, consider whether you need.
146         if (appRecord) {
147             pid_t pid = appRecord->GetPriorityObject()->GetPid();
148             auto appInfoList = appRecord->GetAppInfoList();
149             auto isExist = [&bundleName](const std::shared_ptr<ApplicationInfo> &appInfo) {
150                 return appInfo->bundleName == bundleName;
151             };
152             auto iter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
153             if (iter != appInfoList.end() && pid > 0) {
154                 pids.push_back(pid);
155                 appRecord->ScheduleProcessSecurityExit();
156             }
157         }
158     }
159 
160     return !pids.empty();
161 }
162 
GetPidsByUserId(int32_t userId,std::list<pid_t> & pids)163 bool AppRunningManager::GetPidsByUserId(int32_t userId, std::list<pid_t> &pids)
164 {
165     std::lock_guard<std::recursive_mutex> guard(lock_);
166     for (const auto &item : appRunningRecordMap_) {
167         const auto &appRecord = item.second;
168         if (appRecord) {
169             int32_t id = -1;
170             if ((DelayedSingleton<OsAccountManagerWrapper>::GetInstance()->
171                 GetOsAccountLocalIdFromUid(appRecord->GetUid(), id) == 0) && (id == userId)) {
172                 pid_t pid = appRecord->GetPriorityObject()->GetPid();
173                 if (pid > 0) {
174                     pids.push_back(pid);
175                     appRecord->ScheduleProcessSecurityExit();
176                 }
177             }
178         }
179     }
180 
181     return (!pids.empty());
182 }
183 
ProcessUpdateApplicationInfoInstalled(const ApplicationInfo & appInfo)184 int32_t AppRunningManager::ProcessUpdateApplicationInfoInstalled(const ApplicationInfo &appInfo)
185 {
186     std::lock_guard<std::recursive_mutex> guard(lock_);
187     int32_t result = ERR_OK;
188     for (const auto &item : appRunningRecordMap_) {
189         const auto &appRecord = item.second;
190         if (!appRecord) {
191             continue;
192         }
193         auto appInfoList = appRecord->GetAppInfoList();
194         for (auto iter : appInfoList) {
195             if (iter->bundleName == appInfo.bundleName) {
196                 appRecord->UpdateApplicationInfoInstalled(appInfo);
197                 break;
198             }
199         }
200     }
201     return result;
202 }
203 
ProcessExitByBundleNameAndUid(const std::string & bundleName,const int uid,std::list<pid_t> & pids)204 bool AppRunningManager::ProcessExitByBundleNameAndUid(
205     const std::string &bundleName, const int uid, std::list<pid_t> &pids)
206 {
207     std::lock_guard<std::recursive_mutex> guard(lock_);
208     for (const auto &item : appRunningRecordMap_) {
209         const auto &appRecord = item.second;
210         if (appRecord) {
211             auto appInfoList = appRecord->GetAppInfoList();
212             auto isExist = [&bundleName, &uid](const std::shared_ptr<ApplicationInfo> &appInfo) {
213                 return appInfo->bundleName == bundleName && appInfo->uid == uid;
214             };
215             auto iter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
216             pid_t pid = appRecord->GetPriorityObject()->GetPid();
217             if (iter != appInfoList.end() && pid > 0) {
218                 pids.push_back(pid);
219 
220                 appRecord->SetKilling();
221                 appRecord->ScheduleProcessSecurityExit();
222             }
223         }
224     }
225 
226     return (pids.empty() ? false : true);
227 }
228 
ProcessExitByPid(pid_t pid)229 bool AppRunningManager::ProcessExitByPid(pid_t pid)
230 {
231     std::lock_guard<std::recursive_mutex> guard(lock_);
232     for (const auto &item : appRunningRecordMap_) {
233         const auto &appRecord = item.second;
234         if (appRecord) {
235             pid_t appPid = appRecord->GetPriorityObject()->GetPid();
236             if (appPid == pid) {
237                 appRecord->SetKilling();
238                 appRecord->ScheduleProcessSecurityExit();
239                 return true;
240             }
241         }
242     }
243 
244     return false;
245 }
246 
OnRemoteDied(const wptr<IRemoteObject> & remote)247 std::shared_ptr<AppRunningRecord> AppRunningManager::OnRemoteDied(const wptr<IRemoteObject> &remote)
248 {
249     HILOG_INFO("On remot died.");
250     if (remote == nullptr) {
251         HILOG_ERROR("remote is null");
252         return nullptr;
253     }
254     sptr<IRemoteObject> object = remote.promote();
255     if (!object) {
256         HILOG_ERROR("object is null");
257         return nullptr;
258     }
259     std::lock_guard<std::recursive_mutex> guard(lock_);
260     const auto &iter =
261         std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&object](const auto &pair) {
262             if (pair.second && pair.second->GetApplicationClient() != nullptr) {
263                 return pair.second->GetApplicationClient()->AsObject() == object;
264             }
265             return false;
266         });
267     if (iter == appRunningRecordMap_.end()) {
268         HILOG_ERROR("remote is not exist in the map.");
269         return nullptr;
270     }
271     auto appRecord = iter->second;
272     if (appRecord != nullptr) {
273         appRecord->SetApplicationClient(nullptr);
274     }
275     appRunningRecordMap_.erase(iter);
276     return appRecord;
277 }
278 
GetAppRunningRecordMap()279 std::map<const int32_t, const std::shared_ptr<AppRunningRecord>> AppRunningManager::GetAppRunningRecordMap()
280 {
281     std::lock_guard<std::recursive_mutex> guard(lock_);
282     return appRunningRecordMap_;
283 }
284 
RemoveAppRunningRecordById(const int32_t recordId)285 void AppRunningManager::RemoveAppRunningRecordById(const int32_t recordId)
286 {
287     std::lock_guard<std::recursive_mutex> guard(lock_);
288     appRunningRecordMap_.erase(recordId);
289 }
290 
ClearAppRunningRecordMap()291 void AppRunningManager::ClearAppRunningRecordMap()
292 {
293     std::lock_guard<std::recursive_mutex> guard(lock_);
294     appRunningRecordMap_.clear();
295 }
296 
HandleTerminateTimeOut(int64_t eventId)297 void AppRunningManager::HandleTerminateTimeOut(int64_t eventId)
298 {
299     HILOG_INFO("Handle terminate timeout.");
300     auto abilityRecord = GetAbilityRunningRecord(eventId);
301     if (!abilityRecord) {
302         HILOG_ERROR("abilityRecord is nullptr.");
303         return;
304     }
305     auto abilityToken = abilityRecord->GetToken();
306     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
307     if (!appRecord) {
308         HILOG_ERROR("appRecord is nullptr.");
309         return;
310     }
311     appRecord->AbilityTerminated(abilityToken);
312 }
313 
GetTerminatingAppRunningRecord(const sptr<IRemoteObject> & abilityToken)314 std::shared_ptr<AppRunningRecord> AppRunningManager::GetTerminatingAppRunningRecord(
315     const sptr<IRemoteObject> &abilityToken)
316 {
317     std::lock_guard<std::recursive_mutex> guard(lock_);
318     for (const auto &item : appRunningRecordMap_) {
319         const auto &appRecord = item.second;
320         if (appRecord && appRecord->GetAbilityByTerminateLists(abilityToken)) {
321             return appRecord;
322         }
323     }
324     return nullptr;
325 }
326 
GetAbilityRunningRecord(const int64_t eventId)327 std::shared_ptr<AbilityRunningRecord> AppRunningManager::GetAbilityRunningRecord(const int64_t eventId)
328 {
329     HILOG_INFO("Get ability running record by eventId.");
330     std::lock_guard<std::recursive_mutex> guard(lock_);
331     for (auto &item : appRunningRecordMap_) {
332         if (item.second) {
333             auto abilityRecord = item.second->GetAbilityRunningRecord(eventId);
334             if (abilityRecord) {
335                 return abilityRecord;
336             }
337         }
338     }
339     return nullptr;
340 }
341 
GetAppRunningRecord(const int64_t eventId)342 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecord(const int64_t eventId)
343 {
344     HILOG_INFO("Get app running record by eventId.");
345     std::lock_guard<std::recursive_mutex> guard(lock_);
346     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&eventId](const auto &pair) {
347         return pair.second->GetEventId() == eventId;
348     });
349     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
350 }
351 
HandleAbilityAttachTimeOut(const sptr<IRemoteObject> & token)352 void AppRunningManager::HandleAbilityAttachTimeOut(const sptr<IRemoteObject> &token)
353 {
354     HILOG_INFO("Handle ability attach timeOut.");
355     if (token == nullptr) {
356         HILOG_ERROR("token is nullptr.");
357         return;
358     }
359 
360     auto appRecord = GetAppRunningRecordByAbilityToken(token);
361     if (!appRecord) {
362         HILOG_ERROR("appRecord is nullptr.");
363         return;
364     }
365 
366     std::shared_ptr<AbilityRunningRecord> abilityRecord = appRecord->GetAbilityRunningRecordByToken(token);
367     if (abilityRecord) {
368         abilityRecord->SetTerminating();
369     }
370 
371     if (appRecord->IsLastAbilityRecord(token) && !appRecord->IsKeepAliveApp()) {
372         appRecord->SetTerminating();
373     }
374 
375     auto timeoutTask = [appRecord, token]() {
376         if (appRecord) {
377             appRecord->TerminateAbility(token, true);
378         }
379     };
380     appRecord->PostTask("DELAY_KILL_ABILITY", AMSEventHandler::KILL_PROCESS_TIMEOUT, timeoutTask);
381 }
382 
PrepareTerminate(const sptr<IRemoteObject> & token)383 void AppRunningManager::PrepareTerminate(const sptr<IRemoteObject> &token)
384 {
385     if (token == nullptr) {
386         HILOG_ERROR("token is nullptr.");
387         return;
388     }
389 
390     auto appRecord = GetAppRunningRecordByAbilityToken(token);
391     if (!appRecord) {
392         HILOG_ERROR("appRecord is nullptr.");
393         return;
394     }
395 
396     auto abilityRecord = appRecord->GetAbilityRunningRecordByToken(token);
397     if (abilityRecord) {
398         abilityRecord->SetTerminating();
399     }
400 
401     if (appRecord->IsLastAbilityRecord(token) && !appRecord->IsKeepAliveApp()) {
402         HILOG_INFO("The ability is the last in the app:%{public}s.", appRecord->GetName().c_str());
403         appRecord->SetTerminating();
404     }
405 }
406 
TerminateAbility(const sptr<IRemoteObject> & token,bool clearMissionFlag,std::shared_ptr<AppMgrServiceInner> appMgrServiceInner)407 void AppRunningManager::TerminateAbility(const sptr<IRemoteObject> &token, bool clearMissionFlag,
408     std::shared_ptr<AppMgrServiceInner> appMgrServiceInner)
409 {
410     if (!token) {
411         HILOG_ERROR("token is nullptr.");
412         return;
413     }
414 
415     auto appRecord = GetAppRunningRecordByAbilityToken(token);
416     if (!appRecord) {
417         HILOG_ERROR("appRecord is nullptr.");
418         return;
419     }
420     auto isLastAbility =
421         clearMissionFlag ? appRecord->IsLastPageAbilityRecord(token) : appRecord->IsLastAbilityRecord(token);
422     appRecord->TerminateAbility(token, false);
423 
424     auto isKeepAliveApp = appRecord->IsKeepAliveApp();
425     auto isLauncherApp = appRecord->GetApplicationInfo()->isLauncherApp;
426     if (isLastAbility && !isKeepAliveApp && !isLauncherApp) {
427         HILOG_DEBUG("The ability is the last in the app:%{public}s.", appRecord->GetName().c_str());
428         appRecord->SetTerminating();
429         if (clearMissionFlag && appMgrServiceInner != nullptr) {
430             appRecord->RemoveTerminateAbilityTimeoutTask(token);
431             HILOG_DEBUG("The ability is the last, kill application");
432             auto pid = appRecord->GetPriorityObject()->GetPid();
433             auto result = appMgrServiceInner->KillProcessByPid(pid);
434             if (result < 0) {
435                 HILOG_WARN("Kill application directly failed, pid: %{public}d", pid);
436             }
437             appMgrServiceInner->NotifyAppStatus(appRecord->GetBundleName(),
438                 EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_RESTARTED);
439         }
440     }
441 }
442 
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)443 void AppRunningManager::GetRunningProcessInfoByToken(
444     const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
445 {
446     std::lock_guard<std::recursive_mutex> guard(lock_);
447     auto appRecord = GetAppRunningRecordByAbilityToken(token);
448 
449     AssignRunningProcessInfoByAppRecord(appRecord, info);
450 }
451 
GetRunningProcessInfoByPid(const pid_t pid,OHOS::AppExecFwk::RunningProcessInfo & info)452 void AppRunningManager::GetRunningProcessInfoByPid(const pid_t pid, OHOS::AppExecFwk::RunningProcessInfo &info)
453 {
454     std::lock_guard<std::recursive_mutex> guard(lock_);
455     auto appRecord = GetAppRunningRecordByPid(pid);
456 
457     AssignRunningProcessInfoByAppRecord(appRecord, info);
458 }
459 
AssignRunningProcessInfoByAppRecord(std::shared_ptr<AppRunningRecord> appRecord,AppExecFwk::RunningProcessInfo & info) const460 void AppRunningManager::AssignRunningProcessInfoByAppRecord(
461     std::shared_ptr<AppRunningRecord> appRecord, AppExecFwk::RunningProcessInfo &info) const
462 {
463     if (!appRecord) {
464         HILOG_ERROR("appRecord is nullptr");
465         return;
466     }
467 
468     info.processName_ = appRecord->GetProcessName();
469     info.pid_ = appRecord->GetPriorityObject()->GetPid();
470     info.uid_ = appRecord->GetUid();
471     info.bundleNames.emplace_back(appRecord->GetBundleName());
472     info.state_ = static_cast<AppExecFwk::AppProcessState>(appRecord->GetState());
473     info.isContinuousTask = appRecord->IsContinuousTask();
474     info.isKeepAlive = appRecord->IsKeepAliveApp();
475     info.isFocused = appRecord->GetFocusFlag();
476     info.isTestProcess = (appRecord->GetUserTestInfo() != nullptr);
477     info.startTimeMillis_ = appRecord->GetAppStartTime();
478 }
479 
ClipStringContent(const std::regex & re,const std::string & source,std::string & afterCutStr)480 void AppRunningManager::ClipStringContent(const std::regex &re, const std::string &source, std::string &afterCutStr)
481 {
482     std::smatch basket;
483     if (std::regex_search(source, basket, re)) {
484         afterCutStr = basket.prefix().str() + basket.suffix().str();
485     }
486 }
487 
GetForegroundApplications(std::vector<AppStateData> & list)488 void AppRunningManager::GetForegroundApplications(std::vector<AppStateData> &list)
489 {
490     HILOG_INFO("%{public}s, begin.", __func__);
491     std::lock_guard<std::recursive_mutex> guard(lock_);
492     for (const auto &item : appRunningRecordMap_) {
493         const auto &appRecord = item.second;
494         if (!appRecord) {
495             HILOG_ERROR("appRecord is nullptr");
496             return;
497         }
498         auto state = appRecord->GetState();
499         if (state == ApplicationState::APP_STATE_FOREGROUND) {
500             AppStateData appData;
501             appData.bundleName = appRecord->GetBundleName();
502             appData.uid = appRecord->GetUid();
503             appData.state = static_cast<int32_t>(ApplicationState::APP_STATE_FOREGROUND);
504             appData.isFocused = appRecord->GetFocusFlag();
505             list.push_back(appData);
506             HILOG_INFO("%{public}s, bundleName:%{public}s", __func__, appData.bundleName.c_str());
507         }
508     }
509 }
510 
HandleAddAbilityStageTimeOut(const int64_t eventId)511 void AppRunningManager::HandleAddAbilityStageTimeOut(const int64_t eventId)
512 {
513     HILOG_DEBUG("Handle add ability stage timeout.");
514     auto abilityRecord = GetAbilityRunningRecord(eventId);
515     if (!abilityRecord) {
516         HILOG_ERROR("abilityRecord is nullptr");
517         return;
518     }
519 
520     auto abilityToken = abilityRecord->GetToken();
521     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
522     if (!appRecord) {
523         HILOG_ERROR("appRecord is nullptr");
524         return;
525     }
526 
527     appRecord->ScheduleProcessSecurityExit();
528 }
529 
HandleStartSpecifiedAbilityTimeOut(const int64_t eventId)530 void AppRunningManager::HandleStartSpecifiedAbilityTimeOut(const int64_t eventId)
531 {
532     HILOG_DEBUG("Handle receive multi instances timeout.");
533     auto abilityRecord = GetAbilityRunningRecord(eventId);
534     if (!abilityRecord) {
535         HILOG_ERROR("abilityRecord is nullptr");
536         return;
537     }
538 
539     auto abilityToken = abilityRecord->GetToken();
540     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
541     if (!appRecord) {
542         HILOG_ERROR("appRecord is nullptr");
543         return;
544     }
545 
546     appRecord->ScheduleProcessSecurityExit();
547 }
548 
UpdateConfiguration(const Configuration & config)549 int32_t AppRunningManager::UpdateConfiguration(const Configuration &config)
550 {
551     HILOG_INFO("call %{public}s", __func__);
552     std::lock_guard<std::recursive_mutex> guard(lock_);
553     HILOG_INFO("current app size %{public}zu", appRunningRecordMap_.size());
554     int32_t result = ERR_OK;
555     for (const auto &item : appRunningRecordMap_) {
556         const auto &appRecord = item.second;
557         if (appRecord) {
558             HILOG_INFO("Notification app [%{public}s]", appRecord->GetName().c_str());
559             result = appRecord->UpdateConfiguration(config);
560         }
561     }
562     return result;
563 }
564 
NotifyMemoryLevel(int32_t level)565 int32_t AppRunningManager::NotifyMemoryLevel(int32_t level)
566 {
567     std::lock_guard<std::recursive_mutex> guard(lock_);
568     HILOG_INFO("call %{public}s, current app size %{public}zu", __func__, appRunningRecordMap_.size());
569     for (const auto &item : appRunningRecordMap_) {
570         const auto &appRecord = item.second;
571         HILOG_INFO("Notification app [%{public}s]", appRecord->GetName().c_str());
572         appRecord->ScheduleMemoryLevel(level);
573     }
574     return ERR_OK;
575 }
576 
GetAppRunningRecordByRenderPid(const pid_t pid)577 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByRenderPid(const pid_t pid)
578 {
579     std::lock_guard<std::recursive_mutex> guard(lock_);
580     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
581         auto renderRecord = pair.second->GetRenderRecord();
582         return renderRecord && renderRecord->GetPid() == pid;
583     });
584     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
585 }
586 
OnRemoteRenderDied(const wptr<IRemoteObject> & remote)587 std::shared_ptr<RenderRecord> AppRunningManager::OnRemoteRenderDied(const wptr<IRemoteObject> &remote)
588 {
589     if (remote == nullptr) {
590         HILOG_ERROR("remote is null");
591         return nullptr;
592     }
593     sptr<IRemoteObject> object = remote.promote();
594     if (!object) {
595         HILOG_ERROR("promote failed.");
596         return nullptr;
597     }
598 
599     std::lock_guard<std::recursive_mutex> guard(lock_);
600     const auto &it =
601         std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&object](const auto &pair) {
602             if (!pair.second) {
603                 return false;
604             }
605 
606             auto renderRecord = pair.second->GetRenderRecord();
607             if (!renderRecord) {
608                 return false;
609             }
610 
611             auto scheduler = renderRecord->GetScheduler();
612             return scheduler && scheduler->AsObject() == object;
613         });
614     if (it != appRunningRecordMap_.end()) {
615         auto appRecord = it->second;
616         auto renderRecord = appRecord->GetRenderRecord();
617         appRecord->SetRenderRecord(nullptr);
618         return renderRecord;
619     }
620     return nullptr;
621 }
622 
GetAppRunningStateByBundleName(const std::string & bundleName)623 bool AppRunningManager::GetAppRunningStateByBundleName(const std::string &bundleName)
624 {
625     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
626     HILOG_DEBUG("function called.");
627     std::lock_guard<std::recursive_mutex> guard(lock_);
628     for (const auto &item : appRunningRecordMap_) {
629         const auto &appRecord = item.second;
630         if (appRecord && appRecord->GetBundleName() == bundleName) {
631             HILOG_DEBUG("Process of [%{public}s] is running, processName: %{public}s.",
632                 bundleName.c_str(), appRecord->GetProcessName().c_str());
633             return true;
634         }
635     }
636     return false;
637 }
638 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)639 int32_t AppRunningManager::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
640 {
641     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
642     HILOG_DEBUG("function called.");
643     std::lock_guard<std::recursive_mutex> guard(lock_);
644     int32_t result = ERR_OK;
645     bool loadSucceed = false;
646     sptr<QuickFixCallbackWithRecord> callbackByRecord = new (std::nothrow) QuickFixCallbackWithRecord(callback);
647     for (const auto &item : appRunningRecordMap_) {
648         const auto &appRecord = item.second;
649         if (appRecord && appRecord->GetBundleName() == bundleName) {
650             auto recordId = appRecord->GetRecordId();
651             HILOG_DEBUG("Notify application [%{public}s] load patch, record id %{public}d.",
652                 appRecord->GetProcessName().c_str(), recordId);
653             callbackByRecord->AddRecordId(recordId);
654             result = appRecord->NotifyLoadRepairPatch(bundleName, callbackByRecord, recordId);
655             if (result == ERR_OK) {
656                 loadSucceed = true;
657             } else {
658                 callbackByRecord->RemoveRecordId(recordId);
659             }
660         }
661     }
662     return loadSucceed == true ? ERR_OK : result;
663 }
664 
NotifyHotReloadPage(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)665 int32_t AppRunningManager::NotifyHotReloadPage(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
666 {
667     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
668     HILOG_DEBUG("function called.");
669     std::lock_guard<std::recursive_mutex> guard(lock_);
670     int32_t result = ERR_OK;
671     bool reloadPageSucceed = false;
672     sptr<QuickFixCallbackWithRecord> callbackByRecord = new (std::nothrow) QuickFixCallbackWithRecord(callback);
673     for (const auto &item : appRunningRecordMap_) {
674         const auto &appRecord = item.second;
675         if (appRecord && appRecord->GetBundleName() == bundleName) {
676             auto recordId = appRecord->GetRecordId();
677             HILOG_DEBUG("Notify application [%{public}s] reload page, record id %{public}d.",
678                 appRecord->GetProcessName().c_str(), recordId);
679             callbackByRecord->AddRecordId(recordId);
680             result = appRecord->NotifyHotReloadPage(callback, recordId);
681             if (result == ERR_OK) {
682                 reloadPageSucceed = true;
683             } else {
684                 callbackByRecord->RemoveRecordId(recordId);
685             }
686         }
687     }
688     return reloadPageSucceed == true ? ERR_OK : result;
689 }
690 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)691 int32_t AppRunningManager::NotifyUnLoadRepairPatch(const std::string &bundleName,
692     const sptr<IQuickFixCallback> &callback)
693 {
694     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
695     HILOG_DEBUG("function called.");
696     std::lock_guard<std::recursive_mutex> guard(lock_);
697     int32_t result = ERR_OK;
698     bool unLoadSucceed = false;
699     sptr<QuickFixCallbackWithRecord> callbackByRecord = new (std::nothrow) QuickFixCallbackWithRecord(callback);
700     for (const auto &item : appRunningRecordMap_) {
701         const auto &appRecord = item.second;
702         if (appRecord && appRecord->GetBundleName() == bundleName) {
703             auto recordId = appRecord->GetRecordId();
704             HILOG_DEBUG("Notify application [%{public}s] unload patch, record id %{public}d.",
705                 appRecord->GetProcessName().c_str(), recordId);
706             callbackByRecord->AddRecordId(recordId);
707             result = appRecord->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
708             if (result == ERR_OK) {
709                 unLoadSucceed = true;
710             } else {
711                 callbackByRecord->RemoveRecordId(recordId);
712             }
713         }
714     }
715     return unLoadSucceed == true ? ERR_OK : result;
716 }
717 
IsApplicationFirstForeground(const AppRunningRecord & foregroundingRecord)718 bool AppRunningManager::IsApplicationFirstForeground(const AppRunningRecord &foregroundingRecord)
719 {
720     HILOG_DEBUG("function called.");
721     std::lock_guard<std::recursive_mutex> guard(lock_);
722     for (const auto &item : appRunningRecordMap_) {
723         const auto &appRecord = item.second;
724         if (appRecord == nullptr || appRecord->GetBundleName() != foregroundingRecord.GetBundleName()) {
725             continue;
726         }
727         auto state = appRecord->GetState();
728         if (state == ApplicationState::APP_STATE_FOREGROUND &&
729             appRecord->GetRecordId() != foregroundingRecord.GetRecordId()) {
730             return false;
731         }
732     }
733     return true;
734 }
735 
IsApplicationBackground(const std::string & bundleName)736 bool AppRunningManager::IsApplicationBackground(const std::string &bundleName)
737 {
738     HILOG_DEBUG("function called.");
739     std::lock_guard<std::recursive_mutex> guard(lock_);
740     for (const auto &item : appRunningRecordMap_) {
741         const auto &appRecord = item.second;
742         if (appRecord == nullptr) {
743             continue;
744         }
745         auto state = appRecord->GetState();
746         if (appRecord->GetBundleName() == bundleName &&
747             state == ApplicationState::APP_STATE_FOREGROUND) {
748             return false;
749         }
750     }
751     return true;
752 }
753 
IsApplicationFirstFocused(const AppRunningRecord & focusedRecord)754 bool AppRunningManager::IsApplicationFirstFocused(const AppRunningRecord &focusedRecord)
755 {
756     HILOG_DEBUG("check focus function called.");
757     std::lock_guard<std::recursive_mutex> guard(lock_);
758     for (const auto &item : appRunningRecordMap_) {
759         const auto &appRecord = item.second;
760         if (appRecord == nullptr || appRecord->GetBundleName() != focusedRecord.GetBundleName()) {
761             continue;
762         }
763         if (appRecord->GetFocusFlag() && appRecord->GetRecordId() != focusedRecord.GetRecordId()) {
764             return false;
765         }
766     }
767     return true;
768 }
769 
IsApplicationUnfocused(const std::string & bundleName)770 bool AppRunningManager::IsApplicationUnfocused(const std::string &bundleName)
771 {
772     HILOG_DEBUG("check is application unfocused.");
773     std::lock_guard<std::recursive_mutex> guard(lock_);
774     for (const auto &item : appRunningRecordMap_) {
775         const auto &appRecord = item.second;
776         if (appRecord && appRecord->GetBundleName() == bundleName && appRecord->GetFocusFlag()) {
777             return false;
778         }
779     }
780     return true;
781 }
782 }  // namespace AppExecFwk
783 }  // namespace OHOS
784