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