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