• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 {
34 namespace {
35     const std::string SHELL_ASSISTANT_BUNDLENAME = "com.huawei.shell_assistant";
36 }
37 using EventFwk::CommonEventSupport;
38 
AppRunningManager()39 AppRunningManager::AppRunningManager()
40 {}
~AppRunningManager()41 AppRunningManager::~AppRunningManager()
42 {}
43 
CreateAppRunningRecord(const std::shared_ptr<ApplicationInfo> & appInfo,const std::string & processName,const BundleInfo & bundleInfo)44 std::shared_ptr<AppRunningRecord> AppRunningManager::CreateAppRunningRecord(
45     const std::shared_ptr<ApplicationInfo> &appInfo, const std::string &processName, const BundleInfo &bundleInfo)
46 {
47     if (!appInfo) {
48         HILOG_ERROR("param error");
49         return nullptr;
50     }
51 
52     if (processName.empty()) {
53         HILOG_ERROR("processName error");
54         return nullptr;
55     }
56 
57     auto recordId = AppRecordId::Create();
58     auto appRecord = std::make_shared<AppRunningRecord>(appInfo, recordId, processName);
59 
60     std::regex rule("[a-zA-Z.]+[-_#]{1}");
61     std::string signCode;
62     bool isStageBasedModel = false;
63     ClipStringContent(rule, bundleInfo.appId, signCode);
64     if (!bundleInfo.hapModuleInfos.empty()) {
65         isStageBasedModel = bundleInfo.hapModuleInfos.back().isStageBasedModel;
66     }
67     HILOG_DEBUG("Create AppRunningRecord, processName: %{public}s, StageBasedModel:%{public}d, recordId: %{public}d",
68         processName.c_str(), isStageBasedModel, recordId);
69 
70     appRecord->SetStageModelState(isStageBasedModel);
71     appRecord->SetSignCode(signCode);
72     appRecord->SetJointUserId(bundleInfo.jointUserId);
73     std::lock_guard<ffrt::mutex> guard(lock_);
74     appRunningRecordMap_.emplace(recordId, appRecord);
75     return appRecord;
76 }
77 
CheckAppRunningRecordIsExist(const std::string & appName,const std::string & processName,const int uid,const BundleInfo & bundleInfo,const std::string & specifiedProcessFlag)78 std::shared_ptr<AppRunningRecord> AppRunningManager::CheckAppRunningRecordIsExist(const std::string &appName,
79     const std::string &processName, const int uid, const BundleInfo &bundleInfo,
80     const std::string &specifiedProcessFlag)
81 {
82     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
83     HILOG_DEBUG("appName: %{public}s, processName: %{public}s, uid: %{public}d, specifiedProcessFlag: %{public}s",
84         appName.c_str(), processName.c_str(), uid, specifiedProcessFlag.c_str());
85     std::regex rule("[a-zA-Z.]+[-_#]{1}");
86     std::string signCode;
87     auto jointUserId = bundleInfo.jointUserId;
88     HILOG_DEBUG("jointUserId : %{public}s", jointUserId.c_str());
89     ClipStringContent(rule, bundleInfo.appId, signCode);
90 
91     auto FindSameProcess = [signCode, specifiedProcessFlag, processName, jointUserId](const auto &pair) {
92         return (pair.second != nullptr) &&
93             (specifiedProcessFlag.empty() ||
94             pair.second->GetSpecifiedProcessFlag() == specifiedProcessFlag) &&
95             (pair.second->GetSignCode() == signCode) &&
96             (pair.second->GetProcessName() == processName) &&
97             (pair.second->GetJointUserId() == jointUserId) &&
98             !(pair.second->IsTerminating()) &&
99             !(pair.second->IsKilling());
100     };
101 
102     // If it is not empty, look for whether it can come in the same process
103     std::lock_guard<ffrt::mutex> guard(lock_);
104     if (!jointUserId.empty()) {
105         auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), FindSameProcess);
106         return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
107     }
108     for (const auto &item : appRunningRecordMap_) {
109         const auto &appRecord = item.second;
110         if (appRecord && appRecord->GetProcessName() == processName &&
111             (specifiedProcessFlag.empty() ||
112             appRecord->GetSpecifiedProcessFlag() == specifiedProcessFlag) &&
113             !(appRecord->IsTerminating()) && !(appRecord->IsKilling())) {
114             auto appInfoList = appRecord->GetAppInfoList();
115             HILOG_DEBUG("appInfoList: %{public}zu, processName: %{public}s, specifiedProcessFlag: %{public}s",
116                 appInfoList.size(), appRecord->GetProcessName().c_str(), specifiedProcessFlag.c_str());
117             auto isExist = [&appName, &uid](const std::shared_ptr<ApplicationInfo> &appInfo) {
118                 HILOG_DEBUG("appInfo->name: %{public}s", appInfo->name.c_str());
119                 return appInfo->name == appName && appInfo->uid == uid;
120             };
121             auto appInfoIter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
122             if (appInfoIter != appInfoList.end()) {
123                 return appRecord;
124             }
125         }
126     }
127     return nullptr;
128 }
129 
CheckAppRunningRecordIsExistByBundleName(const std::string & bundleName)130 bool AppRunningManager::CheckAppRunningRecordIsExistByBundleName(const std::string &bundleName)
131 {
132     std::lock_guard<ffrt::mutex> guard(lock_);
133     if (appRunningRecordMap_.empty()) {
134         return false;
135     }
136     for (const auto &item : appRunningRecordMap_) {
137         const auto &appRecord = item.second;
138         if (appRecord && appRecord->GetBundleName() == bundleName) {
139             return true;
140         }
141     }
142     return false;
143 }
144 
GetAllAppRunningRecordCountByBundleName(const std::string & bundleName)145 int32_t AppRunningManager::GetAllAppRunningRecordCountByBundleName(const std::string &bundleName)
146 {
147     int32_t count = 0;
148     std::lock_guard<ffrt::mutex> guard(lock_);
149     for (const auto &item : appRunningRecordMap_) {
150         const auto &appRecord = item.second;
151         if (appRecord && appRecord->GetBundleName() == bundleName) {
152             count++;
153         }
154     }
155 
156     return count;
157 }
158 
GetAppRunningRecordByPid(const pid_t pid)159 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByPid(const pid_t pid)
160 {
161     std::lock_guard<ffrt::mutex> guard(lock_);
162     return GetAppRunningRecordByPidInner(pid);
163 }
164 
GetAppRunningRecordByPidInner(const pid_t pid)165 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByPidInner(const pid_t pid)
166 {
167     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
168         return pair.second->GetPriorityObject()->GetPid() == pid;
169     });
170     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
171 }
172 
GetAppRunningRecordByAbilityToken(const sptr<IRemoteObject> & abilityToken)173 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByAbilityToken(
174     const sptr<IRemoteObject> &abilityToken)
175 {
176     std::lock_guard<ffrt::mutex> guard(lock_);
177     return GetAppRunningRecordByTokenInner(abilityToken);
178 }
179 
GetAppRunningRecordByTokenInner(const sptr<IRemoteObject> & abilityToken)180 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByTokenInner(
181     const sptr<IRemoteObject> &abilityToken)
182 {
183     for (const auto &item : appRunningRecordMap_) {
184         const auto &appRecord = item.second;
185         if (appRecord && appRecord->GetAbilityRunningRecordByToken(abilityToken)) {
186             return appRecord;
187         }
188     }
189     return nullptr;
190 }
191 
ProcessExitByBundleName(const std::string & bundleName,std::list<pid_t> & pids)192 bool AppRunningManager::ProcessExitByBundleName(const std::string &bundleName, std::list<pid_t> &pids)
193 {
194     std::lock_guard<ffrt::mutex> guard(lock_);
195     for (const auto &item : appRunningRecordMap_) {
196         const auto &appRecord = item.second;
197         // condition [!appRecord->IsKeepAliveApp()] Is to not kill the resident process.
198         // Before using this method, consider whether you need.
199         if (appRecord && !appRecord->IsKeepAliveApp()) {
200             pid_t pid = appRecord->GetPriorityObject()->GetPid();
201             auto appInfoList = appRecord->GetAppInfoList();
202             auto isExist = [&bundleName](const std::shared_ptr<ApplicationInfo> &appInfo) {
203                 return appInfo->bundleName == bundleName;
204             };
205             auto iter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
206             if (iter != appInfoList.end() && pid > 0) {
207                 pids.push_back(pid);
208                 appRecord->ScheduleProcessSecurityExit();
209             }
210         }
211     }
212 
213     return !pids.empty();
214 }
215 
GetPidsByUserId(int32_t userId,std::list<pid_t> & pids)216 bool AppRunningManager::GetPidsByUserId(int32_t userId, std::list<pid_t> &pids)
217 {
218     std::lock_guard<ffrt::mutex> guard(lock_);
219     for (const auto &item : appRunningRecordMap_) {
220         const auto &appRecord = item.second;
221         if (appRecord) {
222             int32_t id = -1;
223             if ((DelayedSingleton<OsAccountManagerWrapper>::GetInstance()->
224                 GetOsAccountLocalIdFromUid(appRecord->GetUid(), id) == 0) && (id == userId)) {
225                 pid_t pid = appRecord->GetPriorityObject()->GetPid();
226                 if (pid > 0) {
227                     pids.push_back(pid);
228                     appRecord->ScheduleProcessSecurityExit();
229                 }
230             }
231         }
232     }
233 
234     return (!pids.empty());
235 }
236 
ProcessUpdateApplicationInfoInstalled(const ApplicationInfo & appInfo)237 int32_t AppRunningManager::ProcessUpdateApplicationInfoInstalled(const ApplicationInfo &appInfo)
238 {
239     std::lock_guard<ffrt::mutex> guard(lock_);
240     int32_t result = ERR_OK;
241     for (const auto &item : appRunningRecordMap_) {
242         const auto &appRecord = item.second;
243         if (!appRecord) {
244             continue;
245         }
246         auto appInfoList = appRecord->GetAppInfoList();
247         for (auto iter : appInfoList) {
248             if (iter->bundleName == appInfo.bundleName) {
249                 appRecord->UpdateApplicationInfoInstalled(appInfo);
250                 break;
251             }
252         }
253     }
254     return result;
255 }
256 
ProcessExitByBundleNameAndUid(const std::string & bundleName,const int uid,std::list<pid_t> & pids)257 bool AppRunningManager::ProcessExitByBundleNameAndUid(
258     const std::string &bundleName, const int uid, std::list<pid_t> &pids)
259 {
260     std::lock_guard<ffrt::mutex> guard(lock_);
261     for (const auto &item : appRunningRecordMap_) {
262         const auto &appRecord = item.second;
263         if (appRecord) {
264             auto appInfoList = appRecord->GetAppInfoList();
265             auto isExist = [&bundleName, &uid](const std::shared_ptr<ApplicationInfo> &appInfo) {
266                 return appInfo->bundleName == bundleName && appInfo->uid == uid;
267             };
268             auto iter = std::find_if(appInfoList.begin(), appInfoList.end(), isExist);
269             pid_t pid = appRecord->GetPriorityObject()->GetPid();
270             if (iter != appInfoList.end() && pid > 0) {
271                 pids.push_back(pid);
272 
273                 appRecord->SetKilling();
274                 appRecord->ScheduleProcessSecurityExit();
275             }
276         }
277     }
278 
279     return (pids.empty() ? false : true);
280 }
281 
ProcessExitByPid(pid_t pid)282 bool AppRunningManager::ProcessExitByPid(pid_t pid)
283 {
284     std::lock_guard<ffrt::mutex> guard(lock_);
285     for (const auto &item : appRunningRecordMap_) {
286         const auto &appRecord = item.second;
287         if (appRecord) {
288             pid_t appPid = appRecord->GetPriorityObject()->GetPid();
289             if (appPid == pid) {
290                 appRecord->SetKilling();
291                 appRecord->ScheduleProcessSecurityExit();
292                 return true;
293             }
294         }
295     }
296 
297     return false;
298 }
299 
OnRemoteDied(const wptr<IRemoteObject> & remote)300 std::shared_ptr<AppRunningRecord> AppRunningManager::OnRemoteDied(const wptr<IRemoteObject> &remote)
301 {
302     HILOG_DEBUG("called");
303     if (remote == nullptr) {
304         HILOG_ERROR("remote is null");
305         return nullptr;
306     }
307     sptr<IRemoteObject> object = remote.promote();
308     if (!object) {
309         HILOG_ERROR("object is null");
310         return nullptr;
311     }
312     std::lock_guard<ffrt::mutex> guard(lock_);
313     const auto &iter =
314         std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&object](const auto &pair) {
315             if (pair.second && pair.second->GetApplicationClient() != nullptr) {
316                 return pair.second->GetApplicationClient()->AsObject() == object;
317             }
318             return false;
319         });
320     if (iter == appRunningRecordMap_.end()) {
321         HILOG_ERROR("remote is not exist in the map.");
322         return nullptr;
323     }
324     auto appRecord = iter->second;
325     if (appRecord != nullptr) {
326         appRecord->RemoveAppDeathRecipient();
327         appRecord->SetApplicationClient(nullptr);
328         HILOG_INFO("processName: %{public}s.", appRecord->GetProcessName().c_str());
329         auto priorityObject = appRecord->GetPriorityObject();
330         if (priorityObject != nullptr) {
331             HILOG_INFO("pid: %{public}d.", priorityObject->GetPid());
332         }
333     }
334     appRunningRecordMap_.erase(iter);
335     return appRecord;
336 }
337 
GetAppRunningRecordMap()338 std::map<const int32_t, const std::shared_ptr<AppRunningRecord>> AppRunningManager::GetAppRunningRecordMap()
339 {
340     std::lock_guard<ffrt::mutex> guard(lock_);
341     return appRunningRecordMap_;
342 }
343 
RemoveAppRunningRecordById(const int32_t recordId)344 void AppRunningManager::RemoveAppRunningRecordById(const int32_t recordId)
345 {
346     std::lock_guard<ffrt::mutex> guard(lock_);
347     appRunningRecordMap_.erase(recordId);
348 }
349 
ClearAppRunningRecordMap()350 void AppRunningManager::ClearAppRunningRecordMap()
351 {
352     std::lock_guard<ffrt::mutex> guard(lock_);
353     appRunningRecordMap_.clear();
354 }
355 
HandleTerminateTimeOut(int64_t eventId)356 void AppRunningManager::HandleTerminateTimeOut(int64_t eventId)
357 {
358     HILOG_DEBUG("called");
359     auto abilityRecord = GetAbilityRunningRecord(eventId);
360     if (!abilityRecord) {
361         HILOG_ERROR("abilityRecord is nullptr.");
362         return;
363     }
364     auto abilityToken = abilityRecord->GetToken();
365     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
366     if (!appRecord) {
367         HILOG_ERROR("appRecord is nullptr.");
368         return;
369     }
370     appRecord->AbilityTerminated(abilityToken);
371 }
372 
GetTerminatingAppRunningRecord(const sptr<IRemoteObject> & abilityToken)373 std::shared_ptr<AppRunningRecord> AppRunningManager::GetTerminatingAppRunningRecord(
374     const sptr<IRemoteObject> &abilityToken)
375 {
376     std::lock_guard<ffrt::mutex> guard(lock_);
377     for (const auto &item : appRunningRecordMap_) {
378         const auto &appRecord = item.second;
379         if (appRecord && appRecord->GetAbilityByTerminateLists(abilityToken)) {
380             return appRecord;
381         }
382     }
383     return nullptr;
384 }
385 
GetAbilityRunningRecord(const int64_t eventId)386 std::shared_ptr<AbilityRunningRecord> AppRunningManager::GetAbilityRunningRecord(const int64_t eventId)
387 {
388     HILOG_DEBUG("called");
389     std::lock_guard<ffrt::mutex> guard(lock_);
390     for (auto &item : appRunningRecordMap_) {
391         if (item.second) {
392             auto abilityRecord = item.second->GetAbilityRunningRecord(eventId);
393             if (abilityRecord) {
394                 return abilityRecord;
395             }
396         }
397     }
398     return nullptr;
399 }
400 
GetAppRunningRecord(const int64_t eventId)401 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecord(const int64_t eventId)
402 {
403     HILOG_DEBUG("called");
404     std::lock_guard<ffrt::mutex> guard(lock_);
405     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&eventId](const auto &pair) {
406         return pair.second->GetEventId() == eventId;
407     });
408     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
409 }
410 
HandleAbilityAttachTimeOut(const sptr<IRemoteObject> & token)411 void AppRunningManager::HandleAbilityAttachTimeOut(const sptr<IRemoteObject> &token)
412 {
413     HILOG_DEBUG("called");
414     if (token == nullptr) {
415         HILOG_ERROR("token is nullptr.");
416         return;
417     }
418 
419     auto appRecord = GetAppRunningRecordByAbilityToken(token);
420     if (!appRecord) {
421         HILOG_ERROR("appRecord is nullptr.");
422         return;
423     }
424 
425     std::shared_ptr<AbilityRunningRecord> abilityRecord = appRecord->GetAbilityRunningRecordByToken(token);
426     if (abilityRecord) {
427         abilityRecord->SetTerminating();
428     }
429 
430     if (appRecord->IsLastAbilityRecord(token) && !appRecord->IsKeepAliveApp()) {
431         appRecord->SetTerminating();
432     }
433 
434     auto timeoutTask = [appRecord, token]() {
435         if (appRecord) {
436             appRecord->TerminateAbility(token, true);
437         }
438     };
439     appRecord->PostTask("DELAY_KILL_ABILITY", AMSEventHandler::KILL_PROCESS_TIMEOUT, timeoutTask);
440 }
441 
PrepareTerminate(const sptr<IRemoteObject> & token)442 void AppRunningManager::PrepareTerminate(const sptr<IRemoteObject> &token)
443 {
444     if (token == nullptr) {
445         HILOG_ERROR("token is nullptr.");
446         return;
447     }
448 
449     auto appRecord = GetAppRunningRecordByAbilityToken(token);
450     if (!appRecord) {
451         HILOG_ERROR("appRecord is nullptr.");
452         return;
453     }
454 
455     auto abilityRecord = appRecord->GetAbilityRunningRecordByToken(token);
456     if (abilityRecord) {
457         abilityRecord->SetTerminating();
458     }
459 
460     if (appRecord->IsLastAbilityRecord(token) && !appRecord->IsKeepAliveApp()) {
461         HILOG_INFO("The ability is the last in the app:%{public}s.", appRecord->GetName().c_str());
462         appRecord->SetTerminating();
463     }
464 }
465 
TerminateAbility(const sptr<IRemoteObject> & token,bool clearMissionFlag,std::shared_ptr<AppMgrServiceInner> appMgrServiceInner)466 void AppRunningManager::TerminateAbility(const sptr<IRemoteObject> &token, bool clearMissionFlag,
467     std::shared_ptr<AppMgrServiceInner> appMgrServiceInner)
468 {
469     auto appRecord = GetAppRunningRecordByAbilityToken(token);
470     if (!appRecord) {
471         HILOG_ERROR("appRecord is nullptr.");
472         return;
473     }
474 
475     auto killProcess = [appRecord, token, inner = appMgrServiceInner]() {
476         if (appRecord == nullptr || token == nullptr || inner == nullptr) {
477             HILOG_ERROR("Pointer parameter error.");
478             return;
479         }
480         appRecord->RemoveTerminateAbilityTimeoutTask(token);
481         HILOG_DEBUG("The ability is the last, kill application");
482         auto priorityObject = appRecord->GetPriorityObject();
483         if (priorityObject == nullptr) {
484             HILOG_ERROR("priorityObject is nullptr.");
485             return;
486         }
487         auto pid = priorityObject->GetPid();
488         if (pid < 0) {
489             HILOG_ERROR("Pid error.");
490             return;
491         }
492         auto result = inner->KillProcessByPid(pid);
493         if (result < 0) {
494             HILOG_WARN("Kill application directly failed, pid: %{public}d", pid);
495         }
496         inner->NotifyAppStatus(appRecord->GetBundleName(), CommonEventSupport::COMMON_EVENT_PACKAGE_RESTARTED);
497         };
498 
499     if (clearMissionFlag && appRecord->IsDebugApp()) {
500         killProcess();
501         return;
502     }
503 
504     auto isLastAbility =
505         clearMissionFlag ? appRecord->IsLastPageAbilityRecord(token) : appRecord->IsLastAbilityRecord(token);
506     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
507         appRecord->TerminateAbility(token, true);
508     } else {
509         appRecord->TerminateAbility(token, false);
510     }
511     auto isLauncherApp = appRecord->GetApplicationInfo()->isLauncherApp;
512     if (isLastAbility && !appRecord->IsKeepAliveApp() && !isLauncherApp) {
513         HILOG_DEBUG("The ability is the last in the app:%{public}s.", appRecord->GetName().c_str());
514         appRecord->SetTerminating();
515         if (clearMissionFlag && appMgrServiceInner != nullptr) {
516             appRecord->PostTask("DELAY_KILL_PROCESS", AMSEventHandler::DELAY_KILL_PROCESS_TIMEOUT, killProcess);
517         }
518     }
519 }
520 
GetRunningProcessInfoByToken(const sptr<IRemoteObject> & token,AppExecFwk::RunningProcessInfo & info)521 void AppRunningManager::GetRunningProcessInfoByToken(
522     const sptr<IRemoteObject> &token, AppExecFwk::RunningProcessInfo &info)
523 {
524     std::lock_guard<ffrt::mutex> guard(lock_);
525     auto appRecord = GetAppRunningRecordByTokenInner(token);
526 
527     AssignRunningProcessInfoByAppRecord(appRecord, info);
528 }
529 
GetRunningProcessInfoByPid(const pid_t pid,OHOS::AppExecFwk::RunningProcessInfo & info)530 void AppRunningManager::GetRunningProcessInfoByPid(const pid_t pid, OHOS::AppExecFwk::RunningProcessInfo &info)
531 {
532     std::lock_guard<ffrt::mutex> guard(lock_);
533     auto appRecord = GetAppRunningRecordByPidInner(pid);
534 
535     AssignRunningProcessInfoByAppRecord(appRecord, info);
536 }
537 
AssignRunningProcessInfoByAppRecord(std::shared_ptr<AppRunningRecord> appRecord,AppExecFwk::RunningProcessInfo & info) const538 void AppRunningManager::AssignRunningProcessInfoByAppRecord(
539     std::shared_ptr<AppRunningRecord> appRecord, AppExecFwk::RunningProcessInfo &info) const
540 {
541     if (!appRecord) {
542         HILOG_ERROR("appRecord is nullptr");
543         return;
544     }
545 
546     info.processName_ = appRecord->GetProcessName();
547     info.pid_ = appRecord->GetPriorityObject()->GetPid();
548     info.uid_ = appRecord->GetUid();
549     info.bundleNames.emplace_back(appRecord->GetBundleName());
550     info.state_ = static_cast<AppExecFwk::AppProcessState>(appRecord->GetState());
551     info.isContinuousTask = appRecord->IsContinuousTask();
552     info.isKeepAlive = appRecord->IsKeepAliveApp();
553     info.isFocused = appRecord->GetFocusFlag();
554     info.isTestProcess = (appRecord->GetUserTestInfo() != nullptr);
555     info.startTimeMillis_ = appRecord->GetAppStartTime();
556     info.isAbilityForegrounding = appRecord->GetAbilityForegroundingFlag();
557     info.extensionType_ = appRecord->GetExtensionType();
558     info.processType_ = appRecord->GetProcessType();
559 }
560 
SetAbilityForegroundingFlagToAppRecord(const pid_t pid)561 void AppRunningManager::SetAbilityForegroundingFlagToAppRecord(const pid_t pid)
562 {
563     std::lock_guard<ffrt::mutex> guard(lock_);
564     auto appRecord = GetAppRunningRecordByPidInner(pid);
565     if (appRecord == nullptr) {
566         HILOG_ERROR("appRecord is nullptr");
567         return;
568     }
569     appRecord->SetAbilityForegroundingFlag();
570 }
571 
ClipStringContent(const std::regex & re,const std::string & source,std::string & afterCutStr)572 void AppRunningManager::ClipStringContent(const std::regex &re, const std::string &source, std::string &afterCutStr)
573 {
574     std::smatch basket;
575     if (std::regex_search(source, basket, re)) {
576         afterCutStr = basket.prefix().str() + basket.suffix().str();
577     }
578 }
579 
GetForegroundApplications(std::vector<AppStateData> & list)580 void AppRunningManager::GetForegroundApplications(std::vector<AppStateData> &list)
581 {
582     std::lock_guard<ffrt::mutex> guard(lock_);
583     for (const auto &item : appRunningRecordMap_) {
584         const auto &appRecord = item.second;
585         if (!appRecord) {
586             HILOG_ERROR("appRecord is nullptr");
587             return;
588         }
589         auto state = appRecord->GetState();
590         if (state == ApplicationState::APP_STATE_FOREGROUND) {
591             AppStateData appData;
592             appData.bundleName = appRecord->GetBundleName();
593             appData.uid = appRecord->GetUid();
594             appData.pid = appRecord->GetPriorityObject()->GetPid();
595             appData.state = static_cast<int32_t>(ApplicationState::APP_STATE_FOREGROUND);
596             appData.extensionType = appRecord->GetExtensionType();
597             appData.isFocused = appRecord->GetFocusFlag();
598             list.push_back(appData);
599             HILOG_DEBUG("bundleName:%{public}s", appData.bundleName.c_str());
600         }
601     }
602 }
603 
HandleAddAbilityStageTimeOut(const int64_t eventId)604 void AppRunningManager::HandleAddAbilityStageTimeOut(const int64_t eventId)
605 {
606     HILOG_DEBUG("Handle add ability stage timeout.");
607     auto abilityRecord = GetAbilityRunningRecord(eventId);
608     if (!abilityRecord) {
609         HILOG_ERROR("abilityRecord is nullptr.");
610         return;
611     }
612 
613     auto abilityToken = abilityRecord->GetToken();
614     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
615     if (!appRecord) {
616         HILOG_ERROR("appRecord is nullptr.");
617         return;
618     }
619 
620     appRecord->ScheduleProcessSecurityExit();
621 }
622 
HandleStartSpecifiedAbilityTimeOut(const int64_t eventId)623 void AppRunningManager::HandleStartSpecifiedAbilityTimeOut(const int64_t eventId)
624 {
625     HILOG_DEBUG("Handle receive multi instances timeout.");
626     auto abilityRecord = GetAbilityRunningRecord(eventId);
627     if (!abilityRecord) {
628         HILOG_ERROR("abilityRecord is nullptr");
629         return;
630     }
631 
632     auto abilityToken = abilityRecord->GetToken();
633     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
634     if (!appRecord) {
635         HILOG_ERROR("appRecord is nullptr");
636         return;
637     }
638 
639     appRecord->ScheduleProcessSecurityExit();
640 }
641 
UpdateConfiguration(const Configuration & config)642 int32_t AppRunningManager::UpdateConfiguration(const Configuration &config)
643 {
644     std::lock_guard<ffrt::mutex> guard(lock_);
645     HILOG_DEBUG("current app size %{public}zu", appRunningRecordMap_.size());
646     int32_t result = ERR_OK;
647     for (const auto &item : appRunningRecordMap_) {
648         const auto &appRecord = item.second;
649         if (appRecord && appRecord->GetState() == ApplicationState::APP_STATE_CREATE) {
650             HILOG_DEBUG("app not ready, appName is %{public}s", appRecord->GetBundleName().c_str());
651             continue;
652         }
653         if (appRecord && !isCollaboratorReserveType(appRecord)) {
654             HILOG_DEBUG("Notification app [%{public}s]", appRecord->GetName().c_str());
655             result = appRecord->UpdateConfiguration(config);
656         }
657     }
658     return result;
659 }
660 
isCollaboratorReserveType(const std::shared_ptr<AppRunningRecord> & appRecord)661 bool AppRunningManager::isCollaboratorReserveType(const std::shared_ptr<AppRunningRecord> &appRecord)
662 {
663     std::string bundleName = appRecord->GetApplicationInfo()->name;
664     bool isReserveType = bundleName == SHELL_ASSISTANT_BUNDLENAME;
665     if (isReserveType) {
666         HILOG_INFO("isReserveType app [%{public}s]", appRecord->GetName().c_str());
667     }
668     return isReserveType;
669 }
670 
NotifyMemoryLevel(int32_t level)671 int32_t AppRunningManager::NotifyMemoryLevel(int32_t level)
672 {
673     std::lock_guard<ffrt::mutex> guard(lock_);
674     for (const auto &item : appRunningRecordMap_) {
675         const auto &appRecord = item.second;
676         HILOG_DEBUG("Notification app [%{public}s]", appRecord->GetName().c_str());
677         appRecord->ScheduleMemoryLevel(level);
678     }
679     return ERR_OK;
680 }
681 
DumpHeapMemory(const int32_t pid,OHOS::AppExecFwk::MallocInfo & mallocInfo)682 int32_t AppRunningManager::DumpHeapMemory(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo)
683 {
684     std::shared_ptr<AppRunningRecord> appRecord;
685     {
686         std::lock_guard<ffrt::mutex> guard(lock_);
687         HILOG_INFO("current app size %{public}zu", appRunningRecordMap_.size());
688         auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
689             auto priorityObject = pair.second->GetPriorityObject();
690             return priorityObject && priorityObject->GetPid() == pid;
691         });
692         if (iter == appRunningRecordMap_.end()) {
693             HILOG_ERROR("No matching application was found.");
694             return ERR_INVALID_VALUE;
695         }
696         appRecord = iter->second;
697         if (appRecord == nullptr) {
698             HILOG_ERROR("appRecord is nullptr.");
699             return ERR_INVALID_VALUE;
700         }
701     }
702     appRecord->ScheduleHeapMemory(pid, mallocInfo);
703     return ERR_OK;
704 }
705 
GetAppRunningRecordByRenderPid(const pid_t pid)706 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByRenderPid(const pid_t pid)
707 {
708     std::lock_guard<ffrt::mutex> guard(lock_);
709     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
710         auto renderRecordMap = pair.second->GetRenderRecordMap();
711         if (renderRecordMap.empty()) {
712             return false;
713         }
714         for (auto it : renderRecordMap) {
715             auto renderRecord = it.second;
716             if (renderRecord && renderRecord->GetPid() == pid) {
717                 return true;
718             }
719         }
720         return false;
721     });
722     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
723 }
724 
OnRemoteRenderDied(const wptr<IRemoteObject> & remote)725 std::shared_ptr<RenderRecord> AppRunningManager::OnRemoteRenderDied(const wptr<IRemoteObject> &remote)
726 {
727     if (remote == nullptr) {
728         HILOG_ERROR("remote is null");
729         return nullptr;
730     }
731     sptr<IRemoteObject> object = remote.promote();
732     if (!object) {
733         HILOG_ERROR("promote failed.");
734         return nullptr;
735     }
736 
737     std::lock_guard<ffrt::mutex> guard(lock_);
738     std::shared_ptr<RenderRecord> renderRecord;
739     const auto &it =
740         std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(),
741             [&object, &renderRecord](const auto &pair) {
742             if (!pair.second) {
743                 return false;
744             }
745 
746             auto renderRecordMap = pair.second->GetRenderRecordMap();
747             if (renderRecordMap.empty()) {
748                 return false;
749             }
750             for (auto iter : renderRecordMap) {
751                 if (iter.second == nullptr) {
752                     continue;
753                 }
754                 auto scheduler = iter.second->GetScheduler();
755                 if (scheduler && scheduler->AsObject() == object) {
756                     renderRecord = iter.second;
757                     return true;
758                 }
759             }
760             return false;
761         });
762     if (it != appRunningRecordMap_.end()) {
763         auto appRecord = it->second;
764         appRecord->RemoveRenderRecord(renderRecord);
765         return renderRecord;
766     }
767     return nullptr;
768 }
769 
GetAppRunningStateByBundleName(const std::string & bundleName)770 bool AppRunningManager::GetAppRunningStateByBundleName(const std::string &bundleName)
771 {
772     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
773     HILOG_DEBUG("function called.");
774     std::lock_guard<ffrt::mutex> guard(lock_);
775     for (const auto &item : appRunningRecordMap_) {
776         const auto &appRecord = item.second;
777         if (appRecord && appRecord->GetBundleName() == bundleName) {
778             HILOG_DEBUG("Process of [%{public}s] is running, processName: %{public}s.",
779                 bundleName.c_str(), appRecord->GetProcessName().c_str());
780             return true;
781         }
782     }
783     return false;
784 }
785 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)786 int32_t AppRunningManager::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
787 {
788     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
789     HILOG_DEBUG("function called.");
790     std::lock_guard<ffrt::mutex> guard(lock_);
791     int32_t result = ERR_OK;
792     bool loadSucceed = false;
793     auto callbackByRecord = sptr<QuickFixCallbackWithRecord>::MakeSptr(callback);
794     if (callbackByRecord == nullptr) {
795         HILOG_ERROR("Failed to create callback record.");
796         return ERR_INVALID_VALUE;
797     }
798 
799     for (const auto &item : appRunningRecordMap_) {
800         const auto &appRecord = item.second;
801         if (appRecord && appRecord->GetBundleName() == bundleName) {
802             auto recordId = appRecord->GetRecordId();
803             HILOG_DEBUG("Notify application [%{public}s] load patch, record id %{public}d.",
804                 appRecord->GetProcessName().c_str(), recordId);
805             callbackByRecord->AddRecordId(recordId);
806             result = appRecord->NotifyLoadRepairPatch(bundleName, callbackByRecord, recordId);
807             if (result == ERR_OK) {
808                 loadSucceed = true;
809             } else {
810                 callbackByRecord->RemoveRecordId(recordId);
811             }
812         }
813     }
814     return loadSucceed == true ? ERR_OK : result;
815 }
816 
NotifyHotReloadPage(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)817 int32_t AppRunningManager::NotifyHotReloadPage(const std::string &bundleName, const sptr<IQuickFixCallback> &callback)
818 {
819     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
820     HILOG_DEBUG("function called.");
821     std::lock_guard<ffrt::mutex> guard(lock_);
822     int32_t result = ERR_OK;
823     bool reloadPageSucceed = false;
824     auto callbackByRecord = sptr<QuickFixCallbackWithRecord>::MakeSptr(callback);
825     if (callbackByRecord == nullptr) {
826         HILOG_ERROR("Failed to create callback record.");
827         return ERR_INVALID_VALUE;
828     }
829 
830     for (const auto &item : appRunningRecordMap_) {
831         const auto &appRecord = item.second;
832         if (appRecord && appRecord->GetBundleName() == bundleName) {
833             auto recordId = appRecord->GetRecordId();
834             HILOG_DEBUG("Notify application [%{public}s] reload page, record id %{public}d.",
835                 appRecord->GetProcessName().c_str(), recordId);
836             callbackByRecord->AddRecordId(recordId);
837             result = appRecord->NotifyHotReloadPage(callback, recordId);
838             if (result == ERR_OK) {
839                 reloadPageSucceed = true;
840             } else {
841                 callbackByRecord->RemoveRecordId(recordId);
842             }
843         }
844     }
845     return reloadPageSucceed == true ? ERR_OK : result;
846 }
847 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback)848 int32_t AppRunningManager::NotifyUnLoadRepairPatch(const std::string &bundleName,
849     const sptr<IQuickFixCallback> &callback)
850 {
851     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
852     HILOG_DEBUG("function called.");
853     std::lock_guard<ffrt::mutex> guard(lock_);
854     int32_t result = ERR_OK;
855     bool unLoadSucceed = false;
856     auto callbackByRecord = sptr<QuickFixCallbackWithRecord>::MakeSptr(callback);
857     if (callbackByRecord == nullptr) {
858         HILOG_ERROR("Failed to create callback record.");
859         return ERR_INVALID_VALUE;
860     }
861 
862     for (const auto &item : appRunningRecordMap_) {
863         const auto &appRecord = item.second;
864         if (appRecord && appRecord->GetBundleName() == bundleName) {
865             auto recordId = appRecord->GetRecordId();
866             HILOG_DEBUG("Notify application [%{public}s] unload patch, record id %{public}d.",
867                 appRecord->GetProcessName().c_str(), recordId);
868             callbackByRecord->AddRecordId(recordId);
869             result = appRecord->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
870             if (result == ERR_OK) {
871                 unLoadSucceed = true;
872             } else {
873                 callbackByRecord->RemoveRecordId(recordId);
874             }
875         }
876     }
877     return unLoadSucceed == true ? ERR_OK : result;
878 }
879 
IsApplicationFirstForeground(const AppRunningRecord & foregroundingRecord)880 bool AppRunningManager::IsApplicationFirstForeground(const AppRunningRecord &foregroundingRecord)
881 {
882     HILOG_DEBUG("function called.");
883     std::lock_guard<ffrt::mutex> guard(lock_);
884     if (AAFwk::UIExtensionUtils::IsUIExtension(foregroundingRecord.GetExtensionType())
885         || AAFwk::UIExtensionUtils::IsWindowExtension(foregroundingRecord.GetExtensionType())) {
886         return false;
887     }
888     for (const auto &item : appRunningRecordMap_) {
889         const auto &appRecord = item.second;
890         if (appRecord == nullptr || appRecord->GetBundleName() != foregroundingRecord.GetBundleName()
891             || AAFwk::UIExtensionUtils::IsUIExtension(appRecord->GetExtensionType())
892             || AAFwk::UIExtensionUtils::IsWindowExtension(appRecord->GetExtensionType())) {
893             continue;
894         }
895         auto state = appRecord->GetState();
896         if (state == ApplicationState::APP_STATE_FOREGROUND &&
897             appRecord->GetRecordId() != foregroundingRecord.GetRecordId()) {
898             return false;
899         }
900     }
901     return true;
902 }
903 
IsApplicationBackground(const std::string & bundleName)904 bool AppRunningManager::IsApplicationBackground(const std::string &bundleName)
905 {
906     HILOG_DEBUG("function called.");
907     std::lock_guard<ffrt::mutex> guard(lock_);
908     for (const auto &item : appRunningRecordMap_) {
909         const auto &appRecord = item.second;
910         if (appRecord == nullptr) {
911             HILOG_ERROR("appRecord is nullptr");
912             return false;
913         }
914         if (AAFwk::UIExtensionUtils::IsUIExtension(appRecord->GetExtensionType())
915             || AAFwk::UIExtensionUtils::IsWindowExtension(appRecord->GetExtensionType())) {
916             continue;
917         }
918         auto state = appRecord->GetState();
919         if (appRecord && appRecord->GetBundleName() == bundleName &&
920             state == ApplicationState::APP_STATE_FOREGROUND) {
921             return false;
922         }
923     }
924     return true;
925 }
926 
OnWindowVisibilityChanged(const std::vector<sptr<OHOS::Rosen::WindowVisibilityInfo>> & windowVisibilityInfos)927 void AppRunningManager::OnWindowVisibilityChanged(
928     const std::vector<sptr<OHOS::Rosen::WindowVisibilityInfo>> &windowVisibilityInfos)
929 {
930     HILOG_DEBUG("Called.");
931     std::set<int32_t> pids;
932     for (const auto &info : windowVisibilityInfos) {
933         if (info == nullptr) {
934             HILOG_ERROR("Window visibility info is nullptr.");
935             continue;
936         }
937         if (pids.find(info->pid_) != pids.end()) {
938             continue;
939         }
940         auto appRecord = GetAppRunningRecordByPid(info->pid_);
941         if (appRecord == nullptr) {
942             HILOG_ERROR("App running record is nullptr.");
943             return;
944         }
945         HILOG_INFO("The visibility of %{public}s was changed.", appRecord->GetBundleName().c_str());
946         appRecord->OnWindowVisibilityChanged(windowVisibilityInfos);
947         pids.emplace(info->pid_);
948     }
949 }
950 
IsApplicationFirstFocused(const AppRunningRecord & focusedRecord)951 bool AppRunningManager::IsApplicationFirstFocused(const AppRunningRecord &focusedRecord)
952 {
953     HILOG_DEBUG("check focus function called.");
954     std::lock_guard<ffrt::mutex> guard(lock_);
955     for (const auto &item : appRunningRecordMap_) {
956         const auto &appRecord = item.second;
957         if (appRecord == nullptr || appRecord->GetBundleName() != focusedRecord.GetBundleName()) {
958             continue;
959         }
960         if (appRecord->GetFocusFlag() && appRecord->GetRecordId() != focusedRecord.GetRecordId()) {
961             return false;
962         }
963     }
964     return true;
965 }
966 
IsApplicationUnfocused(const std::string & bundleName)967 bool AppRunningManager::IsApplicationUnfocused(const std::string &bundleName)
968 {
969     HILOG_DEBUG("check is application unfocused.");
970     std::lock_guard<ffrt::mutex> guard(lock_);
971     for (const auto &item : appRunningRecordMap_) {
972         const auto &appRecord = item.second;
973         if (appRecord && appRecord->GetBundleName() == bundleName && appRecord->GetFocusFlag()) {
974             return false;
975         }
976     }
977     return true;
978 }
979 
SetAttachAppDebug(const std::string & bundleName,const bool & isAttachDebug)980 void AppRunningManager::SetAttachAppDebug(const std::string &bundleName, const bool &isAttachDebug)
981 {
982     HILOG_DEBUG("Called.");
983     std::lock_guard<ffrt::mutex> guard(lock_);
984     for (const auto &item : appRunningRecordMap_) {
985         const auto &appRecord = item.second;
986         if (appRecord == nullptr) {
987             continue;
988         }
989         if (appRecord->GetBundleName() == bundleName) {
990             HILOG_DEBUG("The application: %{public}s will be set debug mode.", bundleName.c_str());
991             appRecord->SetAttachDebug(isAttachDebug);
992         }
993     }
994 }
995 
GetAppDebugInfosByBundleName(const std::string & bundleName,const bool & isDetachDebug)996 std::vector<AppDebugInfo> AppRunningManager::GetAppDebugInfosByBundleName(
997     const std::string &bundleName, const bool &isDetachDebug)
998 {
999     HILOG_DEBUG("Called.");
1000     std::lock_guard<ffrt::mutex> guard(lock_);
1001     std::vector<AppDebugInfo> debugInfos;
1002     for (const auto &item : appRunningRecordMap_) {
1003         const auto &appRecord = item.second;
1004         if (appRecord == nullptr || appRecord->GetBundleName() != bundleName ||
1005             (isDetachDebug && appRecord->IsDebugApp())) {
1006             continue;
1007         }
1008 
1009         AppDebugInfo debugInfo;
1010         debugInfo.bundleName = bundleName;
1011         auto priorityObject = appRecord->GetPriorityObject();
1012         if (priorityObject) {
1013             debugInfo.pid = priorityObject->GetPid();
1014         }
1015         debugInfo.uid = appRecord->GetUid();
1016         debugInfo.isDebugStart = appRecord->IsDebugApp();
1017         debugInfos.emplace_back(debugInfo);
1018     }
1019     return debugInfos;
1020 }
1021 
GetAbilityTokensByBundleName(const std::string & bundleName,std::vector<sptr<IRemoteObject>> & abilityTokens)1022 void AppRunningManager::GetAbilityTokensByBundleName(
1023     const std::string &bundleName, std::vector<sptr<IRemoteObject>> &abilityTokens)
1024 {
1025     HILOG_DEBUG("Called.");
1026     std::lock_guard<ffrt::mutex> guard(lock_);
1027     for (const auto &item : appRunningRecordMap_) {
1028         const auto &appRecord = item.second;
1029         if (appRecord == nullptr || appRecord->GetBundleName() != bundleName) {
1030             continue;
1031         }
1032 
1033         for (const auto &token : appRecord->GetAbilities()) {
1034             abilityTokens.emplace_back(token.first);
1035         }
1036     }
1037 }
1038 
GetAppRunningRecordByChildProcessPid(const pid_t pid)1039 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByChildProcessPid(const pid_t pid)
1040 {
1041     std::lock_guard<ffrt::mutex> guard(lock_);
1042     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
1043         auto childProcessRecordMap = pair.second->GetChildProcessRecordMap();
1044         return childProcessRecordMap.find(pid) != childProcessRecordMap.end();
1045     });
1046     if (iter != appRunningRecordMap_.end()) {
1047         return iter->second;
1048     }
1049     return nullptr;
1050 }
1051 
OnChildProcessRemoteDied(const wptr<IRemoteObject> & remote)1052 std::shared_ptr<ChildProcessRecord> AppRunningManager::OnChildProcessRemoteDied(const wptr<IRemoteObject> &remote)
1053 {
1054     HILOG_ERROR("On child process remote died.");
1055     if (remote == nullptr) {
1056         HILOG_ERROR("remote is null");
1057         return nullptr;
1058     }
1059     sptr<IRemoteObject> object = remote.promote();
1060     if (!object) {
1061         HILOG_ERROR("promote failed.");
1062         return nullptr;
1063     }
1064 
1065     std::lock_guard<ffrt::mutex> guard(lock_);
1066     std::shared_ptr<ChildProcessRecord> childRecord;
1067     const auto &it = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(),
1068         [&object, &childRecord](const auto &pair) {
1069             auto appRecord = pair.second;
1070             if (!appRecord) {
1071                 return false;
1072             }
1073             auto childRecordMap = appRecord->GetChildProcessRecordMap();
1074             if (childRecordMap.empty()) {
1075                 return false;
1076             }
1077             for (auto iter : childRecordMap) {
1078                 if (iter.second == nullptr) {
1079                     continue;
1080                 }
1081                 auto scheduler = iter.second->GetScheduler();
1082                 if (scheduler && scheduler->AsObject() == object) {
1083                     childRecord = iter.second;
1084                     return true;
1085                 }
1086             }
1087             return false;
1088         });
1089     if (it != appRunningRecordMap_.end()) {
1090         auto appRecord = it->second;
1091         appRecord->RemoveChildProcessRecord(childRecord);
1092         return childRecord;
1093     }
1094     return nullptr;
1095 }
1096 }  // namespace AppExecFwk
1097 }  // namespace OHOS
1098