• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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