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