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