1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ability_window_configuration.h"
17 #include "app_running_record.h"
18 #include "app_mgr_service_inner.h"
19 #include "event_report.h"
20 #include "hitrace_meter.h"
21 #include "hilog_wrapper.h"
22 #include "ui_extension_utils.h"
23
24 namespace OHOS {
25 namespace AppExecFwk {
26 namespace {
27 static constexpr int64_t NANOSECONDS = 1000000000; // NANOSECONDS mean 10^9 nano second
28 static constexpr int64_t MICROSECONDS = 1000000; // MICROSECONDS mean 10^6 millias second
29 constexpr int32_t MAX_RESTART_COUNT = 3;
30 constexpr int32_t RESTART_INTERVAL_TIME = 120000;
31 const std::string LAUNCHER_NAME = "com.ohos.sceneboard";
32 }
33
34 int64_t AppRunningRecord::appEventId_ = 0;
35
RenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,const std::shared_ptr<AppRunningRecord> & host)36 RenderRecord::RenderRecord(pid_t hostPid, const std::string &renderParam,
37 int32_t ipcFd, int32_t sharedFd, int32_t crashFd,
38 const std::shared_ptr<AppRunningRecord> &host)
39 : hostPid_(hostPid), renderParam_(renderParam), ipcFd_(ipcFd),
40 sharedFd_(sharedFd), crashFd_(crashFd), host_(host) {}
41
~RenderRecord()42 RenderRecord::~RenderRecord()
43 {
44 close(sharedFd_);
45 close(ipcFd_);
46 close(crashFd_);
47 }
48
CreateRenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,const std::shared_ptr<AppRunningRecord> & host)49 std::shared_ptr<RenderRecord> RenderRecord::CreateRenderRecord(
50 pid_t hostPid, const std::string &renderParam, int32_t ipcFd,
51 int32_t sharedFd, int32_t crashFd,
52 const std::shared_ptr<AppRunningRecord> &host)
53 {
54 if (hostPid <= 0 || renderParam.empty() || ipcFd <= 0 || sharedFd <= 0 ||
55 crashFd <= 0 || !host) {
56 return nullptr;
57 }
58
59 auto renderRecord = std::make_shared<RenderRecord>(
60 hostPid, renderParam, ipcFd, sharedFd, crashFd, host);
61 renderRecord->SetHostUid(host->GetUid());
62 renderRecord->SetHostBundleName(host->GetBundleName());
63 renderRecord->SetProcessName(host->GetProcessName());
64 return renderRecord;
65 }
66
SetPid(pid_t pid)67 void RenderRecord::SetPid(pid_t pid)
68 {
69 pid_ = pid;
70 }
71
GetPid() const72 pid_t RenderRecord::GetPid() const
73 {
74 return pid_;
75 }
76
GetHostPid() const77 pid_t RenderRecord::GetHostPid() const
78 {
79 return hostPid_;
80 }
81
SetUid(int32_t uid)82 void RenderRecord::SetUid(int32_t uid)
83 {
84 uid_ = uid;
85 }
86
GetUid() const87 int32_t RenderRecord::GetUid() const
88 {
89 return uid_;
90 }
91
SetHostUid(const int32_t hostUid)92 void RenderRecord::SetHostUid(const int32_t hostUid)
93 {
94 hostUid_ = hostUid;
95 }
96
GetHostUid() const97 int32_t RenderRecord::GetHostUid() const
98 {
99 return hostUid_;
100 }
101
SetHostBundleName(const std::string & hostBundleName)102 void RenderRecord::SetHostBundleName(const std::string &hostBundleName)
103 {
104 hostBundleName_ = hostBundleName;
105 }
106
GetHostBundleName() const107 std::string RenderRecord::GetHostBundleName() const
108 {
109 return hostBundleName_;
110 }
111
SetProcessName(const std::string & hostProcessName)112 void RenderRecord::SetProcessName(const std::string &hostProcessName)
113 {
114 processName_ = hostProcessName;
115 }
116
GetProcessName() const117 std::string RenderRecord::GetProcessName() const
118 {
119 return processName_;
120 }
121
GetRenderParam() const122 std::string RenderRecord::GetRenderParam() const
123 {
124 return renderParam_;
125 }
126
GetIpcFd() const127 int32_t RenderRecord::GetIpcFd() const
128 {
129 return ipcFd_;
130 }
131
GetSharedFd() const132 int32_t RenderRecord::GetSharedFd() const
133 {
134 return sharedFd_;
135 }
136
GetCrashFd() const137 int32_t RenderRecord::GetCrashFd() const
138 {
139 return crashFd_;
140 }
141
GetProcessType() const142 ProcessType RenderRecord::GetProcessType() const
143 {
144 return processType_;
145 }
146
GetHostRecord() const147 std::shared_ptr<AppRunningRecord> RenderRecord::GetHostRecord() const
148 {
149 return host_.lock();
150 }
151
GetScheduler() const152 sptr<IRenderScheduler> RenderRecord::GetScheduler() const
153 {
154 return renderScheduler_;
155 }
156
SetScheduler(const sptr<IRenderScheduler> & scheduler)157 void RenderRecord::SetScheduler(const sptr<IRenderScheduler> &scheduler)
158 {
159 renderScheduler_ = scheduler;
160 }
161
SetDeathRecipient(const sptr<AppDeathRecipient> recipient)162 void RenderRecord::SetDeathRecipient(const sptr<AppDeathRecipient> recipient)
163 {
164 deathRecipient_ = recipient;
165 }
166
RegisterDeathRecipient()167 void RenderRecord::RegisterDeathRecipient()
168 {
169 if (renderScheduler_ && deathRecipient_) {
170 auto obj = renderScheduler_->AsObject();
171 if (!obj || !obj->AddDeathRecipient(deathRecipient_)) {
172 HILOG_ERROR("AddDeathRecipient failed.");
173 }
174 }
175 }
176
AppRunningRecord(const std::shared_ptr<ApplicationInfo> & info,const int32_t recordId,const std::string & processName)177 AppRunningRecord::AppRunningRecord(
178 const std::shared_ptr<ApplicationInfo> &info, const int32_t recordId, const std::string &processName)
179 : appRecordId_(recordId), processName_(processName)
180 {
181 if (info) {
182 appInfo_ = info;
183 mainBundleName_ = info->bundleName;
184 isLauncherApp_ = info->isLauncherApp;
185 mainAppName_ = info->name;
186 }
187
188 struct timespec t;
189 t.tv_sec = 0;
190 t.tv_nsec = 0;
191 clock_gettime(CLOCK_MONOTONIC, &t);
192 startTimeMillis_ = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
193 }
194
SetApplicationClient(const sptr<IAppScheduler> & thread)195 void AppRunningRecord::SetApplicationClient(const sptr<IAppScheduler> &thread)
196 {
197 if (!appLifeCycleDeal_) {
198 appLifeCycleDeal_ = std::make_shared<AppLifeCycleDeal>();
199 }
200 appLifeCycleDeal_->SetApplicationClient(thread);
201
202 auto moduleRecordList = GetAllModuleRecord();
203 if (moduleRecordList.empty()) {
204 HILOG_ERROR("moduleRecordList is empty");
205 return;
206 }
207 for (const auto &moduleRecord : moduleRecordList) {
208 moduleRecord->SetApplicationClient(appLifeCycleDeal_);
209 }
210 }
211
GetBundleName() const212 const std::string &AppRunningRecord::GetBundleName() const
213 {
214 return mainBundleName_;
215 }
216
GetCallerPid() const217 int32_t AppRunningRecord::GetCallerPid() const
218 {
219 return callerPid_;
220 }
221
SetCallerPid(int32_t pid)222 void AppRunningRecord::SetCallerPid(int32_t pid)
223 {
224 callerPid_ = pid;
225 }
226
GetCallerUid() const227 int32_t AppRunningRecord::GetCallerUid() const
228 {
229 return callerUid_;
230 }
231
SetCallerUid(int32_t uid)232 void AppRunningRecord::SetCallerUid(int32_t uid)
233 {
234 callerUid_ = uid;
235 }
236
GetCallerTokenId() const237 int32_t AppRunningRecord::GetCallerTokenId() const
238 {
239 return callerTokenId_;
240 }
241
SetCallerTokenId(int32_t tokenId)242 void AppRunningRecord::SetCallerTokenId(int32_t tokenId)
243 {
244 callerTokenId_ = tokenId;
245 }
246
IsLauncherApp() const247 bool AppRunningRecord::IsLauncherApp() const
248 {
249 return isLauncherApp_;
250 }
251
GetRecordId() const252 int32_t AppRunningRecord::GetRecordId() const
253 {
254 return appRecordId_;
255 }
256
GetName() const257 const std::string &AppRunningRecord::GetName() const
258 {
259 return mainAppName_;
260 }
261
GetSignCode() const262 const std::string &AppRunningRecord::GetSignCode() const
263 {
264 return signCode_;
265 }
266
SetSignCode(const std::string & signCode)267 void AppRunningRecord::SetSignCode(const std::string &signCode)
268 {
269 signCode_ = signCode;
270 }
271
GetJointUserId() const272 const std::string &AppRunningRecord::GetJointUserId() const
273 {
274 return jointUserId_;
275 }
276
SetJointUserId(const std::string & jointUserId)277 void AppRunningRecord::SetJointUserId(const std::string &jointUserId)
278 {
279 jointUserId_ = jointUserId;
280 }
281
GetProcessName() const282 const std::string &AppRunningRecord::GetProcessName() const
283 {
284 return processName_;
285 }
286
SetSpecifiedProcessFlag(const std::string & flag)287 void AppRunningRecord::SetSpecifiedProcessFlag(const std::string &flag)
288 {
289 specifiedProcessFlag_ = flag;
290 }
291
GetSpecifiedProcessFlag() const292 const std::string &AppRunningRecord::GetSpecifiedProcessFlag() const
293 {
294 return specifiedProcessFlag_;
295 }
296
GetUid() const297 int32_t AppRunningRecord::GetUid() const
298 {
299 return mainUid_;
300 }
301
SetUid(const int32_t uid)302 void AppRunningRecord::SetUid(const int32_t uid)
303 {
304 mainUid_ = uid;
305 }
306
GetState() const307 ApplicationState AppRunningRecord::GetState() const
308 {
309 return curState_;
310 }
311
SetState(const ApplicationState state)312 void AppRunningRecord::SetState(const ApplicationState state)
313 {
314 if (state >= ApplicationState::APP_STATE_END) {
315 HILOG_ERROR("Invalid application state");
316 return;
317 }
318 if (state == ApplicationState::APP_STATE_FOREGROUND || state == ApplicationState::APP_STATE_BACKGROUND) {
319 restartResidentProcCount_ = MAX_RESTART_COUNT;
320 }
321 std::string foreTag = "ForeApp:";
322 if (state == ApplicationState::APP_STATE_FOREGROUND) {
323 StartAsyncTrace(HITRACE_TAG_APP, foreTag + mainBundleName_, 0);
324 } else if (state == ApplicationState::APP_STATE_BACKGROUND) {
325 FinishAsyncTrace(HITRACE_TAG_APP, foreTag + mainBundleName_, 0);
326 }
327 curState_ = state;
328 }
329
SetRestartTimeMillis(const int64_t restartTimeMillis)330 void AppRunningRecord::SetRestartTimeMillis(const int64_t restartTimeMillis)
331 {
332 restartTimeMillis_ = restartTimeMillis;
333 }
334
GetAppInfoList()335 const std::list<std::shared_ptr<ApplicationInfo>> AppRunningRecord::GetAppInfoList()
336 {
337 std::list<std::shared_ptr<ApplicationInfo>> appInfoList;
338 std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
339 for (const auto &item : appInfos_) {
340 appInfoList.push_back(item.second);
341 }
342 return appInfoList;
343 }
344
GetAbilities()345 const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> AppRunningRecord::GetAbilities()
346 {
347 std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilitysMap;
348 auto moduleRecordList = GetAllModuleRecord();
349 for (const auto &moduleRecord : moduleRecordList) {
350 auto abilities = moduleRecord->GetAbilities();
351 abilitysMap.insert(abilities.begin(), abilities.end());
352 }
353 return abilitysMap;
354 }
355
GetApplicationClient() const356 sptr<IAppScheduler> AppRunningRecord::GetApplicationClient() const
357 {
358 return (appLifeCycleDeal_ ? appLifeCycleDeal_->GetApplicationClient() : nullptr);
359 }
360
GetAbilityRunningRecord(const int64_t eventId) const361 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const
362 {
363 HILOG_DEBUG("called");
364 auto moduleRecordList = GetAllModuleRecord();
365 for (const auto &moduleRecord : moduleRecordList) {
366 auto abilityRecord = moduleRecord->GetAbilityRunningRecord(eventId);
367 if (abilityRecord) {
368 return abilityRecord;
369 }
370 }
371
372 return nullptr;
373 }
374
RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> & moduleRecord,bool isExtensionDebug)375 void AppRunningRecord::RemoveModuleRecord(
376 const std::shared_ptr<ModuleRunningRecord> &moduleRecord, bool isExtensionDebug)
377 {
378 HILOG_DEBUG("called");
379
380 std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
381 for (auto &item : hapModules_) {
382 auto iter = std::find_if(item.second.begin(),
383 item.second.end(),
384 [&moduleRecord](const std::shared_ptr<ModuleRunningRecord> &record) { return moduleRecord == record; });
385 if (iter != item.second.end()) {
386 HILOG_DEBUG("Removed a record.");
387 iter = item.second.erase(iter);
388 if (item.second.empty() && !isExtensionDebug) {
389 {
390 std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
391 HILOG_DEBUG("Removed an appInfo.");
392 appInfos_.erase(item.first);
393 }
394 hapModules_.erase(item.first);
395 }
396 return;
397 }
398 }
399 }
400
ForceKillApp(const std::string & reason) const401 void AppRunningRecord::ForceKillApp([[maybe_unused]] const std::string &reason) const
402 {}
403
ScheduleAppCrash(const std::string & description) const404 void AppRunningRecord::ScheduleAppCrash([[maybe_unused]] const std::string &description) const
405 {}
406
LaunchApplication(const Configuration & config)407 void AppRunningRecord::LaunchApplication(const Configuration &config)
408 {
409 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
410 if (appLifeCycleDeal_ == nullptr) {
411 HILOG_ERROR("appLifeCycleDeal_ is null");
412 return;
413 }
414 if (!appLifeCycleDeal_->GetApplicationClient()) {
415 HILOG_ERROR("appThread is null");
416 return;
417 }
418 AppLaunchData launchData;
419 {
420 std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
421 auto moduleRecords = appInfos_.find(mainBundleName_);
422 if (moduleRecords != appInfos_.end()) {
423 launchData.SetApplicationInfo(*(moduleRecords->second));
424 }
425 }
426 ProcessInfo processInfo(processName_, GetPriorityObject()->GetPid());
427 launchData.SetProcessInfo(processInfo);
428 launchData.SetRecordId(appRecordId_);
429 launchData.SetUId(mainUid_);
430 launchData.SetUserTestInfo(userTestRecord_);
431 launchData.SetAppIndex(appIndex_);
432 launchData.SetDebugApp(isDebugApp_);
433 launchData.SetPerfCmd(perfCmd_);
434 HILOG_DEBUG("app is %{public}s.", GetName().c_str());
435 appLifeCycleDeal_->LaunchApplication(launchData, config);
436 }
437
UpdateApplicationInfoInstalled(const ApplicationInfo & appInfo)438 void AppRunningRecord::UpdateApplicationInfoInstalled(const ApplicationInfo &appInfo)
439 {
440 if (!isStageBasedModel_) {
441 HILOG_INFO("Current version than supports !");
442 return;
443 }
444
445 if (appLifeCycleDeal_ == nullptr) {
446 HILOG_ERROR("appLifeCycleDeal_ is null");
447 return;
448 }
449 appLifeCycleDeal_->UpdateApplicationInfoInstalled(appInfo);
450 }
451
AddAbilityStage()452 void AppRunningRecord::AddAbilityStage()
453 {
454 if (!isStageBasedModel_) {
455 HILOG_INFO("Current version than supports !");
456 return;
457 }
458 HapModuleInfo abilityStage;
459 if (GetTheModuleInfoNeedToUpdated(mainBundleName_, abilityStage)) {
460 SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG, AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
461 HILOG_INFO("Current Informed module : [%{public}s] | bundle : [%{public}s]",
462 abilityStage.moduleName.c_str(), mainBundleName_.c_str());
463 if (appLifeCycleDeal_ == nullptr) {
464 HILOG_WARN("appLifeCycleDeal_ is null");
465 return;
466 }
467 appLifeCycleDeal_->AddAbilityStage(abilityStage);
468 }
469 }
470
AddAbilityStageBySpecifiedAbility(const std::string & bundleName)471 void AppRunningRecord::AddAbilityStageBySpecifiedAbility(const std::string &bundleName)
472 {
473 if (!eventHandler_) {
474 HILOG_ERROR("eventHandler_ is nullptr");
475 return;
476 }
477
478 HapModuleInfo hapModuleInfo;
479 if (GetTheModuleInfoNeedToUpdated(bundleName, hapModuleInfo)) {
480 if (startProcessSpecifiedAbilityEventId_ == 0) {
481 HILOG_INFO("%{public}s START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG is not exist.", __func__);
482 SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
483 AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
484 }
485 if (appLifeCycleDeal_ == nullptr) {
486 HILOG_WARN("appLifeCycleDeal_ is null");
487 return;
488 }
489 appLifeCycleDeal_->AddAbilityStage(hapModuleInfo);
490 }
491 }
492
AddAbilityStageBySpecifiedProcess(const std::string & bundleName)493 void AppRunningRecord::AddAbilityStageBySpecifiedProcess(const std::string &bundleName)
494 {
495 HILOG_DEBUG("call.");
496 if (!eventHandler_) {
497 HILOG_ERROR("eventHandler_ is nullptr");
498 return;
499 }
500
501 HapModuleInfo hapModuleInfo;
502 if (GetTheModuleInfoNeedToUpdated(bundleName, hapModuleInfo)) {
503 SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
504 AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
505 if (appLifeCycleDeal_ == nullptr) {
506 HILOG_WARN("appLifeCycleDeal_ is null");
507 return;
508 }
509 appLifeCycleDeal_->AddAbilityStage(hapModuleInfo);
510 }
511 }
512
AddAbilityStageDone()513 void AppRunningRecord::AddAbilityStageDone()
514 {
515 HILOG_INFO("bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
516 static_cast<int>(eventId_));
517
518 if (!eventHandler_) {
519 HILOG_ERROR("eventHandler_ is nullptr");
520 return;
521 }
522
523 if (startProcessSpecifiedAbilityEventId_ != 0) {
524 eventHandler_->RemoveEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG,
525 startProcessSpecifiedAbilityEventId_);
526 startProcessSpecifiedAbilityEventId_ = 0;
527 }
528 if (addAbilityStageInfoEventId_ != 0) {
529 eventHandler_->RemoveEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
530 addAbilityStageInfoEventId_);
531 addAbilityStageInfoEventId_ = 0;
532 }
533 // Should proceed to the next notification
534
535 if (isSpecifiedAbility_) {
536 ScheduleAcceptWant(moduleName_);
537 return;
538 }
539
540 if (isNewProcessRequest_) {
541 HILOG_DEBUG("ScheduleNewProcessRequest.");
542 ScheduleNewProcessRequest(newProcessRequestWant_, moduleName_);
543 return;
544 }
545
546 AddAbilityStage();
547 }
548
LaunchAbility(const std::shared_ptr<AbilityRunningRecord> & ability)549 void AppRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningRecord> &ability)
550 {
551 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
552 if (appLifeCycleDeal_ == nullptr) {
553 HILOG_ERROR("appLifeCycleDeal_ is null");
554 return;
555 }
556 if (!ability || !ability->GetToken()) {
557 HILOG_ERROR("abilityRecord or abilityToken is nullptr.");
558 return;
559 }
560
561 auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
562 if (!moduleRecord) {
563 HILOG_ERROR("moduleRecord is nullptr");
564 return;
565 }
566
567 moduleRecord->LaunchAbility(ability);
568 }
569
ScheduleTerminate()570 void AppRunningRecord::ScheduleTerminate()
571 {
572 SendEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT);
573 if (appLifeCycleDeal_ == nullptr) {
574 HILOG_WARN("appLifeCycleDeal_ is null");
575 return;
576 }
577 bool isLastProcess = false;
578 auto serviceInner = appMgrServiceInner_.lock();
579 if (serviceInner != nullptr) {
580 isLastProcess = serviceInner->IsFinalAppProcessByBundleName(GetBundleName());
581 }
582 appLifeCycleDeal_->ScheduleTerminate(isLastProcess);
583 }
584
LaunchPendingAbilities()585 void AppRunningRecord::LaunchPendingAbilities()
586 {
587 HILOG_DEBUG("Launch pending abilities.");
588
589 auto moduleRecordList = GetAllModuleRecord();
590 if (moduleRecordList.empty()) {
591 HILOG_ERROR("moduleRecordList is empty");
592 return;
593 }
594 for (const auto &moduleRecord : moduleRecordList) {
595 moduleRecord->SetApplicationClient(appLifeCycleDeal_);
596 moduleRecord->LaunchPendingAbilities();
597 }
598 }
ScheduleForegroundRunning()599 void AppRunningRecord::ScheduleForegroundRunning()
600 {
601 if (appLifeCycleDeal_) {
602 appLifeCycleDeal_->ScheduleForegroundRunning();
603 }
604 }
605
ScheduleBackgroundRunning()606 void AppRunningRecord::ScheduleBackgroundRunning()
607 {
608 if (appLifeCycleDeal_) {
609 appLifeCycleDeal_->ScheduleBackgroundRunning();
610 }
611 isAbilityForegrounding_.store(false);
612 }
613
ScheduleProcessSecurityExit()614 void AppRunningRecord::ScheduleProcessSecurityExit()
615 {
616 if (appLifeCycleDeal_) {
617 appLifeCycleDeal_->ScheduleProcessSecurityExit();
618 }
619 }
620
ScheduleTrimMemory()621 void AppRunningRecord::ScheduleTrimMemory()
622 {
623 if (appLifeCycleDeal_ && priorityObject_) {
624 appLifeCycleDeal_->ScheduleTrimMemory(priorityObject_->GetTimeLevel());
625 }
626 }
627
ScheduleMemoryLevel(int32_t level)628 void AppRunningRecord::ScheduleMemoryLevel(int32_t level)
629 {
630 if (appLifeCycleDeal_) {
631 appLifeCycleDeal_->ScheduleMemoryLevel(level);
632 }
633 }
634
ScheduleHeapMemory(const int32_t pid,OHOS::AppExecFwk::MallocInfo & mallocInfo)635 void AppRunningRecord::ScheduleHeapMemory(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo)
636 {
637 if (appLifeCycleDeal_) {
638 appLifeCycleDeal_->ScheduleHeapMemory(pid, mallocInfo);
639 }
640 }
641
LowMemoryWarning()642 void AppRunningRecord::LowMemoryWarning()
643 {
644 if (appLifeCycleDeal_) {
645 appLifeCycleDeal_->LowMemoryWarning();
646 }
647 }
648
AddModules(const std::shared_ptr<ApplicationInfo> & appInfo,const std::vector<HapModuleInfo> & moduleInfos)649 void AppRunningRecord::AddModules(
650 const std::shared_ptr<ApplicationInfo> &appInfo, const std::vector<HapModuleInfo> &moduleInfos)
651 {
652 HILOG_DEBUG("Add modules");
653
654 if (moduleInfos.empty()) {
655 HILOG_INFO("moduleInfos is empty.");
656 return;
657 }
658
659 for (auto &iter : moduleInfos) {
660 AddModule(appInfo, nullptr, nullptr, iter, nullptr);
661 }
662 }
663
AddModule(const std::shared_ptr<ApplicationInfo> & appInfo,const std::shared_ptr<AbilityInfo> & abilityInfo,const sptr<IRemoteObject> & token,const HapModuleInfo & hapModuleInfo,const std::shared_ptr<AAFwk::Want> & want)664 void AppRunningRecord::AddModule(const std::shared_ptr<ApplicationInfo> &appInfo,
665 const std::shared_ptr<AbilityInfo> &abilityInfo, const sptr<IRemoteObject> &token,
666 const HapModuleInfo &hapModuleInfo, const std::shared_ptr<AAFwk::Want> &want)
667 {
668 HILOG_DEBUG("called");
669
670 if (!appInfo) {
671 HILOG_ERROR("appInfo is null");
672 return;
673 }
674
675 std::shared_ptr<ModuleRunningRecord> moduleRecord;
676
677 auto initModuleRecord = [=](const std::shared_ptr<ModuleRunningRecord> &moduleRecord) {
678 moduleRecord->Init(hapModuleInfo);
679 moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
680 moduleRecord->SetApplicationClient(appLifeCycleDeal_);
681 };
682
683 std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
684 const auto &iter = hapModules_.find(appInfo->bundleName);
685 if (iter != hapModules_.end()) {
686 moduleRecord = GetModuleRecordByModuleName(appInfo->bundleName, hapModuleInfo.moduleName);
687 if (!moduleRecord) {
688 moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
689 iter->second.push_back(moduleRecord);
690 initModuleRecord(moduleRecord);
691 }
692 } else {
693 moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
694 std::vector<std::shared_ptr<ModuleRunningRecord>> moduleList;
695 moduleList.push_back(moduleRecord);
696 hapModules_.emplace(appInfo->bundleName, moduleList);
697 {
698 std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
699 appInfos_.emplace(appInfo->bundleName, appInfo);
700 }
701 initModuleRecord(moduleRecord);
702 }
703
704 if (!abilityInfo || !token) {
705 HILOG_ERROR("abilityInfo or token is nullptr");
706 return;
707 }
708 moduleRecord->AddAbility(token, abilityInfo, want);
709
710 return;
711 }
712
GetModuleRecordByModuleName(const std::string bundleName,const std::string & moduleName)713 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRecordByModuleName(
714 const std::string bundleName, const std::string &moduleName)
715 {
716 HILOG_DEBUG("called");
717 auto moduleRecords = hapModules_.find(bundleName);
718 if (moduleRecords != hapModules_.end()) {
719 for (auto &iter : moduleRecords->second) {
720 if (iter->GetModuleName() == moduleName) {
721 return iter;
722 }
723 }
724 }
725
726 return nullptr;
727 }
728
StateChangedNotifyObserver(const std::shared_ptr<AbilityRunningRecord> & ability,const int32_t state,bool isAbility,bool isFromWindowFocusChanged)729 void AppRunningRecord::StateChangedNotifyObserver(
730 const std::shared_ptr<AbilityRunningRecord> &ability,
731 const int32_t state,
732 bool isAbility,
733 bool isFromWindowFocusChanged)
734 {
735 if (!ability || ability->GetAbilityInfo() == nullptr) {
736 HILOG_ERROR("ability is null");
737 return;
738 }
739 AbilityStateData abilityStateData;
740 abilityStateData.bundleName = ability->GetAbilityInfo()->applicationInfo.bundleName;
741 abilityStateData.moduleName = ability->GetAbilityInfo()->moduleName;
742 abilityStateData.abilityName = ability->GetName();
743 abilityStateData.pid = GetPriorityObject()->GetPid();
744 abilityStateData.abilityState = state;
745 abilityStateData.uid = ability->GetAbilityInfo()->applicationInfo.uid;
746 abilityStateData.token = ability->GetToken();
747 abilityStateData.abilityType = static_cast<int32_t>(ability->GetAbilityInfo()->type);
748 abilityStateData.isFocused = ability->GetFocusFlag();
749 if (ability->GetWant() != nullptr) {
750 abilityStateData.callerAbilityName = ability->GetWant()->GetStringParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
751 abilityStateData.callerBundleName = ability->GetWant()->GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
752 }
753
754 if (isAbility && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
755 HILOG_DEBUG("extension type, not notify any more.");
756 return;
757 }
758 auto serviceInner = appMgrServiceInner_.lock();
759 if (serviceInner) {
760 serviceInner->StateChangedNotifyObserver(abilityStateData, isAbility, isFromWindowFocusChanged);
761 }
762 }
763
GetModuleRunningRecordByToken(const sptr<IRemoteObject> & token) const764 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByToken(
765 const sptr<IRemoteObject> &token) const
766 {
767 if (!token) {
768 return nullptr;
769 }
770
771 auto moduleRecordList = GetAllModuleRecord();
772 for (const auto &moduleRecord : moduleRecordList) {
773 if (moduleRecord && moduleRecord->GetAbilityRunningRecordByToken(token)) {
774 return moduleRecord;
775 }
776 }
777
778 return nullptr;
779 }
780
GetModuleRunningRecordByTerminateLists(const sptr<IRemoteObject> & token) const781 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByTerminateLists(
782 const sptr<IRemoteObject> &token) const
783 {
784 if (!token) {
785 HILOG_ERROR("token is null");
786 return nullptr;
787 }
788
789 auto moduleRecordList = GetAllModuleRecord();
790 for (const auto &moduleRecord : moduleRecordList) {
791 if (moduleRecord && moduleRecord->GetAbilityByTerminateLists(token)) {
792 return moduleRecord;
793 }
794 }
795
796 return nullptr;
797 }
798
GetAbilityRunningRecordByToken(const sptr<IRemoteObject> & token) const799 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecordByToken(
800 const sptr<IRemoteObject> &token) const
801 {
802 auto moduleRecord = GetModuleRunningRecordByToken(token);
803 if (!moduleRecord) {
804 return nullptr;
805 }
806 return moduleRecord->GetAbilityRunningRecordByToken(token);
807 }
808
GetAbilityByTerminateLists(const sptr<IRemoteObject> & token) const809 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityByTerminateLists(
810 const sptr<IRemoteObject> &token) const
811 {
812 auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
813 if (!moduleRecord) {
814 return nullptr;
815 }
816 return moduleRecord->GetAbilityByTerminateLists(token);
817 }
818
UpdateAbilityFocusState(const sptr<IRemoteObject> & token,bool isFocus)819 bool AppRunningRecord::UpdateAbilityFocusState(const sptr<IRemoteObject> &token, bool isFocus)
820 {
821 HILOG_DEBUG("focus state is :%{public}d", isFocus);
822 auto abilityRecord = GetAbilityRunningRecordByToken(token);
823 if (!abilityRecord) {
824 HILOG_ERROR("can not find ability record");
825 return false;
826 }
827
828 bool lastFocusState = abilityRecord->GetFocusFlag();
829 if (lastFocusState == isFocus) {
830 HILOG_ERROR("focus state not change, no need update");
831 return false;
832 }
833
834 if (isFocus) {
835 return AbilityFocused(abilityRecord);
836 } else {
837 return AbilityUnfocused(abilityRecord);
838 }
839 }
840
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)841 void AppRunningRecord::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
842 {
843 HILOG_DEBUG("state is :%{public}d", static_cast<int32_t>(state));
844 auto abilityRecord = GetAbilityRunningRecordByToken(token);
845 if (!abilityRecord) {
846 HILOG_ERROR("can not find ability record");
847 return;
848 }
849 if (state == AbilityState::ABILITY_STATE_CREATE) {
850 StateChangedNotifyObserver(
851 abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_CREATE), true, false);
852 return;
853 }
854 if (state == abilityRecord->GetState()) {
855 HILOG_ERROR("current state is already, no need update");
856 return;
857 }
858
859 if (state == AbilityState::ABILITY_STATE_FOREGROUND) {
860 AbilityForeground(abilityRecord);
861 } else if (state == AbilityState::ABILITY_STATE_BACKGROUND) {
862 AbilityBackground(abilityRecord);
863 } else {
864 HILOG_WARN("wrong state");
865 }
866 }
867
AbilityForeground(const std::shared_ptr<AbilityRunningRecord> & ability)868 void AppRunningRecord::AbilityForeground(const std::shared_ptr<AbilityRunningRecord> &ability)
869 {
870 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
871 if (!ability) {
872 HILOG_ERROR("ability is null");
873 return;
874 }
875 AbilityState curAbilityState = ability->GetState();
876 if (curAbilityState != AbilityState::ABILITY_STATE_READY &&
877 curAbilityState != AbilityState::ABILITY_STATE_BACKGROUND) {
878 HILOG_ERROR("ability state(%{public}d) error", static_cast<int32_t>(curAbilityState));
879 return;
880 }
881
882 HILOG_DEBUG("appState: %{public}d, bundle: %{public}s, ability: %{public}s",
883 curState_, mainBundleName_.c_str(), ability->GetName().c_str());
884 // We need schedule application to foregrounded when current application state is ready or background running.
885 if (curState_ == ApplicationState::APP_STATE_FOREGROUND
886 && pendingState_ != ApplicationPendingState::BACKGROUNDING) {
887 // Just change ability to foreground if current application state is foreground or focus.
888 auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
889 if (moduleRecord == nullptr) {
890 HILOG_ERROR("moduleRecord is nullptr");
891 return;
892 }
893 moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
894 StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true, false);
895 auto serviceInner = appMgrServiceInner_.lock();
896 if (serviceInner) {
897 serviceInner->OnAppStateChanged(shared_from_this(), curState_, false, false);
898 }
899 return;
900 }
901 if (curState_ == ApplicationState::APP_STATE_READY || curState_ == ApplicationState::APP_STATE_BACKGROUND
902 || curState_ == ApplicationState::APP_STATE_FOREGROUND) {
903 if (foregroundingAbilityTokens_.empty() || pendingState_ == ApplicationPendingState::BACKGROUNDING) {
904 HILOG_DEBUG("application foregrounding.");
905 SetApplicationPendingState(ApplicationPendingState::FOREGROUNDING);
906 ScheduleForegroundRunning();
907 }
908 foregroundingAbilityTokens_.insert(ability->GetToken());
909 HILOG_DEBUG("foregroundingAbility size: %{public}d", static_cast<int32_t>(foregroundingAbilityTokens_.size()));
910 if (curState_ == ApplicationState::APP_STATE_BACKGROUND) {
911 SendAppStartupTypeEvent(ability, AppStartType::HOT);
912 }
913 } else {
914 HILOG_WARN("wrong application state");
915 }
916 }
917
AbilityBackground(const std::shared_ptr<AbilityRunningRecord> & ability)918 void AppRunningRecord::AbilityBackground(const std::shared_ptr<AbilityRunningRecord> &ability)
919 {
920 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
921 if (!ability) {
922 HILOG_ERROR("ability is null");
923 return;
924 }
925 HILOG_DEBUG("ability is %{public}s", mainBundleName_.c_str());
926 if (ability->GetState() != AbilityState::ABILITY_STATE_FOREGROUND &&
927 ability->GetState() != AbilityState::ABILITY_STATE_READY) {
928 HILOG_ERROR("ability state is not foreground or focus");
929 return;
930 }
931
932 // First change ability to background.
933 auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
934 if (moduleRecord == nullptr) {
935 HILOG_ERROR("moduleRecord is nullptr");
936 return;
937 }
938 moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_BACKGROUND);
939 StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_BACKGROUND), true, false);
940 if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
941 int32_t foregroundSize = 0;
942 auto abilitiesMap = GetAbilities();
943 for (const auto &item : abilitiesMap) {
944 const auto &abilityRecord = item.second;
945 if (abilityRecord && abilityRecord->GetState() == AbilityState::ABILITY_STATE_FOREGROUND &&
946 abilityRecord->GetAbilityInfo() &&
947 (abilityRecord->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE
948 || AAFwk::UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo()->extensionAbilityType))) {
949 foregroundSize++;
950 break;
951 }
952 }
953
954 // Then schedule application background when all ability is not foreground.
955 if (foregroundSize == 0 && mainBundleName_ != LAUNCHER_NAME && windowIds_.empty()) {
956 SetApplicationPendingState(ApplicationPendingState::BACKGROUNDING);
957 ScheduleBackgroundRunning();
958 }
959 } else {
960 HILOG_WARN("wrong application state");
961 }
962 }
963
AbilityFocused(const std::shared_ptr<AbilityRunningRecord> & ability)964 bool AppRunningRecord::AbilityFocused(const std::shared_ptr<AbilityRunningRecord> &ability)
965 {
966 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
967 if (!ability) {
968 HILOG_ERROR("ability is null");
969 return false;
970 }
971 ability->UpdateFocusState(true);
972
973 // update ability state
974 int32_t abilityState = static_cast<int32_t>(ability->GetState());
975 bool isAbility = true;
976 if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
977 isAbility = false;
978 }
979 StateChangedNotifyObserver(ability, abilityState, isAbility, true);
980
981 if (isFocused_) {
982 // process state is already focused, no need update process state.
983 return false;
984 }
985
986 // update process focus state to true.
987 isFocused_ = true;
988 return true;
989 }
990
AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> & ability)991 bool AppRunningRecord::AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> &ability)
992 {
993 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
994 if (!ability) {
995 HILOG_ERROR("ability is null");
996 return false;
997 }
998 ability->UpdateFocusState(false);
999
1000 // update ability state to unfocused.
1001 int32_t abilityState = static_cast<int32_t>(ability->GetState());
1002 bool isAbility = true;
1003 if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
1004 isAbility = false;
1005 }
1006 StateChangedNotifyObserver(ability, abilityState, isAbility, true);
1007
1008 if (!isFocused_) {
1009 return false; // invalid process focus state, already unfocused, process state not change.
1010 }
1011
1012 bool changeProcessToUnfocused = true;
1013 auto abilitysMap = GetAbilities();
1014 for (const auto &item : abilitysMap) {
1015 const auto &abilityRecord = item.second;
1016 if (abilityRecord && abilityRecord->GetFocusFlag()) {
1017 changeProcessToUnfocused = false;
1018 break;
1019 }
1020 }
1021
1022 if (changeProcessToUnfocused) {
1023 isFocused_ = false; // process focus state : from focus to unfocus.
1024 }
1025 return changeProcessToUnfocused;
1026 }
1027
PopForegroundingAbilityTokens()1028 void AppRunningRecord::PopForegroundingAbilityTokens()
1029 {
1030 HILOG_INFO("foregroundingAbility size: %{public}d", static_cast<int32_t>(foregroundingAbilityTokens_.size()));
1031 for (auto iter = foregroundingAbilityTokens_.begin(); iter != foregroundingAbilityTokens_.end();) {
1032 auto ability = GetAbilityRunningRecordByToken(*iter);
1033 auto moduleRecord = GetModuleRunningRecordByToken(*iter);
1034 if (!moduleRecord) {
1035 HILOG_ERROR("can not find module record");
1036 ++iter;
1037 continue;
1038 }
1039 moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
1040 StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true, false);
1041 iter = foregroundingAbilityTokens_.erase(iter);
1042 }
1043 }
1044
TerminateAbility(const sptr<IRemoteObject> & token,const bool isForce)1045 void AppRunningRecord::TerminateAbility(const sptr<IRemoteObject> &token, const bool isForce)
1046 {
1047 HILOG_DEBUG("isForce: %{public}d", static_cast<int>(isForce));
1048
1049 auto moduleRecord = GetModuleRunningRecordByToken(token);
1050 if (!moduleRecord) {
1051 HILOG_ERROR("can not find module record");
1052 return;
1053 }
1054
1055 auto abilityRecord = GetAbilityRunningRecordByToken(token);
1056 StateChangedNotifyObserver(
1057 abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_TERMINATED), true, false);
1058 moduleRecord->TerminateAbility(shared_from_this(), token, isForce);
1059 }
1060
AbilityTerminated(const sptr<IRemoteObject> & token)1061 void AppRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
1062 {
1063 HILOG_DEBUG("called");
1064 auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
1065 if (!moduleRecord) {
1066 HILOG_ERROR("AbilityTerminated error, can not find module record");
1067 return;
1068 }
1069
1070 bool isExtensionDebug = false;
1071 auto abilityRecord = moduleRecord->GetAbilityByTerminateLists(token);
1072 if (abilityRecord != nullptr && abilityRecord->GetAbilityInfo() != nullptr) {
1073 isExtensionDebug = (abilityRecord->GetAbilityInfo()->type == AppExecFwk::AbilityType::EXTENSION) &&
1074 (isAttachDebug_ || isDebugApp_);
1075 }
1076 HILOG_DEBUG("Extension debug is [%{public}s]", isExtensionDebug ? "true" : "false");
1077
1078 moduleRecord->AbilityTerminated(token);
1079
1080 if (moduleRecord->GetAbilities().empty() && (!IsKeepAliveApp()
1081 || AAFwk::UIExtensionUtils::IsUIExtension(GetExtensionType()))) {
1082 RemoveModuleRecord(moduleRecord, isExtensionDebug);
1083 }
1084
1085 auto moduleRecordList = GetAllModuleRecord();
1086 if (moduleRecordList.empty() && (!IsKeepAliveApp()
1087 || AAFwk::UIExtensionUtils::IsUIExtension(GetExtensionType())) && !isExtensionDebug) {
1088 ScheduleTerminate();
1089 }
1090 }
1091
GetAllModuleRecord() const1092 std::list<std::shared_ptr<ModuleRunningRecord>> AppRunningRecord::GetAllModuleRecord() const
1093 {
1094 std::list<std::shared_ptr<ModuleRunningRecord>> moduleRecordList;
1095 std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
1096 HILOG_DEBUG("Begin.");
1097 for (const auto &item : hapModules_) {
1098 for (const auto &list : item.second) {
1099 moduleRecordList.push_back(list);
1100 }
1101 }
1102 HILOG_DEBUG("End.");
1103 return moduleRecordList;
1104 }
1105
RemoveAppDeathRecipient() const1106 void AppRunningRecord::RemoveAppDeathRecipient() const
1107 {
1108 if (appLifeCycleDeal_ == nullptr) {
1109 HILOG_ERROR("appLifeCycleDeal_ is null");
1110 return;
1111 }
1112 if (!appLifeCycleDeal_->GetApplicationClient()) {
1113 HILOG_ERROR("appThread is nullptr.");
1114 return;
1115 }
1116 auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
1117 if (object) {
1118 if (!object->RemoveDeathRecipient(appDeathRecipient_)) {
1119 HILOG_WARN("Failed to remove deathRecipient.");
1120 }
1121 }
1122 }
1123
SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> & inner)1124 void AppRunningRecord::SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> &inner)
1125 {
1126 appMgrServiceInner_ = inner;
1127
1128 auto moduleRecordList = GetAllModuleRecord();
1129 if (moduleRecordList.empty()) {
1130 HILOG_ERROR("moduleRecordList is empty");
1131 return;
1132 }
1133
1134 for (const auto &moduleRecord : moduleRecordList) {
1135 moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
1136 }
1137 }
1138
SetAppDeathRecipient(const sptr<AppDeathRecipient> & appDeathRecipient)1139 void AppRunningRecord::SetAppDeathRecipient(const sptr<AppDeathRecipient> &appDeathRecipient)
1140 {
1141 appDeathRecipient_ = appDeathRecipient;
1142 }
1143
GetPriorityObject()1144 std::shared_ptr<PriorityObject> AppRunningRecord::GetPriorityObject()
1145 {
1146 if (!priorityObject_) {
1147 priorityObject_ = std::make_shared<PriorityObject>();
1148 }
1149
1150 return priorityObject_;
1151 }
1152
SendEventForSpecifiedAbility(uint32_t msg,int64_t timeOut)1153 void AppRunningRecord::SendEventForSpecifiedAbility(uint32_t msg, int64_t timeOut)
1154 {
1155 SendEvent(msg, timeOut);
1156 }
1157
SendAppStartupTypeEvent(const std::shared_ptr<AbilityRunningRecord> & ability,const AppStartType startType)1158 void AppRunningRecord::SendAppStartupTypeEvent(const std::shared_ptr<AbilityRunningRecord> &ability,
1159 const AppStartType startType)
1160 {
1161 if (!ability) {
1162 HILOG_ERROR("AbilityRunningRecord is nullptr");
1163 return;
1164 }
1165 AAFwk::EventInfo eventInfo;
1166 auto applicationInfo = GetApplicationInfo();
1167 if (!applicationInfo) {
1168 HILOG_ERROR("applicationInfo is nullptr, can not get app information");
1169 } else {
1170 eventInfo.bundleName = applicationInfo->name;
1171 eventInfo.versionName = applicationInfo->versionName;
1172 eventInfo.versionCode = applicationInfo->versionCode;
1173 }
1174
1175 auto abilityInfo = ability->GetAbilityInfo();
1176 if (!abilityInfo) {
1177 HILOG_ERROR("abilityInfo is nullptr, can not get ability information");
1178 } else {
1179 eventInfo.abilityName = abilityInfo->name;
1180 }
1181 if (GetPriorityObject() == nullptr) {
1182 HILOG_ERROR("appRecord's priorityObject is null");
1183 } else {
1184 eventInfo.pid = GetPriorityObject()->GetPid();
1185 }
1186 eventInfo.startType = static_cast<int32_t>(startType);
1187 AAFwk::EventReport::SendAppEvent(AAFwk::EventName::APP_STARTUP_TYPE, HiSysEventType::BEHAVIOR, eventInfo);
1188 }
1189
SendEvent(uint32_t msg,int64_t timeOut)1190 void AppRunningRecord::SendEvent(uint32_t msg, int64_t timeOut)
1191 {
1192 if (!eventHandler_) {
1193 HILOG_ERROR("eventHandler_ is nullptr");
1194 return;
1195 }
1196
1197 if (isDebugApp_ || isNativeDebug_ || isAttachDebug_) {
1198 HILOG_INFO("Is debug mode, no need to handle time out.");
1199 return;
1200 }
1201
1202 appEventId_++;
1203 eventId_ = appEventId_;
1204 if (msg == AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG) {
1205 startProcessSpecifiedAbilityEventId_ = eventId_;
1206 }
1207 if (msg == AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG) {
1208 addAbilityStageInfoEventId_ = eventId_;
1209 }
1210
1211 HILOG_INFO("eventId %{public}d", static_cast<int>(eventId_));
1212 eventHandler_->SendEvent(AAFwk::EventWrap(msg, eventId_), timeOut, false);
1213 SendClearTask(msg, timeOut);
1214 }
1215
SendClearTask(uint32_t msg,int64_t timeOut)1216 void AppRunningRecord::SendClearTask(uint32_t msg, int64_t timeOut)
1217 {
1218 if (!taskHandler_) {
1219 HILOG_ERROR("taskHandler_ is nullptr");
1220 return;
1221 }
1222 int64_t* eventId = nullptr;
1223 if (msg == AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG) {
1224 eventId = &startProcessSpecifiedAbilityEventId_;
1225 } else if (msg == AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG) {
1226 eventId = &addAbilityStageInfoEventId_;
1227 } else {
1228 HILOG_DEBUG("Other msg: %{public}d", msg);
1229 return;
1230 }
1231 taskHandler_->SubmitTask([wthis = weak_from_this(), eventId]() {
1232 auto pthis = wthis.lock();
1233 if (pthis) {
1234 *eventId = 0;
1235 }
1236 }, timeOut);
1237 }
1238
PostTask(std::string msg,int64_t timeOut,const Closure & task)1239 void AppRunningRecord::PostTask(std::string msg, int64_t timeOut, const Closure &task)
1240 {
1241 if (!taskHandler_) {
1242 HILOG_ERROR("taskHandler_ is nullptr");
1243 return;
1244 }
1245 taskHandler_->SubmitTask(task, msg, timeOut);
1246 }
1247
GetEventId() const1248 int64_t AppRunningRecord::GetEventId() const
1249 {
1250 return eventId_;
1251 }
1252
SetTaskHandler(std::shared_ptr<AAFwk::TaskHandlerWrap> taskHandler)1253 void AppRunningRecord::SetTaskHandler(std::shared_ptr<AAFwk::TaskHandlerWrap> taskHandler)
1254 {
1255 taskHandler_ = taskHandler;
1256 }
1257
SetEventHandler(const std::shared_ptr<AMSEventHandler> & handler)1258 void AppRunningRecord::SetEventHandler(const std::shared_ptr<AMSEventHandler> &handler)
1259 {
1260 eventHandler_ = handler;
1261 }
1262
IsLastAbilityRecord(const sptr<IRemoteObject> & token)1263 bool AppRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
1264 {
1265 auto moduleRecord = GetModuleRunningRecordByToken(token);
1266 if (!moduleRecord) {
1267 HILOG_ERROR("can not find module record");
1268 return false;
1269 }
1270
1271 auto moduleRecordList = GetAllModuleRecord();
1272 if (moduleRecordList.size() == 1) {
1273 return moduleRecord->IsLastAbilityRecord(token);
1274 }
1275
1276 return false;
1277 }
1278
IsLastPageAbilityRecord(const sptr<IRemoteObject> & token)1279 bool AppRunningRecord::IsLastPageAbilityRecord(const sptr<IRemoteObject> &token)
1280 {
1281 auto moduleRecord = GetModuleRunningRecordByToken(token);
1282 if (!moduleRecord) {
1283 HILOG_ERROR("can not find module record");
1284 return false;
1285 }
1286
1287 int32_t pageAbilitySize = 0;
1288 auto moduleRecordList = GetAllModuleRecord();
1289 for (auto moduleRecord : moduleRecordList) {
1290 pageAbilitySize += moduleRecord->GetPageAbilitySize() ;
1291 if (pageAbilitySize > 1) {
1292 return false;
1293 }
1294 }
1295
1296 return pageAbilitySize == 1;
1297 }
1298
SetTerminating()1299 void AppRunningRecord::SetTerminating()
1300 {
1301 isTerminating = true;
1302 }
1303
IsTerminating()1304 bool AppRunningRecord::IsTerminating()
1305 {
1306 return isTerminating;
1307 }
1308
IsKeepAliveApp() const1309 bool AppRunningRecord::IsKeepAliveApp() const
1310 {
1311 return isKeepAliveApp_;
1312 }
1313
IsEmptyKeepAliveApp() const1314 bool AppRunningRecord::IsEmptyKeepAliveApp() const
1315 {
1316 return isEmptyKeepAliveApp_;
1317 }
1318
SetKeepAliveAppState(bool isKeepAlive,bool isEmptyKeepAliveApp)1319 void AppRunningRecord::SetKeepAliveAppState(bool isKeepAlive, bool isEmptyKeepAliveApp)
1320 {
1321 isKeepAliveApp_ = isKeepAlive;
1322 isEmptyKeepAliveApp_ = isEmptyKeepAliveApp;
1323 }
1324
SetStageModelState(bool isStageBasedModel)1325 void AppRunningRecord::SetStageModelState(bool isStageBasedModel)
1326 {
1327 isStageBasedModel_ = isStageBasedModel;
1328 }
1329
GetTheModuleInfoNeedToUpdated(const std::string bundleName,HapModuleInfo & info)1330 bool AppRunningRecord::GetTheModuleInfoNeedToUpdated(const std::string bundleName, HapModuleInfo &info)
1331 {
1332 bool result = false;
1333 std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
1334 auto moduleInfoVectorIter = hapModules_.find(bundleName);
1335 if (moduleInfoVectorIter == hapModules_.end() || moduleInfoVectorIter->second.empty()) {
1336 return result;
1337 }
1338 std::string moduleName = moduleName_;
1339 auto findCondition = [moduleName](const std::shared_ptr<ModuleRunningRecord> &record) {
1340 if (record) {
1341 return (moduleName.empty() || (moduleName == record->GetModuleName())) &&
1342 (record->GetModuleRecordState() == ModuleRecordState::INITIALIZED_STATE);
1343 }
1344 return false;
1345 };
1346 auto moduleRecordIter =
1347 std::find_if(moduleInfoVectorIter->second.begin(), moduleInfoVectorIter->second.end(), findCondition);
1348 if (moduleRecordIter != moduleInfoVectorIter->second.end()) {
1349 (*moduleRecordIter)->GetHapModuleInfo(info);
1350 (*moduleRecordIter)->SetModuleRecordState(ModuleRecordState::RUNNING_STATE);
1351 result = true;
1352 }
1353
1354 return result;
1355 }
1356
SetRestartResidentProcCount(int count)1357 void AppRunningRecord::SetRestartResidentProcCount(int count)
1358 {
1359 restartResidentProcCount_ = count;
1360 }
1361
DecRestartResidentProcCount()1362 void AppRunningRecord::DecRestartResidentProcCount()
1363 {
1364 restartResidentProcCount_--;
1365 }
1366
GetRestartResidentProcCount() const1367 int AppRunningRecord::GetRestartResidentProcCount() const
1368 {
1369 return restartResidentProcCount_;
1370 }
1371
CanRestartResidentProc()1372 bool AppRunningRecord::CanRestartResidentProc()
1373 {
1374 struct timespec t;
1375 t.tv_sec = 0;
1376 t.tv_nsec = 0;
1377 clock_gettime(CLOCK_MONOTONIC, &t);
1378 int64_t systemTimeMillis = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
1379 if ((restartResidentProcCount_ >= 0) || ((systemTimeMillis - restartTimeMillis_) > RESTART_INTERVAL_TIME)) {
1380 return true;
1381 }
1382 return false;
1383 }
1384
GetBundleNames(std::vector<std::string> & bundleNames)1385 void AppRunningRecord::GetBundleNames(std::vector<std::string> &bundleNames)
1386 {
1387 std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
1388 HILOG_DEBUG("Begin.");
1389 for (auto &app : appInfos_) {
1390 bundleNames.emplace_back(app.first);
1391 }
1392 HILOG_DEBUG("End.");
1393 }
1394
SetUserTestInfo(const std::shared_ptr<UserTestRecord> & record)1395 void AppRunningRecord::SetUserTestInfo(const std::shared_ptr<UserTestRecord> &record)
1396 {
1397 userTestRecord_ = record;
1398 }
1399
GetUserTestInfo()1400 std::shared_ptr<UserTestRecord> AppRunningRecord::GetUserTestInfo()
1401 {
1402 return userTestRecord_;
1403 }
1404
SetProcessAndExtensionType(const std::shared_ptr<AbilityInfo> & abilityInfo)1405 void AppRunningRecord::SetProcessAndExtensionType(const std::shared_ptr<AbilityInfo> &abilityInfo)
1406 {
1407 if (abilityInfo == nullptr) {
1408 HILOG_ERROR("abilityInfo is nullptr");
1409 return;
1410 }
1411 extensionType_ = abilityInfo->extensionAbilityType;
1412 if (extensionType_ == ExtensionAbilityType::UNSPECIFIED) {
1413 //record Service Ability in FA model as Service Extension
1414 if (abilityInfo->type == AbilityType::SERVICE) {
1415 processType_ = ProcessType::EXTENSION;
1416 extensionType_ = ExtensionAbilityType::SERVICE;
1417 return;
1418 }
1419 //record Data Ability in FA model as Datashare Extension
1420 if (abilityInfo->type == AbilityType::DATA) {
1421 processType_ = ProcessType::EXTENSION;
1422 extensionType_ = ExtensionAbilityType::DATASHARE;
1423 return;
1424 }
1425 processType_ = ProcessType::NORMAL;
1426 return;
1427 }
1428 processType_ = ProcessType::EXTENSION;
1429 return;
1430 }
1431
SetSpecifiedAbilityFlagAndWant(const bool flag,const AAFwk::Want & want,const std::string & moduleName)1432 void AppRunningRecord::SetSpecifiedAbilityFlagAndWant(
1433 const bool flag, const AAFwk::Want &want, const std::string &moduleName)
1434 {
1435 isSpecifiedAbility_ = flag;
1436 SpecifiedWant_ = want;
1437 moduleName_ = moduleName;
1438 }
1439
SetScheduleNewProcessRequestState(const bool isNewProcessRequest,const AAFwk::Want & want,const std::string & moduleName)1440 void AppRunningRecord::SetScheduleNewProcessRequestState(
1441 const bool isNewProcessRequest, const AAFwk::Want &want, const std::string &moduleName)
1442 {
1443 isNewProcessRequest_ = isNewProcessRequest;
1444 newProcessRequestWant_ = want;
1445 moduleName_ = moduleName;
1446 }
1447
IsNewProcessRequest() const1448 bool AppRunningRecord::IsNewProcessRequest() const
1449 {
1450 return isNewProcessRequest_;
1451 }
1452
IsStartSpecifiedAbility() const1453 bool AppRunningRecord::IsStartSpecifiedAbility() const
1454 {
1455 return isSpecifiedAbility_;
1456 }
1457
ScheduleAcceptWant(const std::string & moduleName)1458 void AppRunningRecord::ScheduleAcceptWant(const std::string &moduleName)
1459 {
1460 SendEvent(
1461 AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT);
1462 if (appLifeCycleDeal_ == nullptr) {
1463 HILOG_WARN("appLifeCycleDeal_ is null");
1464 return;
1465 }
1466 appLifeCycleDeal_->ScheduleAcceptWant(SpecifiedWant_, moduleName);
1467 }
1468
ScheduleAcceptWantDone()1469 void AppRunningRecord::ScheduleAcceptWantDone()
1470 {
1471 HILOG_INFO("Schedule accept want done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1472 static_cast<int>(eventId_));
1473
1474 if (!eventHandler_) {
1475 HILOG_ERROR("eventHandler_ is nullptr");
1476 return;
1477 }
1478
1479 eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, eventId_);
1480 }
1481
ScheduleNewProcessRequest(const AAFwk::Want & want,const std::string & moduleName)1482 void AppRunningRecord::ScheduleNewProcessRequest(const AAFwk::Want &want, const std::string &moduleName)
1483 {
1484 SendEvent(
1485 AMSEventHandler::START_SPECIFIED_PROCESS_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_PROCESS_TIMEOUT);
1486 if (appLifeCycleDeal_ == nullptr) {
1487 HILOG_WARN("appLifeCycleDeal_ is null");
1488 return;
1489 }
1490 appLifeCycleDeal_->ScheduleNewProcessRequest(want, moduleName);
1491 }
1492
ScheduleNewProcessRequestDone()1493 void AppRunningRecord::ScheduleNewProcessRequestDone()
1494 {
1495 HILOG_INFO("ScheduleNewProcessRequestDone. bundle %{public}s and eventId %{public}d",
1496 mainBundleName_.c_str(), static_cast<int>(eventId_));
1497
1498 if (!eventHandler_) {
1499 HILOG_ERROR("eventHandler_ is nullptr");
1500 return;
1501 }
1502
1503 eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_PROCESS_TIMEOUT_MSG, eventId_);
1504 }
1505
ApplicationTerminated()1506 void AppRunningRecord::ApplicationTerminated()
1507 {
1508 HILOG_DEBUG("Application terminated bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1509 static_cast<int>(eventId_));
1510
1511 if (!eventHandler_) {
1512 HILOG_ERROR("eventHandler_ is nullptr");
1513 return;
1514 }
1515
1516 eventHandler_->RemoveEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, eventId_);
1517 }
1518
GetSpecifiedWant() const1519 const AAFwk::Want &AppRunningRecord::GetSpecifiedWant() const
1520 {
1521 return SpecifiedWant_;
1522 }
1523
GetNewProcessRequestWant() const1524 const AAFwk::Want &AppRunningRecord::GetNewProcessRequestWant() const
1525 {
1526 return newProcessRequestWant_;
1527 }
1528
UpdateConfiguration(const Configuration & config)1529 int32_t AppRunningRecord::UpdateConfiguration(const Configuration &config)
1530 {
1531 HILOG_DEBUG("called");
1532 if (!appLifeCycleDeal_) {
1533 HILOG_INFO("appLifeCycleDeal_ is null");
1534 return ERR_INVALID_VALUE;
1535 }
1536 return appLifeCycleDeal_->UpdateConfiguration(config);
1537 }
1538
AddRenderRecord(const std::shared_ptr<RenderRecord> & record)1539 void AppRunningRecord::AddRenderRecord(const std::shared_ptr<RenderRecord> &record)
1540 {
1541 if (!record) {
1542 HILOG_DEBUG("AddRenderRecord: record is null");
1543 return;
1544 }
1545 std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1546 renderRecordMap_.emplace(record->GetUid(), record);
1547 }
1548
RemoveRenderRecord(const std::shared_ptr<RenderRecord> & record)1549 void AppRunningRecord::RemoveRenderRecord(const std::shared_ptr<RenderRecord> &record)
1550 {
1551 if (!record) {
1552 HILOG_DEBUG("RemoveRenderRecord: record is null");
1553 return;
1554 }
1555 std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1556 renderRecordMap_.erase(record->GetUid());
1557 }
1558
GetRenderRecordByPid(const pid_t pid)1559 std::shared_ptr<RenderRecord> AppRunningRecord::GetRenderRecordByPid(const pid_t pid)
1560 {
1561 std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1562 if (renderRecordMap_.empty()) {
1563 return nullptr;
1564 }
1565 for (auto iter : renderRecordMap_) {
1566 auto renderRecord = iter.second;
1567 if (renderRecord && renderRecord->GetPid() == pid) {
1568 return renderRecord;
1569 }
1570 }
1571 return nullptr;
1572 }
1573
GetRenderRecordMap()1574 std::map<int32_t, std::shared_ptr<RenderRecord>> AppRunningRecord::GetRenderRecordMap()
1575 {
1576 std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1577 return renderRecordMap_;
1578 }
1579
SetStartMsg(const AppSpawnStartMsg & msg)1580 void AppRunningRecord::SetStartMsg(const AppSpawnStartMsg &msg)
1581 {
1582 startMsg_ = msg;
1583 }
1584
GetStartMsg()1585 AppSpawnStartMsg AppRunningRecord::GetStartMsg()
1586 {
1587 return startMsg_;
1588 }
1589
SetDebugApp(bool isDebugApp)1590 void AppRunningRecord::SetDebugApp(bool isDebugApp)
1591 {
1592 HILOG_DEBUG("value is %{public}d", isDebugApp);
1593 isDebugApp_ = isDebugApp;
1594 }
1595
IsDebugApp()1596 bool AppRunningRecord::IsDebugApp()
1597 {
1598 return isDebugApp_;
1599 }
1600
SetNativeDebug(bool isNativeDebug)1601 void AppRunningRecord::SetNativeDebug(bool isNativeDebug)
1602 {
1603 HILOG_DEBUG("SetNativeDebug, value is %{public}d", isNativeDebug);
1604 isNativeDebug_ = isNativeDebug;
1605 }
1606
SetPerfCmd(const std::string & perfCmd)1607 void AppRunningRecord::SetPerfCmd(const std::string &perfCmd)
1608 {
1609 perfCmd_ = perfCmd;
1610 }
1611
SetAppIndex(const int32_t appIndex)1612 void AppRunningRecord::SetAppIndex(const int32_t appIndex)
1613 {
1614 appIndex_ = appIndex;
1615 }
1616
GetSplitModeAndFloatingMode(bool & isSplitScreenMode,bool & isFloatingWindowMode)1617 void AppRunningRecord::GetSplitModeAndFloatingMode(bool &isSplitScreenMode, bool &isFloatingWindowMode)
1618 {
1619 auto abilitiesMap = GetAbilities();
1620 isSplitScreenMode = false;
1621 isFloatingWindowMode = false;
1622 for (const auto &item : abilitiesMap) {
1623 const auto &abilityRecord = item.second;
1624 if (abilityRecord == nullptr) {
1625 continue;
1626 }
1627 const auto &abilityWant = abilityRecord->GetWant();
1628 if (abilityWant != nullptr) {
1629 int windowMode = abilityWant->GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1);
1630 if (windowMode == AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_FLOATING) {
1631 isFloatingWindowMode = true;
1632 }
1633 if (windowMode == AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_PRIMARY ||
1634 windowMode == AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_SECONDARY) {
1635 isSplitScreenMode = true;
1636 }
1637 }
1638 if (isFloatingWindowMode && isSplitScreenMode) {
1639 break;
1640 }
1641 }
1642 }
1643
GetAppIndex() const1644 int32_t AppRunningRecord::GetAppIndex() const
1645 {
1646 return appIndex_;
1647 }
1648
SetSecurityFlag(bool securityFlag)1649 void AppRunningRecord::SetSecurityFlag(bool securityFlag)
1650 {
1651 securityFlag_ = securityFlag;
1652 }
1653
GetSecurityFlag() const1654 bool AppRunningRecord::GetSecurityFlag() const
1655 {
1656 return securityFlag_;
1657 }
1658
SetKilling()1659 void AppRunningRecord::SetKilling()
1660 {
1661 isKilling_ = true;
1662 }
1663
IsKilling() const1664 bool AppRunningRecord::IsKilling() const
1665 {
1666 return isKilling_;
1667 }
1668
RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject> & token) const1669 void AppRunningRecord::RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject>& token) const
1670 {
1671 auto moduleRecord = GetModuleRunningRecordByToken(token);
1672 if (!moduleRecord) {
1673 HILOG_ERROR("can not find module record");
1674 return;
1675 }
1676 (void)moduleRecord->RemoveTerminateAbilityTimeoutTask(token);
1677 }
1678
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1679 int32_t AppRunningRecord::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback,
1680 const int32_t recordId)
1681 {
1682 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1683 HILOG_DEBUG("function called.");
1684 if (!appLifeCycleDeal_) {
1685 HILOG_ERROR("appLifeCycleDeal_ is null");
1686 return ERR_INVALID_VALUE;
1687 }
1688 return appLifeCycleDeal_->NotifyLoadRepairPatch(bundleName, callback, recordId);
1689 }
1690
NotifyHotReloadPage(const sptr<IQuickFixCallback> & callback,const int32_t recordId)1691 int32_t AppRunningRecord::NotifyHotReloadPage(const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1692 {
1693 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1694 HILOG_DEBUG("function called.");
1695 if (!appLifeCycleDeal_) {
1696 HILOG_ERROR("appLifeCycleDeal_ is null");
1697 return ERR_INVALID_VALUE;
1698 }
1699 return appLifeCycleDeal_->NotifyHotReloadPage(callback, recordId);
1700 }
1701
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1702 int32_t AppRunningRecord::NotifyUnLoadRepairPatch(const std::string &bundleName,
1703 const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1704 {
1705 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1706 HILOG_DEBUG("function called.");
1707 if (!appLifeCycleDeal_) {
1708 HILOG_ERROR("appLifeCycleDeal_ is null");
1709 return ERR_INVALID_VALUE;
1710 }
1711 return appLifeCycleDeal_->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
1712 }
1713
NotifyAppFault(const FaultData & faultData)1714 int32_t AppRunningRecord::NotifyAppFault(const FaultData &faultData)
1715 {
1716 HILOG_DEBUG("called.");
1717 if (!appLifeCycleDeal_) {
1718 HILOG_ERROR("appLifeCycleDeal_ is null");
1719 return ERR_INVALID_VALUE;
1720 }
1721 return appLifeCycleDeal_->NotifyAppFault(faultData);
1722 }
1723
IsAbilitytiesBackground()1724 bool AppRunningRecord::IsAbilitytiesBackground()
1725 {
1726 std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
1727 for (const auto &iter : hapModules_) {
1728 for (const auto &moduleRecord : iter.second) {
1729 if (moduleRecord == nullptr) {
1730 HILOG_ERROR("Module record is nullptr.");
1731 continue;
1732 }
1733 if (!moduleRecord->IsAbilitiesBackgrounded()) {
1734 return false;
1735 }
1736 }
1737 }
1738 return true;
1739 }
1740
OnWindowVisibilityChanged(const std::vector<sptr<OHOS::Rosen::WindowVisibilityInfo>> & windowVisibilityInfos)1741 void AppRunningRecord::OnWindowVisibilityChanged(
1742 const std::vector<sptr<OHOS::Rosen::WindowVisibilityInfo>> &windowVisibilityInfos)
1743 {
1744 HILOG_DEBUG("Called.");
1745 if (windowVisibilityInfos.empty()) {
1746 HILOG_WARN("Window visibility info is empty.");
1747 return;
1748 }
1749
1750 for (const auto &info : windowVisibilityInfos) {
1751 if (info == nullptr) {
1752 HILOG_ERROR("Window visibility info is nullptr.");
1753 continue;
1754 }
1755 if (info->pid_ != GetPriorityObject()->GetPid()) {
1756 continue;
1757 }
1758 auto iter = windowIds_.find(info->windowId_);
1759 if (iter != windowIds_.end() &&
1760 info->visibilityState_ == OHOS::Rosen::WindowVisibilityState::WINDOW_VISIBILITY_STATE_TOTALLY_OCCUSION) {
1761 windowIds_.erase(iter);
1762 continue;
1763 }
1764 if (iter == windowIds_.end() &&
1765 info->visibilityState_ < OHOS::Rosen::WindowVisibilityState::WINDOW_VISIBILITY_STATE_TOTALLY_OCCUSION) {
1766 windowIds_.emplace(info->windowId_);
1767 }
1768 }
1769
1770 bool isScheduleForeground = (!windowIds_.empty() && curState_ != ApplicationState::APP_STATE_FOREGROUND) ||
1771 (!windowIds_.empty() && curState_ == ApplicationState::APP_STATE_FOREGROUND &&
1772 pendingState_ == ApplicationPendingState::BACKGROUNDING);
1773 if (isScheduleForeground) {
1774 SetApplicationPendingState(ApplicationPendingState::FOREGROUNDING);
1775 SetUpdateStateFromService(true);
1776 ScheduleForegroundRunning();
1777 return;
1778 }
1779
1780 bool isScheduleBackground = (windowIds_.empty() && IsAbilitytiesBackground() &&
1781 curState_ == ApplicationState::APP_STATE_FOREGROUND) ||
1782 (windowIds_.empty() && IsAbilitytiesBackground() && curState_ == ApplicationState::APP_STATE_BACKGROUND &&
1783 pendingState_ == ApplicationPendingState::FOREGROUNDING);
1784 if (isScheduleBackground) {
1785 SetApplicationPendingState(ApplicationPendingState::BACKGROUNDING);
1786 SetUpdateStateFromService(true);
1787 ScheduleBackgroundRunning();
1788 }
1789 }
1790
IsContinuousTask()1791 bool AppRunningRecord::IsContinuousTask()
1792 {
1793 return isContinuousTask_;
1794 }
1795
SetContinuousTaskAppState(bool isContinuousTask)1796 void AppRunningRecord::SetContinuousTaskAppState(bool isContinuousTask)
1797 {
1798 isContinuousTask_ = isContinuousTask;
1799 }
1800
GetFocusFlag() const1801 bool AppRunningRecord::GetFocusFlag() const
1802 {
1803 return isFocused_;
1804 }
1805
GetAppStartTime() const1806 int64_t AppRunningRecord::GetAppStartTime() const
1807 {
1808 return startTimeMillis_;
1809 }
1810
SetRequestProcCode(int32_t requestProcCode)1811 void AppRunningRecord::SetRequestProcCode(int32_t requestProcCode)
1812 {
1813 requestProcCode_ = requestProcCode;
1814 }
1815
GetRequestProcCode() const1816 int32_t AppRunningRecord::GetRequestProcCode() const
1817 {
1818 return requestProcCode_;
1819 }
1820
SetProcessChangeReason(ProcessChangeReason reason)1821 void AppRunningRecord::SetProcessChangeReason(ProcessChangeReason reason)
1822 {
1823 processChangeReason_ = reason;
1824 }
1825
GetProcessChangeReason() const1826 ProcessChangeReason AppRunningRecord::GetProcessChangeReason() const
1827 {
1828 return processChangeReason_;
1829 }
1830
IsUpdateStateFromService()1831 bool AppRunningRecord::IsUpdateStateFromService()
1832 {
1833 return isUpdateStateFromService_;
1834 }
1835
SetUpdateStateFromService(bool isUpdateStateFromService)1836 void AppRunningRecord::SetUpdateStateFromService(bool isUpdateStateFromService)
1837 {
1838 isUpdateStateFromService_ = isUpdateStateFromService;
1839 }
1840
GetExtensionType() const1841 ExtensionAbilityType AppRunningRecord::GetExtensionType() const
1842 {
1843 return extensionType_;
1844 }
1845
GetProcessType() const1846 ProcessType AppRunningRecord::GetProcessType() const
1847 {
1848 return processType_;
1849 }
1850
ChangeAppGcState(const int32_t state)1851 int32_t AppRunningRecord::ChangeAppGcState(const int32_t state)
1852 {
1853 HILOG_DEBUG("called.");
1854 if (appLifeCycleDeal_ == nullptr) {
1855 HILOG_ERROR("appLifeCycleDeal_ is nullptr.");
1856 return ERR_INVALID_VALUE;
1857 }
1858 return appLifeCycleDeal_->ChangeAppGcState(state);
1859 }
1860
SetAttachDebug(const bool & isAttachDebug)1861 void AppRunningRecord::SetAttachDebug(const bool &isAttachDebug)
1862 {
1863 HILOG_DEBUG("Called.");
1864 isAttachDebug_ = isAttachDebug;
1865
1866 if (appLifeCycleDeal_ == nullptr) {
1867 HILOG_ERROR("appLifeCycleDeal_ is nullptr.");
1868 return;
1869 }
1870 isAttachDebug_ ? appLifeCycleDeal_->AttachAppDebug() : appLifeCycleDeal_->DetachAppDebug();
1871 }
1872
isAttachDebug() const1873 bool AppRunningRecord::isAttachDebug() const
1874 {
1875 return isAttachDebug_;
1876 }
1877
SetApplicationPendingState(ApplicationPendingState pendingState)1878 void AppRunningRecord::SetApplicationPendingState(ApplicationPendingState pendingState)
1879 {
1880 pendingState_ = pendingState;
1881 }
1882
GetApplicationPendingState() const1883 ApplicationPendingState AppRunningRecord::GetApplicationPendingState() const
1884 {
1885 return pendingState_;
1886 }
1887
AddChildProcessRecord(pid_t pid,const std::shared_ptr<ChildProcessRecord> record)1888 void AppRunningRecord::AddChildProcessRecord(pid_t pid, const std::shared_ptr<ChildProcessRecord> record)
1889 {
1890 if (!record) {
1891 HILOG_ERROR("record is null.");
1892 return;
1893 }
1894 if (pid <= 0) {
1895 HILOG_ERROR("pid <= 0.");
1896 return;
1897 }
1898 std::lock_guard lock(childProcessRecordMapLock_);
1899 childProcessRecordMap_.emplace(pid, record);
1900 }
1901
RemoveChildProcessRecord(const std::shared_ptr<ChildProcessRecord> record)1902 void AppRunningRecord::RemoveChildProcessRecord(const std::shared_ptr<ChildProcessRecord> record)
1903 {
1904 HILOG_INFO("pid: %{public}d", record->GetPid());
1905 if (!record) {
1906 HILOG_ERROR("record is null.");
1907 return;
1908 }
1909 auto pid = record->GetPid();
1910 if (pid <= 0) {
1911 HILOG_ERROR("record.pid <= 0.");
1912 return;
1913 }
1914 std::lock_guard lock(childProcessRecordMapLock_);
1915 childProcessRecordMap_.erase(pid);
1916 }
1917
GetChildProcessRecordByPid(const pid_t pid)1918 std::shared_ptr<ChildProcessRecord> AppRunningRecord::GetChildProcessRecordByPid(const pid_t pid)
1919 {
1920 std::lock_guard lock(childProcessRecordMapLock_);
1921 auto iter = childProcessRecordMap_.find(pid);
1922 if (iter == childProcessRecordMap_.end()) {
1923 return nullptr;
1924 }
1925 return iter->second;
1926 }
1927
GetChildProcessRecordMap()1928 std::map<int32_t, std::shared_ptr<ChildProcessRecord>> AppRunningRecord::GetChildProcessRecordMap()
1929 {
1930 std::lock_guard lock(childProcessRecordMapLock_);
1931 return childProcessRecordMap_;
1932 }
1933 } // namespace AppExecFwk
1934 } // namespace OHOS
1935