• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "app_running_record.h"
17 #include "app_mgr_service_inner.h"
18 #include "hitrace_meter.h"
19 #include "hilog_wrapper.h"
20 
21 namespace OHOS {
22 namespace AppExecFwk {
23 namespace {
24 static constexpr int64_t NANOSECONDS = 1000000000;  // NANOSECONDS mean 10^9 nano second
25 static constexpr int64_t MICROSECONDS = 1000000;    // MICROSECONDS mean 10^6 millias second
26 constexpr int32_t MAX_RESTART_COUNT = 3;
27 constexpr int32_t RESTART_INTERVAL_TIME = 120000;
28 }
29 
30 int64_t AppRunningRecord::appEventId_ = 0;
31 
RenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,const std::shared_ptr<AppRunningRecord> & host)32 RenderRecord::RenderRecord(pid_t hostPid, const std::string &renderParam,
33     int32_t ipcFd, int32_t sharedFd, const std::shared_ptr<AppRunningRecord> &host)
34     : hostPid_(hostPid), renderParam_(renderParam), ipcFd_(ipcFd), sharedFd_(sharedFd), host_(host)
35 {}
36 
~RenderRecord()37 RenderRecord::~RenderRecord()
38 {
39     close(sharedFd_);
40     close(ipcFd_);
41 }
42 
CreateRenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,const std::shared_ptr<AppRunningRecord> & host)43 std::shared_ptr<RenderRecord> RenderRecord::CreateRenderRecord(pid_t hostPid, const std::string &renderParam,
44     int32_t ipcFd, int32_t sharedFd, const std::shared_ptr<AppRunningRecord> &host)
45 {
46     if (hostPid <= 0 || renderParam.empty() || ipcFd <= 0 || sharedFd <= 0 || !host) {
47         return nullptr;
48     }
49 
50     auto renderRecord = std::make_shared<RenderRecord>(hostPid, renderParam, ipcFd, sharedFd, host);
51     renderRecord->SetHostUid(host->GetUid());
52     renderRecord->SetHostBundleName(host->GetBundleName());
53 
54     return renderRecord;
55 }
56 
SetPid(pid_t pid)57 void RenderRecord::SetPid(pid_t pid)
58 {
59     pid_ = pid;
60 }
61 
GetPid() const62 pid_t RenderRecord::GetPid() const
63 {
64     return pid_;
65 }
66 
GetHostPid() const67 pid_t RenderRecord::GetHostPid() const
68 {
69     return hostPid_;
70 }
71 
SetHostUid(const int32_t hostUid)72 void RenderRecord::SetHostUid(const int32_t hostUid)
73 {
74     hostUid_ = hostUid;
75 }
76 
GetHostUid() const77 int32_t RenderRecord::GetHostUid() const
78 {
79     return hostUid_;
80 }
81 
SetHostBundleName(const std::string & hostBundleName)82 void RenderRecord::SetHostBundleName(const std::string &hostBundleName)
83 {
84     hostBundleName_ = hostBundleName;
85 }
86 
GetHostBundleName() const87 std::string RenderRecord::GetHostBundleName() const
88 {
89     return hostBundleName_;
90 }
91 
GetRenderParam() const92 std::string RenderRecord::GetRenderParam() const
93 {
94     return renderParam_;
95 }
96 
GetIpcFd() const97 int32_t RenderRecord::GetIpcFd() const
98 {
99     return ipcFd_;
100 }
101 
GetSharedFd() const102 int32_t RenderRecord::GetSharedFd() const
103 {
104     return sharedFd_;
105 }
106 
GetHostRecord() const107 std::shared_ptr<AppRunningRecord> RenderRecord::GetHostRecord() const
108 {
109     return host_.lock();
110 }
111 
GetScheduler() const112 sptr<IRenderScheduler> RenderRecord::GetScheduler() const
113 {
114     return renderScheduler_;
115 }
116 
SetScheduler(const sptr<IRenderScheduler> & scheduler)117 void RenderRecord::SetScheduler(const sptr<IRenderScheduler> &scheduler)
118 {
119     renderScheduler_ = scheduler;
120 }
121 
SetDeathRecipient(const sptr<AppDeathRecipient> recipient)122 void RenderRecord::SetDeathRecipient(const sptr<AppDeathRecipient> recipient)
123 {
124     deathRecipient_ = recipient;
125 }
126 
RegisterDeathRecipient()127 void RenderRecord::RegisterDeathRecipient()
128 {
129     if (renderScheduler_ && deathRecipient_) {
130         auto obj = renderScheduler_->AsObject();
131         if (obj) {
132             obj->AddDeathRecipient(deathRecipient_);
133         }
134     }
135 }
136 
AppRunningRecord(const std::shared_ptr<ApplicationInfo> & info,const int32_t recordId,const std::string & processName)137 AppRunningRecord::AppRunningRecord(
138     const std::shared_ptr<ApplicationInfo> &info, const int32_t recordId, const std::string &processName)
139     : appRecordId_(recordId), processName_(processName)
140 {
141     if (info) {
142         appInfo_ = info;
143         mainBundleName_ = info->bundleName;
144         isLauncherApp_ = info->isLauncherApp;
145         mainAppName_ = info->name;
146     }
147 
148     struct timespec t;
149     t.tv_sec = 0;
150     t.tv_nsec = 0;
151     clock_gettime(CLOCK_MONOTONIC, &t);
152     startTimeMillis_ = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
153 }
154 
SetApplicationClient(const sptr<IAppScheduler> & thread)155 void AppRunningRecord::SetApplicationClient(const sptr<IAppScheduler> &thread)
156 {
157     if (!appLifeCycleDeal_) {
158         appLifeCycleDeal_ = std::make_shared<AppLifeCycleDeal>();
159     }
160     appLifeCycleDeal_->SetApplicationClient(thread);
161 
162     auto moduleRecordList = GetAllModuleRecord();
163     if (moduleRecordList.empty()) {
164         HILOG_ERROR("moduleRecordList is empty");
165         return;
166     }
167     for (const auto &moduleRecord : moduleRecordList) {
168         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
169     }
170 }
171 
GetBundleName() const172 const std::string &AppRunningRecord::GetBundleName() const
173 {
174     return mainBundleName_;
175 }
176 
IsLauncherApp() const177 bool AppRunningRecord::IsLauncherApp() const
178 {
179     return isLauncherApp_;
180 }
181 
GetRecordId() const182 int32_t AppRunningRecord::GetRecordId() const
183 {
184     return appRecordId_;
185 }
186 
GetName() const187 const std::string &AppRunningRecord::GetName() const
188 {
189     return mainAppName_;
190 }
191 
GetSignCode() const192 const std::string &AppRunningRecord::GetSignCode() const
193 {
194     return signCode_;
195 }
196 
SetSignCode(const std::string & signCode)197 void AppRunningRecord::SetSignCode(const std::string &signCode)
198 {
199     signCode_ = signCode;
200 }
201 
GetJointUserId() const202 const std::string &AppRunningRecord::GetJointUserId() const
203 {
204     return jointUserId_;
205 }
206 
SetJointUserId(const std::string & jointUserId)207 void AppRunningRecord::SetJointUserId(const std::string &jointUserId)
208 {
209     jointUserId_ = jointUserId;
210 }
211 
GetProcessName() const212 const std::string &AppRunningRecord::GetProcessName() const
213 {
214     return processName_;
215 }
216 
GetUid() const217 int32_t AppRunningRecord::GetUid() const
218 {
219     return mainUid_;
220 }
221 
SetUid(const int32_t uid)222 void AppRunningRecord::SetUid(const int32_t uid)
223 {
224     mainUid_ = uid;
225 }
226 
GetState() const227 ApplicationState AppRunningRecord::GetState() const
228 {
229     return curState_;
230 }
231 
SetState(const ApplicationState state)232 void AppRunningRecord::SetState(const ApplicationState state)
233 {
234     if (state >= ApplicationState::APP_STATE_END) {
235         HILOG_ERROR("Invalid application state");
236         return;
237     }
238     if (state == ApplicationState::APP_STATE_FOREGROUND || state == ApplicationState::APP_STATE_BACKGROUND) {
239         restartResidentProcCount_ = MAX_RESTART_COUNT;
240     }
241     curState_ = state;
242 }
243 
SetRestartTimeMillis(const int64_t restartTimeMillis)244 void AppRunningRecord::SetRestartTimeMillis(const int64_t restartTimeMillis)
245 {
246     restartTimeMillis_ = restartTimeMillis;
247 }
248 
GetAppInfoList()249 const std::list<std::shared_ptr<ApplicationInfo>> AppRunningRecord::GetAppInfoList()
250 {
251     std::list<std::shared_ptr<ApplicationInfo>> appInfoList;
252     std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
253     for (const auto &item : appInfos_) {
254         appInfoList.push_back(item.second);
255     }
256     return appInfoList;
257 }
258 
GetAbilities()259 const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> AppRunningRecord::GetAbilities()
260 {
261     std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilitysMap;
262     auto moduleRecordList = GetAllModuleRecord();
263     for (const auto &moduleRecord : moduleRecordList) {
264         auto abilities = moduleRecord->GetAbilities();
265         abilitysMap.insert(abilities.begin(), abilities.end());
266     }
267     return abilitysMap;
268 }
269 
GetApplicationClient() const270 sptr<IAppScheduler> AppRunningRecord::GetApplicationClient() const
271 {
272     return (appLifeCycleDeal_ ? appLifeCycleDeal_->GetApplicationClient() : nullptr);
273 }
274 
GetAbilityRunningRecord(const int64_t eventId) const275 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const
276 {
277     HILOG_INFO("Get ability running record by eventId.");
278     auto moduleRecordList = GetAllModuleRecord();
279     for (const auto &moduleRecord : moduleRecordList) {
280         auto abilityRecord = moduleRecord->GetAbilityRunningRecord(eventId);
281         if (abilityRecord) {
282             return abilityRecord;
283         }
284     }
285 
286     return nullptr;
287 }
288 
RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> & moduleRecord)289 void AppRunningRecord::RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> &moduleRecord)
290 {
291     HILOG_INFO("Remove module record.");
292 
293     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
294     for (auto &item : hapModules_) {
295         auto iter = std::find_if(item.second.begin(),
296             item.second.end(),
297             [&moduleRecord](const std::shared_ptr<ModuleRunningRecord> &record) { return moduleRecord == record; });
298         if (iter != item.second.end()) {
299             iter = item.second.erase(iter);
300             if (item.second.empty()) {
301                 {
302                     std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
303                     appInfos_.erase(item.first);
304                 }
305                 hapModules_.erase(item.first);
306             }
307             return;
308         }
309     }
310 }
311 
ForceKillApp(const std::string & reason) const312 void AppRunningRecord::ForceKillApp([[maybe_unused]] const std::string &reason) const
313 {}
314 
ScheduleAppCrash(const std::string & description) const315 void AppRunningRecord::ScheduleAppCrash([[maybe_unused]] const std::string &description) const
316 {}
317 
LaunchApplication(const Configuration & config)318 void AppRunningRecord::LaunchApplication(const Configuration &config)
319 {
320     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
321     if (appLifeCycleDeal_ == nullptr) {
322         HILOG_ERROR("appLifeCycleDeal_ is null");
323         return;
324     }
325     if (!appLifeCycleDeal_->GetApplicationClient()) {
326         HILOG_ERROR("appThread is null");
327         return;
328     }
329     AppLaunchData launchData;
330     {
331         std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
332         auto moduleRecords = appInfos_.find(mainBundleName_);
333         if (moduleRecords != appInfos_.end()) {
334             launchData.SetApplicationInfo(*(moduleRecords->second));
335         }
336     }
337     ProcessInfo processInfo(processName_, GetPriorityObject()->GetPid());
338     launchData.SetProcessInfo(processInfo);
339     launchData.SetRecordId(appRecordId_);
340     launchData.SetUId(mainUid_);
341     launchData.SetUserTestInfo(userTestRecord_);
342     launchData.SetAppIndex(appIndex_);
343     HILOG_INFO("Schedule launch application, app is %{public}s.", GetName().c_str());
344     appLifeCycleDeal_->LaunchApplication(launchData, config);
345 }
346 
UpdateApplicationInfoInstalled(const ApplicationInfo & appInfo)347 void AppRunningRecord::UpdateApplicationInfoInstalled(const ApplicationInfo &appInfo)
348 {
349     if (!isStageBasedModel_) {
350         HILOG_INFO("Current version than supports !");
351         return;
352     }
353 
354     if (appLifeCycleDeal_ == nullptr) {
355         HILOG_ERROR("appLifeCycleDeal_ is null");
356         return;
357     }
358     appLifeCycleDeal_->UpdateApplicationInfoInstalled(appInfo);
359 }
360 
AddAbilityStage()361 void AppRunningRecord::AddAbilityStage()
362 {
363     if (!isStageBasedModel_) {
364         HILOG_INFO("Current version than supports !");
365         return;
366     }
367     HapModuleInfo abilityStage;
368     if (GetTheModuleInfoNeedToUpdated(mainBundleName_, abilityStage)) {
369         SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG, AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
370         HILOG_INFO("Current Informed module : [%{public}s] | bundle : [%{public}s]",
371             abilityStage.moduleName.c_str(), mainBundleName_.c_str());
372         if (appLifeCycleDeal_ == nullptr) {
373             HILOG_WARN("appLifeCycleDeal_ is null");
374             return;
375         }
376         appLifeCycleDeal_->AddAbilityStage(abilityStage);
377     }
378 }
379 
AddAbilityStageBySpecifiedAbility(const std::string & bundleName)380 void AppRunningRecord::AddAbilityStageBySpecifiedAbility(const std::string &bundleName)
381 {
382     if (!eventHandler_) {
383         HILOG_ERROR("eventHandler_ is nullptr");
384         return;
385     }
386 
387     HapModuleInfo hapModuleInfo;
388     if (GetTheModuleInfoNeedToUpdated(bundleName, hapModuleInfo)) {
389         if (!eventHandler_->HasInnerEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG)) {
390             HILOG_INFO("%{public}s START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG is not exist.", __func__);
391             SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
392                 AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
393         }
394         if (appLifeCycleDeal_ == nullptr) {
395             HILOG_WARN("appLifeCycleDeal_ is null");
396             return;
397         }
398         appLifeCycleDeal_->AddAbilityStage(hapModuleInfo);
399     }
400 }
401 
AddAbilityStageDone()402 void AppRunningRecord::AddAbilityStageDone()
403 {
404     HILOG_INFO("Add ability stage done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
405         static_cast<int>(eventId_));
406 
407     if (!eventHandler_) {
408         HILOG_ERROR("eventHandler_ is nullptr");
409         return;
410     }
411 
412     if (eventHandler_->HasInnerEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG)) {
413         eventHandler_->RemoveEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG);
414     }
415 
416     if (eventHandler_->HasInnerEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG)) {
417         eventHandler_->RemoveEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG);
418     }
419     // Should proceed to the next notification
420 
421     if (isSpecifiedAbility_) {
422         ScheduleAcceptWant(moduleName_);
423         return;
424     }
425 
426     AddAbilityStage();
427 }
428 
LaunchAbility(const std::shared_ptr<AbilityRunningRecord> & ability)429 void AppRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningRecord> &ability)
430 {
431     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
432     if (appLifeCycleDeal_ == nullptr) {
433         HILOG_ERROR("appLifeCycleDeal_ is null");
434         return;
435     }
436     if (!ability || !ability->GetToken()) {
437         HILOG_ERROR("abilityRecord or abilityToken is nullptr.");
438         return;
439     }
440 
441     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
442     if (!moduleRecord) {
443         HILOG_ERROR("moduleRecord is nullptr");
444         return;
445     }
446 
447     moduleRecord->LaunchAbility(ability);
448 }
449 
ScheduleTerminate()450 void AppRunningRecord::ScheduleTerminate()
451 {
452     SendEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT);
453     if (appLifeCycleDeal_ == nullptr) {
454         HILOG_WARN("appLifeCycleDeal_ is null");
455         return;
456     }
457     appLifeCycleDeal_->ScheduleTerminate();
458 }
459 
LaunchPendingAbilities()460 void AppRunningRecord::LaunchPendingAbilities()
461 {
462     HILOG_INFO("Launch pending abilities.");
463 
464     auto moduleRecordList = GetAllModuleRecord();
465     if (moduleRecordList.empty()) {
466         HILOG_ERROR("moduleRecordList is empty");
467         return;
468     }
469     for (const auto &moduleRecord : moduleRecordList) {
470         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
471         moduleRecord->LaunchPendingAbilities();
472     }
473 }
ScheduleForegroundRunning()474 void AppRunningRecord::ScheduleForegroundRunning()
475 {
476     if (appLifeCycleDeal_) {
477         appLifeCycleDeal_->ScheduleForegroundRunning();
478     }
479 }
480 
ScheduleBackgroundRunning()481 void AppRunningRecord::ScheduleBackgroundRunning()
482 {
483     if (appLifeCycleDeal_) {
484         appLifeCycleDeal_->ScheduleBackgroundRunning();
485     }
486 }
487 
ScheduleProcessSecurityExit()488 void AppRunningRecord::ScheduleProcessSecurityExit()
489 {
490     if (appLifeCycleDeal_) {
491         appLifeCycleDeal_->ScheduleProcessSecurityExit();
492     }
493 }
494 
ScheduleTrimMemory()495 void AppRunningRecord::ScheduleTrimMemory()
496 {
497     if (appLifeCycleDeal_ && priorityObject_) {
498         appLifeCycleDeal_->ScheduleTrimMemory(priorityObject_->GetTimeLevel());
499     }
500 }
501 
ScheduleMemoryLevel(int32_t level)502 void AppRunningRecord::ScheduleMemoryLevel(int32_t level)
503 {
504     if (appLifeCycleDeal_) {
505         appLifeCycleDeal_->ScheduleMemoryLevel(level);
506     }
507 }
508 
LowMemoryWarning()509 void AppRunningRecord::LowMemoryWarning()
510 {
511     if (appLifeCycleDeal_) {
512         appLifeCycleDeal_->LowMemoryWarning();
513     }
514 }
515 
AddModules(const std::shared_ptr<ApplicationInfo> & appInfo,const std::vector<HapModuleInfo> & moduleInfos)516 void AppRunningRecord::AddModules(
517     const std::shared_ptr<ApplicationInfo> &appInfo, const std::vector<HapModuleInfo> &moduleInfos)
518 {
519     HILOG_INFO("Add modules");
520 
521     if (moduleInfos.empty()) {
522         HILOG_INFO("moduleInfos is empty.");
523         return;
524     }
525 
526     for (auto &iter : moduleInfos) {
527         AddModule(appInfo, nullptr, nullptr, iter, nullptr);
528     }
529 }
530 
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)531 void AppRunningRecord::AddModule(const std::shared_ptr<ApplicationInfo> &appInfo,
532     const std::shared_ptr<AbilityInfo> &abilityInfo, const sptr<IRemoteObject> &token,
533     const HapModuleInfo &hapModuleInfo, const std::shared_ptr<AAFwk::Want> &want)
534 {
535     HILOG_INFO("Add module.");
536 
537     if (!appInfo) {
538         HILOG_ERROR("appInfo is null");
539         return;
540     }
541 
542     std::shared_ptr<ModuleRunningRecord> moduleRecord;
543 
544     auto initModuleRecord = [=](const std::shared_ptr<ModuleRunningRecord> &moduleRecord) {
545         moduleRecord->Init(hapModuleInfo);
546         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
547         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
548     };
549 
550     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
551     const auto &iter = hapModules_.find(appInfo->bundleName);
552     if (iter != hapModules_.end()) {
553         moduleRecord = GetModuleRecordByModuleName(appInfo->bundleName, hapModuleInfo.moduleName);
554         if (!moduleRecord) {
555             moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
556             iter->second.push_back(moduleRecord);
557             initModuleRecord(moduleRecord);
558         }
559     } else {
560         moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
561         std::vector<std::shared_ptr<ModuleRunningRecord>> moduleList;
562         moduleList.push_back(moduleRecord);
563         hapModules_.emplace(appInfo->bundleName, moduleList);
564         {
565             std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
566             appInfos_.emplace(appInfo->bundleName, appInfo);
567         }
568         initModuleRecord(moduleRecord);
569     }
570 
571     if (!abilityInfo || !token) {
572         HILOG_ERROR("abilityInfo or token is nullptr");
573         return;
574     }
575     moduleRecord->AddAbility(token, abilityInfo, want);
576 
577     return;
578 }
579 
GetModuleRecordByModuleName(const std::string bundleName,const std::string & moduleName)580 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRecordByModuleName(
581     const std::string bundleName, const std::string &moduleName)
582 {
583     HILOG_INFO("Get module record by module name.");
584     auto moduleRecords = hapModules_.find(bundleName);
585     if (moduleRecords != hapModules_.end()) {
586         for (auto &iter : moduleRecords->second) {
587             if (iter->GetModuleName() == moduleName) {
588                 return iter;
589             }
590         }
591     }
592 
593     return nullptr;
594 }
595 
StateChangedNotifyObserver(const std::shared_ptr<AbilityRunningRecord> & ability,const int32_t state,bool isAbility)596 void AppRunningRecord::StateChangedNotifyObserver(
597     const std::shared_ptr<AbilityRunningRecord> &ability, const int32_t state, bool isAbility)
598 {
599     if (!ability || ability->GetAbilityInfo() == nullptr) {
600         HILOG_ERROR("ability is null");
601         return;
602     }
603     AbilityStateData abilityStateData;
604     abilityStateData.bundleName = ability->GetAbilityInfo()->applicationInfo.bundleName;
605     abilityStateData.moduleName = ability->GetAbilityInfo()->moduleName;
606     abilityStateData.abilityName = ability->GetName();
607     abilityStateData.pid = GetPriorityObject()->GetPid();
608     abilityStateData.abilityState = state;
609     abilityStateData.uid = ability->GetAbilityInfo()->applicationInfo.uid;
610     abilityStateData.token = ability->GetToken();
611     abilityStateData.abilityType = static_cast<int32_t>(ability->GetAbilityInfo()->type);
612     abilityStateData.isFocused = ability->GetFocusFlag();
613 
614     if (isAbility && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
615         HILOG_INFO("extension type, not notify any more.");
616         return;
617     }
618     auto serviceInner = appMgrServiceInner_.lock();
619     if (serviceInner) {
620         serviceInner->StateChangedNotifyObserver(abilityStateData, isAbility);
621     }
622 }
623 
GetModuleRunningRecordByToken(const sptr<IRemoteObject> & token) const624 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByToken(
625     const sptr<IRemoteObject> &token) const
626 {
627     if (!token) {
628         HILOG_ERROR("token is null");
629         return nullptr;
630     }
631 
632     auto moduleRecordList = GetAllModuleRecord();
633     for (const auto &moduleRecord : moduleRecordList) {
634         if (moduleRecord && moduleRecord->GetAbilityRunningRecordByToken(token)) {
635             return moduleRecord;
636         }
637     }
638 
639     return nullptr;
640 }
641 
GetModuleRunningRecordByTerminateLists(const sptr<IRemoteObject> & token) const642 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByTerminateLists(
643     const sptr<IRemoteObject> &token) const
644 {
645     if (!token) {
646         HILOG_ERROR("token is null");
647         return nullptr;
648     }
649 
650     auto moduleRecordList = GetAllModuleRecord();
651     for (const auto &moduleRecord : moduleRecordList) {
652         if (moduleRecord && moduleRecord->GetAbilityByTerminateLists(token)) {
653             return moduleRecord;
654         }
655     }
656 
657     return nullptr;
658 }
659 
GetAbilityRunningRecordByToken(const sptr<IRemoteObject> & token) const660 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecordByToken(
661     const sptr<IRemoteObject> &token) const
662 {
663     auto moduleRecord = GetModuleRunningRecordByToken(token);
664     if (!moduleRecord) {
665         return nullptr;
666     }
667     return moduleRecord->GetAbilityRunningRecordByToken(token);
668 }
669 
GetAbilityByTerminateLists(const sptr<IRemoteObject> & token) const670 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityByTerminateLists(
671     const sptr<IRemoteObject> &token) const
672 {
673     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
674     if (!moduleRecord) {
675         return nullptr;
676     }
677     return moduleRecord->GetAbilityByTerminateLists(token);
678 }
679 
UpdateAbilityFocusState(const sptr<IRemoteObject> & token,bool isFocus)680 bool AppRunningRecord::UpdateAbilityFocusState(const sptr<IRemoteObject> &token, bool isFocus)
681 {
682     HILOG_INFO("focus state is :%{public}d", isFocus);
683     auto abilityRecord = GetAbilityRunningRecordByToken(token);
684     if (!abilityRecord) {
685         HILOG_ERROR("can not find ability record");
686         return false;
687     }
688 
689     bool lastFocusState = abilityRecord->GetFocusFlag();
690     if (lastFocusState == isFocus) {
691         HILOG_ERROR("focus state not change, no need update");
692         return false;
693     }
694 
695     if (isFocus) {
696         return AbilityFocused(abilityRecord);
697     } else {
698         return AbilityUnfocused(abilityRecord);
699     }
700 }
701 
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)702 void AppRunningRecord::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
703 {
704     HILOG_INFO("state is :%{public}d", static_cast<int32_t>(state));
705     auto abilityRecord = GetAbilityRunningRecordByToken(token);
706     if (!abilityRecord) {
707         HILOG_ERROR("can not find ability record");
708         return;
709     }
710     if (state == abilityRecord->GetState()) {
711         HILOG_ERROR("current state is already, no need update");
712         return;
713     }
714 
715     if (state == AbilityState::ABILITY_STATE_FOREGROUND) {
716         AbilityForeground(abilityRecord);
717     } else if (state == AbilityState::ABILITY_STATE_BACKGROUND) {
718         AbilityBackground(abilityRecord);
719     } else {
720         HILOG_WARN("wrong state");
721     }
722 }
723 
AbilityForeground(const std::shared_ptr<AbilityRunningRecord> & ability)724 void AppRunningRecord::AbilityForeground(const std::shared_ptr<AbilityRunningRecord> &ability)
725 {
726     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
727     if (!ability) {
728         HILOG_ERROR("ability is null");
729         return;
730     }
731     AbilityState curAbilityState = ability->GetState();
732     if (curAbilityState != AbilityState::ABILITY_STATE_READY &&
733         curAbilityState != AbilityState::ABILITY_STATE_BACKGROUND) {
734         HILOG_ERROR("ability state(%{public}d) error", static_cast<int32_t>(curAbilityState));
735         return;
736     }
737 
738     // We need schedule application to foregrounded when current application state is ready or background running.
739     if (curState_ == ApplicationState::APP_STATE_READY || curState_ == ApplicationState::APP_STATE_BACKGROUND) {
740         if (foregroundingAbilityTokens_.empty()) {
741             ScheduleForegroundRunning();
742         }
743         foregroundingAbilityTokens_.push_back(ability->GetToken());
744         return;
745     } else if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
746         // Just change ability to foreground if current application state is foreground or focus.
747         auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
748         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
749         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
750         auto serviceInner = appMgrServiceInner_.lock();
751         if (serviceInner) {
752             serviceInner->OnAppStateChanged(shared_from_this(), curState_, false);
753         }
754     } else {
755         HILOG_WARN("wrong application state");
756     }
757 }
758 
AbilityBackground(const std::shared_ptr<AbilityRunningRecord> & ability)759 void AppRunningRecord::AbilityBackground(const std::shared_ptr<AbilityRunningRecord> &ability)
760 {
761     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
762     if (!ability) {
763         HILOG_ERROR("ability is null");
764         return;
765     }
766     if (ability->GetState() != AbilityState::ABILITY_STATE_FOREGROUND &&
767         ability->GetState() != AbilityState::ABILITY_STATE_READY) {
768         HILOG_ERROR("ability state is not foreground or focus");
769         return;
770     }
771 
772     // First change ability to background.
773     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
774     moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_BACKGROUND);
775     StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_BACKGROUND), true);
776     if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
777         int32_t foregroundSize = 0;
778         auto abilitiesMap = GetAbilities();
779         for (const auto &item : abilitiesMap) {
780             const auto &abilityRecord = item.second;
781             if (abilityRecord && abilityRecord->GetState() == AbilityState::ABILITY_STATE_FOREGROUND &&
782                 abilityRecord->GetAbilityInfo() &&
783                 abilityRecord->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) {
784                 foregroundSize++;
785                 break;
786             }
787         }
788 
789         // Then schedule application background when all ability is not foreground.
790         if (foregroundSize == 0) {
791             ScheduleBackgroundRunning();
792         }
793     } else {
794         HILOG_WARN("wrong application state");
795     }
796 }
797 
AbilityFocused(const std::shared_ptr<AbilityRunningRecord> & ability)798 bool AppRunningRecord::AbilityFocused(const std::shared_ptr<AbilityRunningRecord> &ability)
799 {
800     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
801     if (!ability) {
802         HILOG_ERROR("ability is null");
803         return false;
804     }
805     ability->UpdateFocusState(true);
806 
807     // update ability state
808     int32_t abilityState = static_cast<int32_t>(ability->GetState());
809     bool isAbility = true;
810     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
811         isAbility = false;
812     }
813     StateChangedNotifyObserver(ability, abilityState, isAbility);
814 
815     if (isFocused_) {
816         // process state is already focused, no need update process state.
817         return false;
818     }
819 
820     // update process focus state to true.
821     isFocused_ = true;
822     return true;
823 }
824 
AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> & ability)825 bool AppRunningRecord::AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> &ability)
826 {
827     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
828     if (!ability) {
829         HILOG_ERROR("ability is null");
830         return false;
831     }
832     ability->UpdateFocusState(false);
833 
834     // update ability state to unfocused.
835     int32_t abilityState = static_cast<int32_t>(ability->GetState());
836     bool isAbility = true;
837     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
838         isAbility = false;
839     }
840     StateChangedNotifyObserver(ability, abilityState, isAbility);
841 
842     if (!isFocused_) {
843         return false; // invalid process focus state, already unfocused, process state not change.
844     }
845 
846     bool changeProcessToUnfocused = true;
847     auto abilitysMap = GetAbilities();
848     for (const auto &item : abilitysMap) {
849         const auto &abilityRecord = item.second;
850         if (abilityRecord && abilityRecord->GetFocusFlag()) {
851             changeProcessToUnfocused = false;
852             break;
853         }
854     }
855 
856     if (changeProcessToUnfocused) {
857         isFocused_ = false; // process focus state : from focus to unfocus.
858     }
859     return changeProcessToUnfocused;
860 }
861 
PopForegroundingAbilityTokens()862 void AppRunningRecord::PopForegroundingAbilityTokens()
863 {
864     while (!foregroundingAbilityTokens_.empty()) {
865         const auto &token = foregroundingAbilityTokens_.front();
866         auto ability = GetAbilityRunningRecordByToken(token);
867         auto moduleRecord = GetModuleRunningRecordByToken(token);
868         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
869         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
870         foregroundingAbilityTokens_.pop_front();
871     }
872 }
873 
TerminateAbility(const sptr<IRemoteObject> & token,const bool isForce)874 void AppRunningRecord::TerminateAbility(const sptr<IRemoteObject> &token, const bool isForce)
875 {
876     HILOG_INFO("Terminate ability, isForce: %{public}d", static_cast<int>(isForce));
877 
878     auto moduleRecord = GetModuleRunningRecordByToken(token);
879     if (!moduleRecord) {
880         HILOG_ERROR("can not find module record");
881         return;
882     }
883 
884     auto abilityRecord = GetAbilityRunningRecordByToken(token);
885     StateChangedNotifyObserver(abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_TERMINATED), true);
886     moduleRecord->TerminateAbility(shared_from_this(), token, isForce);
887 }
888 
AbilityTerminated(const sptr<IRemoteObject> & token)889 void AppRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
890 {
891     HILOG_INFO("AbilityTerminated come.");
892     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
893     if (!moduleRecord) {
894         HILOG_ERROR("AbilityTerminated error, can not find module record");
895         return;
896     }
897     moduleRecord->AbilityTerminated(token);
898 
899     if (moduleRecord->GetAbilities().empty() && !IsKeepAliveApp()) {
900         RemoveModuleRecord(moduleRecord);
901     }
902 
903     auto moduleRecordList = GetAllModuleRecord();
904     if (moduleRecordList.empty() && !IsKeepAliveApp()) {
905         ScheduleTerminate();
906     }
907 }
908 
GetAllModuleRecord() const909 std::list<std::shared_ptr<ModuleRunningRecord>> AppRunningRecord::GetAllModuleRecord() const
910 {
911     std::list<std::shared_ptr<ModuleRunningRecord>> moduleRecordList;
912     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
913     for (const auto &item : hapModules_) {
914         for (const auto &list : item.second) {
915             moduleRecordList.push_back(list);
916         }
917     }
918     return moduleRecordList;
919 }
920 
RegisterAppDeathRecipient() const921 void AppRunningRecord::RegisterAppDeathRecipient() const
922 {
923     if (appLifeCycleDeal_ == nullptr) {
924         HILOG_ERROR("appLifeCycleDeal_ is null");
925         return;
926     }
927     if (!appLifeCycleDeal_->GetApplicationClient()) {
928         HILOG_ERROR("appThread is nullptr");
929         return;
930     }
931     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
932     if (object) {
933         object->AddDeathRecipient(appDeathRecipient_);
934     }
935 }
936 
RemoveAppDeathRecipient() const937 void AppRunningRecord::RemoveAppDeathRecipient() const
938 {
939     if (appLifeCycleDeal_ == nullptr) {
940         HILOG_ERROR("appLifeCycleDeal_ is null");
941         return;
942     }
943     if (!appLifeCycleDeal_->GetApplicationClient()) {
944         HILOG_ERROR("appThread is nullptr.");
945         return;
946     }
947     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
948     if (object) {
949         object->RemoveDeathRecipient(appDeathRecipient_);
950     }
951 }
952 
SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> & inner)953 void AppRunningRecord::SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> &inner)
954 {
955     appMgrServiceInner_ = inner;
956 
957     auto moduleRecordList = GetAllModuleRecord();
958     if (moduleRecordList.empty()) {
959         HILOG_ERROR("moduleRecordList is empty");
960         return;
961     }
962 
963     for (const auto &moduleRecord : moduleRecordList) {
964         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
965     }
966 }
967 
SetAppDeathRecipient(const sptr<AppDeathRecipient> & appDeathRecipient)968 void AppRunningRecord::SetAppDeathRecipient(const sptr<AppDeathRecipient> &appDeathRecipient)
969 {
970     appDeathRecipient_ = appDeathRecipient;
971 }
972 
GetPriorityObject()973 std::shared_ptr<PriorityObject> AppRunningRecord::GetPriorityObject()
974 {
975     if (!priorityObject_) {
976         priorityObject_ = std::make_shared<PriorityObject>();
977     }
978 
979     return priorityObject_;
980 }
981 
SendEventForSpecifiedAbility(uint32_t msg,int64_t timeOut)982 void AppRunningRecord::SendEventForSpecifiedAbility(uint32_t msg, int64_t timeOut)
983 {
984     SendEvent(msg, timeOut);
985 }
986 
SendEvent(uint32_t msg,int64_t timeOut)987 void AppRunningRecord::SendEvent(uint32_t msg, int64_t timeOut)
988 {
989     if (!eventHandler_) {
990         HILOG_ERROR("eventHandler_ is nullptr");
991         return;
992     }
993 
994     if (isDebugApp_) {
995         HILOG_INFO("Is debug mode, no need to handle time out.");
996         return;
997     }
998 
999     appEventId_++;
1000     eventId_ = appEventId_;
1001     HILOG_INFO("eventId %{public}d", static_cast<int>(eventId_));
1002     eventHandler_->SendEvent(msg, appEventId_, timeOut);
1003 }
1004 
PostTask(std::string msg,int64_t timeOut,const Closure & task)1005 void AppRunningRecord::PostTask(std::string msg, int64_t timeOut, const Closure &task)
1006 {
1007     if (!eventHandler_) {
1008         HILOG_ERROR("eventHandler_ is nullptr");
1009         return;
1010     }
1011     eventHandler_->PostTask(task, msg, timeOut);
1012 }
1013 
GetEventId() const1014 int64_t AppRunningRecord::GetEventId() const
1015 {
1016     return eventId_;
1017 }
1018 
SetEventHandler(const std::shared_ptr<AMSEventHandler> & handler)1019 void AppRunningRecord::SetEventHandler(const std::shared_ptr<AMSEventHandler> &handler)
1020 {
1021     eventHandler_ = handler;
1022 }
1023 
IsLastAbilityRecord(const sptr<IRemoteObject> & token)1024 bool AppRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
1025 {
1026     auto moduleRecord = GetModuleRunningRecordByToken(token);
1027     if (!moduleRecord) {
1028         HILOG_ERROR("can not find module record");
1029         return false;
1030     }
1031 
1032     auto moduleRecordList = GetAllModuleRecord();
1033     if (moduleRecordList.size() == 1) {
1034         return moduleRecord->IsLastAbilityRecord(token);
1035     }
1036 
1037     return false;
1038 }
1039 
IsLastPageAbilityRecord(const sptr<IRemoteObject> & token)1040 bool AppRunningRecord::IsLastPageAbilityRecord(const sptr<IRemoteObject> &token)
1041 {
1042     auto moduleRecord = GetModuleRunningRecordByToken(token);
1043     if (!moduleRecord) {
1044         HILOG_ERROR("can not find module record");
1045         return false;
1046     }
1047 
1048     int32_t pageAbilitySize = 0;
1049     auto moduleRecordList = GetAllModuleRecord();
1050     for (auto moduleRecord : moduleRecordList) {
1051         pageAbilitySize += moduleRecord->GetPageAbilitySize() ;
1052         if (pageAbilitySize > 1) {
1053             return false;
1054         }
1055     }
1056 
1057     return pageAbilitySize == 1;
1058 }
1059 
SetTerminating()1060 void AppRunningRecord::SetTerminating()
1061 {
1062     isTerminating = true;
1063 }
1064 
IsTerminating()1065 bool AppRunningRecord::IsTerminating()
1066 {
1067     return isTerminating;
1068 }
1069 
IsKeepAliveApp() const1070 bool AppRunningRecord::IsKeepAliveApp() const
1071 {
1072     return isKeepAliveApp_;
1073 }
1074 
IsEmptyKeepAliveApp() const1075 bool AppRunningRecord::IsEmptyKeepAliveApp() const
1076 {
1077     return isEmptyKeepAliveApp_;
1078 }
1079 
SetKeepAliveAppState(bool isKeepAlive,bool isEmptyKeepAliveApp)1080 void AppRunningRecord::SetKeepAliveAppState(bool isKeepAlive, bool isEmptyKeepAliveApp)
1081 {
1082     isKeepAliveApp_ = isKeepAlive;
1083     isEmptyKeepAliveApp_ = isEmptyKeepAliveApp;
1084 }
1085 
SetStageModelState(bool isStageBasedModel)1086 void AppRunningRecord::SetStageModelState(bool isStageBasedModel)
1087 {
1088     isStageBasedModel_ = isStageBasedModel;
1089 }
1090 
GetTheModuleInfoNeedToUpdated(const std::string bundleName,HapModuleInfo & info)1091 bool AppRunningRecord::GetTheModuleInfoNeedToUpdated(const std::string bundleName, HapModuleInfo &info)
1092 {
1093     bool result = false;
1094     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
1095     auto moduleInfoVectorIter = hapModules_.find(bundleName);
1096     if (moduleInfoVectorIter == hapModules_.end() || moduleInfoVectorIter->second.empty()) {
1097         return result;
1098     }
1099     std::string moduleName = moduleName_;
1100     auto findCondition = [moduleName](const std::shared_ptr<ModuleRunningRecord> &record) {
1101         if (record) {
1102             return (moduleName.empty() || (moduleName == record->GetModuleName())) &&
1103                 (record->GetModuleRecordState() == ModuleRecordState::INITIALIZED_STATE);
1104         }
1105         return false;
1106     };
1107     auto moduleRecordIter =
1108         std::find_if(moduleInfoVectorIter->second.begin(), moduleInfoVectorIter->second.end(), findCondition);
1109     if (moduleRecordIter != moduleInfoVectorIter->second.end()) {
1110         (*moduleRecordIter)->GetHapModuleInfo(info);
1111         (*moduleRecordIter)->SetModuleRecordState(ModuleRecordState::RUNNING_STATE);
1112         result = true;
1113     }
1114 
1115     return result;
1116 }
1117 
SetRestartResidentProcCount(int count)1118 void AppRunningRecord::SetRestartResidentProcCount(int count)
1119 {
1120     restartResidentProcCount_ = count;
1121 }
1122 
DecRestartResidentProcCount()1123 void AppRunningRecord::DecRestartResidentProcCount()
1124 {
1125     restartResidentProcCount_--;
1126 }
1127 
GetRestartResidentProcCount() const1128 int AppRunningRecord::GetRestartResidentProcCount() const
1129 {
1130     return restartResidentProcCount_;
1131 }
1132 
CanRestartResidentProc()1133 bool AppRunningRecord::CanRestartResidentProc()
1134 {
1135     struct timespec t;
1136     t.tv_sec = 0;
1137     t.tv_nsec = 0;
1138     clock_gettime(CLOCK_MONOTONIC, &t);
1139     int64_t systemTimeMillis = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
1140     if ((restartResidentProcCount_ >= 0) || ((systemTimeMillis - restartTimeMillis_) > RESTART_INTERVAL_TIME)) {
1141         return true;
1142     }
1143     return false;
1144 }
1145 
GetBundleNames(std::vector<std::string> & bundleNames)1146 void AppRunningRecord::GetBundleNames(std::vector<std::string> &bundleNames)
1147 {
1148     std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
1149     for (auto &app : appInfos_) {
1150         bundleNames.emplace_back(app.first);
1151     }
1152 }
1153 
SetUserTestInfo(const std::shared_ptr<UserTestRecord> & record)1154 void AppRunningRecord::SetUserTestInfo(const std::shared_ptr<UserTestRecord> &record)
1155 {
1156     userTestRecord_ = record;
1157 }
1158 
GetUserTestInfo()1159 std::shared_ptr<UserTestRecord> AppRunningRecord::GetUserTestInfo()
1160 {
1161     return userTestRecord_;
1162 }
1163 
SetSpecifiedAbilityFlagAndWant(const bool flag,const AAFwk::Want & want,const std::string & moduleName)1164 void AppRunningRecord::SetSpecifiedAbilityFlagAndWant(
1165     const bool flag, const AAFwk::Want &want, const std::string &moduleName)
1166 {
1167     isSpecifiedAbility_ = flag;
1168     SpecifiedWant_ = want;
1169     moduleName_ = moduleName;
1170 }
1171 
IsStartSpecifiedAbility() const1172 bool AppRunningRecord::IsStartSpecifiedAbility() const
1173 {
1174     return isSpecifiedAbility_;
1175 }
1176 
ScheduleAcceptWant(const std::string & moduleName)1177 void AppRunningRecord::ScheduleAcceptWant(const std::string &moduleName)
1178 {
1179     SendEvent(
1180         AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT);
1181     if (appLifeCycleDeal_ == nullptr) {
1182         HILOG_WARN("appLifeCycleDeal_ is null");
1183         return;
1184     }
1185     appLifeCycleDeal_->ScheduleAcceptWant(SpecifiedWant_, moduleName);
1186 }
1187 
ScheduleAcceptWantDone()1188 void AppRunningRecord::ScheduleAcceptWantDone()
1189 {
1190     HILOG_INFO("Schedule accept want done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1191         static_cast<int>(eventId_));
1192 
1193     if (!eventHandler_) {
1194         HILOG_ERROR("eventHandler_ is nullptr");
1195         return;
1196     }
1197 
1198     eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, eventId_);
1199 }
1200 
ApplicationTerminated()1201 void AppRunningRecord::ApplicationTerminated()
1202 {
1203     HILOG_DEBUG("Application terminated bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1204         static_cast<int>(eventId_));
1205 
1206     if (!eventHandler_) {
1207         HILOG_ERROR("eventHandler_ is nullptr");
1208         return;
1209     }
1210 
1211     eventHandler_->RemoveEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, eventId_);
1212 }
1213 
GetSpecifiedWant() const1214 const AAFwk::Want &AppRunningRecord::GetSpecifiedWant() const
1215 {
1216     return SpecifiedWant_;
1217 }
1218 
UpdateConfiguration(const Configuration & config)1219 int32_t AppRunningRecord::UpdateConfiguration(const Configuration &config)
1220 {
1221     HILOG_INFO("call %{public}s", __func__);
1222     if (!appLifeCycleDeal_) {
1223         HILOG_INFO("appLifeCycleDeal_ is null");
1224         return ERR_INVALID_VALUE;
1225     }
1226     return appLifeCycleDeal_->UpdateConfiguration(config);
1227 }
1228 
SetRenderRecord(const std::shared_ptr<RenderRecord> & record)1229 void AppRunningRecord::SetRenderRecord(const std::shared_ptr<RenderRecord> &record)
1230 {
1231     renderRecord_ = record;
1232 }
1233 
GetRenderRecord()1234 std::shared_ptr<RenderRecord> AppRunningRecord::GetRenderRecord()
1235 {
1236     return renderRecord_;
1237 }
1238 
SetStartMsg(const AppSpawnStartMsg & msg)1239 void AppRunningRecord::SetStartMsg(const AppSpawnStartMsg &msg)
1240 {
1241     startMsg_ = msg;
1242 }
1243 
GetStartMsg()1244 AppSpawnStartMsg AppRunningRecord::GetStartMsg()
1245 {
1246     return startMsg_;
1247 }
1248 
SetDebugApp(bool isDebugApp)1249 void AppRunningRecord::SetDebugApp(bool isDebugApp)
1250 {
1251     HILOG_INFO("SetDebugApp come, value is %{public}d", isDebugApp);
1252     isDebugApp_ = isDebugApp;
1253 }
1254 
IsDebugApp()1255 bool AppRunningRecord::IsDebugApp()
1256 {
1257     return isDebugApp_;
1258 }
1259 
SetAppIndex(const int32_t appIndex)1260 void AppRunningRecord::SetAppIndex(const int32_t appIndex)
1261 {
1262     appIndex_ = appIndex;
1263 }
1264 
GetAppIndex() const1265 int32_t AppRunningRecord::GetAppIndex() const
1266 {
1267     return appIndex_;
1268 }
1269 
SetSecurityFlag(bool securityFlag)1270 void AppRunningRecord::SetSecurityFlag(bool securityFlag)
1271 {
1272     securityFlag_ = securityFlag;
1273 }
1274 
GetSecurityFlag() const1275 bool AppRunningRecord::GetSecurityFlag() const
1276 {
1277     return securityFlag_;
1278 }
1279 
SetKilling()1280 void AppRunningRecord::SetKilling()
1281 {
1282     isKilling_ = true;
1283 }
1284 
IsKilling() const1285 bool AppRunningRecord::IsKilling() const
1286 {
1287     return isKilling_;
1288 }
1289 
RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject> & token) const1290 void AppRunningRecord::RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject>& token) const
1291 {
1292     auto moduleRecord = GetModuleRunningRecordByToken(token);
1293     if (!moduleRecord) {
1294         HILOG_ERROR("can not find module record");
1295         return;
1296     }
1297     (void)moduleRecord->RemoveTerminateAbilityTimeoutTask(token);
1298 }
1299 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1300 int32_t AppRunningRecord::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback,
1301     const int32_t recordId)
1302 {
1303     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1304     HILOG_DEBUG("function called.");
1305     if (!appLifeCycleDeal_) {
1306         HILOG_ERROR("appLifeCycleDeal_ is null");
1307         return ERR_INVALID_VALUE;
1308     }
1309     return appLifeCycleDeal_->NotifyLoadRepairPatch(bundleName, callback, recordId);
1310 }
1311 
NotifyHotReloadPage(const sptr<IQuickFixCallback> & callback,const int32_t recordId)1312 int32_t AppRunningRecord::NotifyHotReloadPage(const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1313 {
1314     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1315     HILOG_DEBUG("function called.");
1316     if (!appLifeCycleDeal_) {
1317         HILOG_ERROR("appLifeCycleDeal_ is null");
1318         return ERR_INVALID_VALUE;
1319     }
1320     return appLifeCycleDeal_->NotifyHotReloadPage(callback, recordId);
1321 }
1322 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1323 int32_t AppRunningRecord::NotifyUnLoadRepairPatch(const std::string &bundleName,
1324     const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1325 {
1326     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1327     HILOG_DEBUG("function called.");
1328     if (!appLifeCycleDeal_) {
1329         HILOG_ERROR("appLifeCycleDeal_ is null");
1330         return ERR_INVALID_VALUE;
1331     }
1332     return appLifeCycleDeal_->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
1333 }
1334 
IsContinuousTask()1335 bool AppRunningRecord::IsContinuousTask()
1336 {
1337     return isContinuousTask_;
1338 }
1339 
SetContinuousTaskAppState(bool isContinuousTask)1340 void AppRunningRecord::SetContinuousTaskAppState(bool isContinuousTask)
1341 {
1342     isContinuousTask_ = isContinuousTask;
1343 }
1344 
GetFocusFlag() const1345 bool AppRunningRecord::GetFocusFlag() const
1346 {
1347     return isFocused_;
1348 }
1349 
GetAppStartTime() const1350 int64_t AppRunningRecord::GetAppStartTime() const
1351 {
1352     return startTimeMillis_;
1353 }
1354 
SetRequestProcCode(int32_t requestProcCode)1355 void AppRunningRecord::SetRequestProcCode(int32_t requestProcCode)
1356 {
1357     requestProcCode_ = requestProcCode;
1358 }
1359 
GetRequestProcCode() const1360 int32_t AppRunningRecord::GetRequestProcCode() const
1361 {
1362     return requestProcCode_;
1363 }
1364 
SetProcessChangeReason(ProcessChangeReason reason)1365 void AppRunningRecord::SetProcessChangeReason(ProcessChangeReason reason)
1366 {
1367     processChangeReason_ = reason;
1368 }
1369 
GetProcessChangeReason() const1370 ProcessChangeReason AppRunningRecord::GetProcessChangeReason() const
1371 {
1372     return processChangeReason_;
1373 }
1374 }  // namespace AppExecFwk
1375 }  // namespace OHOS
1376