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