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