• 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         HILOG_ERROR("ability state is not foreground or focus");
768         return;
769     }
770 
771     // First change ability to backgrounded.
772     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
773     moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_BACKGROUND);
774     StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_BACKGROUND), true);
775     if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
776         int32_t foregroundSize = 0;
777         auto abilitiesMap = GetAbilities();
778         for (const auto &item : abilitiesMap) {
779             const auto &abilityRecord = item.second;
780             if (abilityRecord && abilityRecord->GetState() == AbilityState::ABILITY_STATE_FOREGROUND &&
781                 abilityRecord->GetAbilityInfo() &&
782                 abilityRecord->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE) {
783                 foregroundSize++;
784                 break;
785             }
786         }
787 
788         // Then schedule application background when all ability is not foreground.
789         if (foregroundSize == 0) {
790             ScheduleBackgroundRunning();
791         }
792     } else {
793         HILOG_WARN("wrong application state");
794     }
795 }
796 
AbilityFocused(const std::shared_ptr<AbilityRunningRecord> & ability)797 bool AppRunningRecord::AbilityFocused(const std::shared_ptr<AbilityRunningRecord> &ability)
798 {
799     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
800     if (!ability) {
801         HILOG_ERROR("ability is null");
802         return false;
803     }
804     ability->UpdateFocusState(true);
805 
806     // update ability state
807     int32_t abilityState = static_cast<int32_t>(ability->GetState());
808     bool isAbility = true;
809     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
810         isAbility = false;
811     }
812     StateChangedNotifyObserver(ability, abilityState, isAbility);
813 
814     if (isFocused_) {
815         // process state is already focused, no need update process state.
816         return false;
817     }
818 
819     // update process focus state to true.
820     isFocused_ = true;
821     return true;
822 }
823 
AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> & ability)824 bool AppRunningRecord::AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> &ability)
825 {
826     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
827     if (!ability) {
828         HILOG_ERROR("ability is null");
829         return false;
830     }
831     ability->UpdateFocusState(false);
832 
833     // update ability state to unfocused.
834     int32_t abilityState = static_cast<int32_t>(ability->GetState());
835     bool isAbility = true;
836     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
837         isAbility = false;
838     }
839     StateChangedNotifyObserver(ability, abilityState, isAbility);
840 
841     if (!isFocused_) {
842         return false; // invalid process focus state, already unfocused, process state not change.
843     }
844 
845     bool changeProcessToUnfocused = true;
846     auto abilitysMap = GetAbilities();
847     for (const auto &item : abilitysMap) {
848         const auto &abilityRecord = item.second;
849         if (abilityRecord && abilityRecord->GetFocusFlag()) {
850             changeProcessToUnfocused = false;
851             break;
852         }
853     }
854 
855     if (changeProcessToUnfocused) {
856         isFocused_ = false; // process focus state : from focus to unfocus.
857     }
858     return changeProcessToUnfocused;
859 }
860 
PopForegroundingAbilityTokens()861 void AppRunningRecord::PopForegroundingAbilityTokens()
862 {
863     while (!foregroundingAbilityTokens_.empty()) {
864         const auto &token = foregroundingAbilityTokens_.front();
865         auto ability = GetAbilityRunningRecordByToken(token);
866         auto moduleRecord = GetModuleRunningRecordByToken(token);
867         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
868         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
869         foregroundingAbilityTokens_.pop_front();
870     }
871 }
872 
TerminateAbility(const sptr<IRemoteObject> & token,const bool isForce)873 void AppRunningRecord::TerminateAbility(const sptr<IRemoteObject> &token, const bool isForce)
874 {
875     HILOG_INFO("Terminate ability, isForce: %{public}d", static_cast<int>(isForce));
876 
877     auto moduleRecord = GetModuleRunningRecordByToken(token);
878     if (!moduleRecord) {
879         HILOG_ERROR("can not find module record");
880         return;
881     }
882 
883     auto abilityRecord = GetAbilityRunningRecordByToken(token);
884     StateChangedNotifyObserver(abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_TERMINATED), true);
885     moduleRecord->TerminateAbility(shared_from_this(), token, isForce);
886 }
887 
AbilityTerminated(const sptr<IRemoteObject> & token)888 void AppRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
889 {
890     HILOG_INFO("AbilityTerminated come.");
891     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
892     if (!moduleRecord) {
893         HILOG_ERROR("AbilityTerminated error, can not find module record");
894         return;
895     }
896     moduleRecord->AbilityTerminated(token);
897 
898     if (moduleRecord->GetAbilities().empty() && !IsKeepAliveApp()) {
899         RemoveModuleRecord(moduleRecord);
900     }
901 
902     auto moduleRecordList = GetAllModuleRecord();
903     if (moduleRecordList.empty() && !IsKeepAliveApp()) {
904         ScheduleTerminate();
905     }
906 }
907 
GetAllModuleRecord() const908 std::list<std::shared_ptr<ModuleRunningRecord>> AppRunningRecord::GetAllModuleRecord() const
909 {
910     std::list<std::shared_ptr<ModuleRunningRecord>> moduleRecordList;
911     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
912     for (const auto &item : hapModules_) {
913         for (const auto &list : item.second) {
914             moduleRecordList.push_back(list);
915         }
916     }
917     return moduleRecordList;
918 }
919 
RegisterAppDeathRecipient() const920 void AppRunningRecord::RegisterAppDeathRecipient() const
921 {
922     if (appLifeCycleDeal_ == nullptr) {
923         HILOG_ERROR("appLifeCycleDeal_ is null");
924         return;
925     }
926     if (!appLifeCycleDeal_->GetApplicationClient()) {
927         HILOG_ERROR("appThread is nullptr");
928         return;
929     }
930     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
931     if (object) {
932         object->AddDeathRecipient(appDeathRecipient_);
933     }
934 }
935 
RemoveAppDeathRecipient() const936 void AppRunningRecord::RemoveAppDeathRecipient() const
937 {
938     if (appLifeCycleDeal_ == nullptr) {
939         HILOG_ERROR("appLifeCycleDeal_ is null");
940         return;
941     }
942     if (!appLifeCycleDeal_->GetApplicationClient()) {
943         HILOG_ERROR("appThread is nullptr.");
944         return;
945     }
946     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
947     if (object) {
948         object->RemoveDeathRecipient(appDeathRecipient_);
949     }
950 }
951 
SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> & inner)952 void AppRunningRecord::SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> &inner)
953 {
954     appMgrServiceInner_ = inner;
955 
956     auto moduleRecordList = GetAllModuleRecord();
957     if (moduleRecordList.empty()) {
958         HILOG_ERROR("moduleRecordList is empty");
959         return;
960     }
961 
962     for (const auto &moduleRecord : moduleRecordList) {
963         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
964     }
965 }
966 
SetAppDeathRecipient(const sptr<AppDeathRecipient> & appDeathRecipient)967 void AppRunningRecord::SetAppDeathRecipient(const sptr<AppDeathRecipient> &appDeathRecipient)
968 {
969     appDeathRecipient_ = appDeathRecipient;
970 }
971 
GetPriorityObject()972 std::shared_ptr<PriorityObject> AppRunningRecord::GetPriorityObject()
973 {
974     if (!priorityObject_) {
975         priorityObject_ = std::make_shared<PriorityObject>();
976     }
977 
978     return priorityObject_;
979 }
980 
SendEventForSpecifiedAbility(uint32_t msg,int64_t timeOut)981 void AppRunningRecord::SendEventForSpecifiedAbility(uint32_t msg, int64_t timeOut)
982 {
983     SendEvent(msg, timeOut);
984 }
985 
SendEvent(uint32_t msg,int64_t timeOut)986 void AppRunningRecord::SendEvent(uint32_t msg, int64_t timeOut)
987 {
988     if (!eventHandler_) {
989         HILOG_ERROR("eventHandler_ is nullptr");
990         return;
991     }
992 
993     if (isDebugApp_) {
994         HILOG_INFO("Is debug mode, no need to handle time out.");
995         return;
996     }
997 
998     appEventId_++;
999     eventId_ = appEventId_;
1000     HILOG_INFO("eventId %{public}d", static_cast<int>(eventId_));
1001     eventHandler_->SendEvent(msg, appEventId_, timeOut);
1002 }
1003 
PostTask(std::string msg,int64_t timeOut,const Closure & task)1004 void AppRunningRecord::PostTask(std::string msg, int64_t timeOut, const Closure &task)
1005 {
1006     if (!eventHandler_) {
1007         HILOG_ERROR("eventHandler_ is nullptr");
1008         return;
1009     }
1010     eventHandler_->PostTask(task, msg, timeOut);
1011 }
1012 
GetEventId() const1013 int64_t AppRunningRecord::GetEventId() const
1014 {
1015     return eventId_;
1016 }
1017 
SetEventHandler(const std::shared_ptr<AMSEventHandler> & handler)1018 void AppRunningRecord::SetEventHandler(const std::shared_ptr<AMSEventHandler> &handler)
1019 {
1020     eventHandler_ = handler;
1021 }
1022 
IsLastAbilityRecord(const sptr<IRemoteObject> & token)1023 bool AppRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
1024 {
1025     auto moduleRecord = GetModuleRunningRecordByToken(token);
1026     if (!moduleRecord) {
1027         HILOG_ERROR("can not find module record");
1028         return false;
1029     }
1030 
1031     auto moduleRecordList = GetAllModuleRecord();
1032     if (moduleRecordList.size() == 1) {
1033         return moduleRecord->IsLastAbilityRecord(token);
1034     }
1035 
1036     return false;
1037 }
1038 
IsLastPageAbilityRecord(const sptr<IRemoteObject> & token)1039 bool AppRunningRecord::IsLastPageAbilityRecord(const sptr<IRemoteObject> &token)
1040 {
1041     auto moduleRecord = GetModuleRunningRecordByToken(token);
1042     if (!moduleRecord) {
1043         HILOG_ERROR("can not find module record");
1044         return false;
1045     }
1046 
1047     int32_t pageAbilitySize = 0;
1048     auto moduleRecordList = GetAllModuleRecord();
1049     for (auto moduleRecord : moduleRecordList) {
1050         pageAbilitySize += moduleRecord->GetPageAbilitySize() ;
1051         if (pageAbilitySize > 1) {
1052             return false;
1053         }
1054     }
1055 
1056     return pageAbilitySize == 1;
1057 }
1058 
SetTerminating()1059 void AppRunningRecord::SetTerminating()
1060 {
1061     isTerminating = true;
1062 }
1063 
IsTerminating()1064 bool AppRunningRecord::IsTerminating()
1065 {
1066     return isTerminating;
1067 }
1068 
IsKeepAliveApp() const1069 bool AppRunningRecord::IsKeepAliveApp() const
1070 {
1071     return isKeepAliveApp_;
1072 }
1073 
IsEmptyKeepAliveApp() const1074 bool AppRunningRecord::IsEmptyKeepAliveApp() const
1075 {
1076     return isEmptyKeepAliveApp_;
1077 }
1078 
SetKeepAliveAppState(bool isKeepAlive,bool isEmptyKeepAliveApp)1079 void AppRunningRecord::SetKeepAliveAppState(bool isKeepAlive, bool isEmptyKeepAliveApp)
1080 {
1081     isKeepAliveApp_ = isKeepAlive;
1082     isEmptyKeepAliveApp_ = isEmptyKeepAliveApp;
1083 }
1084 
SetStageModelState(bool isStageBasedModel)1085 void AppRunningRecord::SetStageModelState(bool isStageBasedModel)
1086 {
1087     isStageBasedModel_ = isStageBasedModel;
1088 }
1089 
GetTheModuleInfoNeedToUpdated(const std::string bundleName,HapModuleInfo & info)1090 bool AppRunningRecord::GetTheModuleInfoNeedToUpdated(const std::string bundleName, HapModuleInfo &info)
1091 {
1092     bool result = false;
1093     std::lock_guard<std::mutex> hapModulesLock(hapModulesLock_);
1094     auto moduleInfoVectorIter = hapModules_.find(bundleName);
1095     if (moduleInfoVectorIter == hapModules_.end() || moduleInfoVectorIter->second.empty()) {
1096         return result;
1097     }
1098     std::string moduleName = moduleName_;
1099     auto findCondition = [moduleName](const std::shared_ptr<ModuleRunningRecord> &record) {
1100         if (record) {
1101             return (moduleName.empty() || (moduleName == record->GetModuleName())) &&
1102                 (record->GetModuleRecordState() == ModuleRecordState::INITIALIZED_STATE);
1103         }
1104         return false;
1105     };
1106     auto moduleRecordIter =
1107         std::find_if(moduleInfoVectorIter->second.begin(), moduleInfoVectorIter->second.end(), findCondition);
1108     if (moduleRecordIter != moduleInfoVectorIter->second.end()) {
1109         (*moduleRecordIter)->GetHapModuleInfo(info);
1110         (*moduleRecordIter)->SetModuleRecordState(ModuleRecordState::RUNNING_STATE);
1111         result = true;
1112     }
1113 
1114     return result;
1115 }
1116 
SetRestartResidentProcCount(int count)1117 void AppRunningRecord::SetRestartResidentProcCount(int count)
1118 {
1119     restartResidentProcCount_ = count;
1120 }
1121 
DecRestartResidentProcCount()1122 void AppRunningRecord::DecRestartResidentProcCount()
1123 {
1124     restartResidentProcCount_--;
1125 }
1126 
GetRestartResidentProcCount() const1127 int AppRunningRecord::GetRestartResidentProcCount() const
1128 {
1129     return restartResidentProcCount_;
1130 }
1131 
CanRestartResidentProc()1132 bool AppRunningRecord::CanRestartResidentProc()
1133 {
1134     struct timespec t;
1135     t.tv_sec = 0;
1136     t.tv_nsec = 0;
1137     clock_gettime(CLOCK_MONOTONIC, &t);
1138     int64_t systemTimeMillis = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
1139     if ((restartResidentProcCount_ >= 0) || ((systemTimeMillis - restartTimeMillis_) > RESTART_INTERVAL_TIME)) {
1140         return true;
1141     }
1142     return false;
1143 }
1144 
GetBundleNames(std::vector<std::string> & bundleNames)1145 void AppRunningRecord::GetBundleNames(std::vector<std::string> &bundleNames)
1146 {
1147     std::lock_guard<std::mutex> appInfosLock(appInfosLock_);
1148     for (auto &app : appInfos_) {
1149         bundleNames.emplace_back(app.first);
1150     }
1151 }
1152 
SetUserTestInfo(const std::shared_ptr<UserTestRecord> & record)1153 void AppRunningRecord::SetUserTestInfo(const std::shared_ptr<UserTestRecord> &record)
1154 {
1155     userTestRecord_ = record;
1156 }
1157 
GetUserTestInfo()1158 std::shared_ptr<UserTestRecord> AppRunningRecord::GetUserTestInfo()
1159 {
1160     return userTestRecord_;
1161 }
1162 
SetSpecifiedAbilityFlagAndWant(const bool flag,const AAFwk::Want & want,const std::string & moduleName)1163 void AppRunningRecord::SetSpecifiedAbilityFlagAndWant(
1164     const bool flag, const AAFwk::Want &want, const std::string &moduleName)
1165 {
1166     isSpecifiedAbility_ = flag;
1167     SpecifiedWant_ = want;
1168     moduleName_ = moduleName;
1169 }
1170 
IsStartSpecifiedAbility() const1171 bool AppRunningRecord::IsStartSpecifiedAbility() const
1172 {
1173     return isSpecifiedAbility_;
1174 }
1175 
ScheduleAcceptWant(const std::string & moduleName)1176 void AppRunningRecord::ScheduleAcceptWant(const std::string &moduleName)
1177 {
1178     SendEvent(
1179         AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT);
1180     if (appLifeCycleDeal_ == nullptr) {
1181         HILOG_WARN("appLifeCycleDeal_ is null");
1182         return;
1183     }
1184     appLifeCycleDeal_->ScheduleAcceptWant(SpecifiedWant_, moduleName);
1185 }
1186 
ScheduleAcceptWantDone()1187 void AppRunningRecord::ScheduleAcceptWantDone()
1188 {
1189     HILOG_INFO("Schedule accept want done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1190         static_cast<int>(eventId_));
1191 
1192     if (!eventHandler_) {
1193         HILOG_ERROR("eventHandler_ is nullptr");
1194         return;
1195     }
1196 
1197     eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, eventId_);
1198 }
1199 
ApplicationTerminated()1200 void AppRunningRecord::ApplicationTerminated()
1201 {
1202     HILOG_DEBUG("Application terminated bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1203         static_cast<int>(eventId_));
1204 
1205     if (!eventHandler_) {
1206         HILOG_ERROR("eventHandler_ is nullptr");
1207         return;
1208     }
1209 
1210     eventHandler_->RemoveEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, eventId_);
1211 }
1212 
GetSpecifiedWant() const1213 const AAFwk::Want &AppRunningRecord::GetSpecifiedWant() const
1214 {
1215     return SpecifiedWant_;
1216 }
1217 
UpdateConfiguration(const Configuration & config)1218 int32_t AppRunningRecord::UpdateConfiguration(const Configuration &config)
1219 {
1220     HILOG_INFO("call %{public}s", __func__);
1221     if (!appLifeCycleDeal_) {
1222         HILOG_INFO("appLifeCycleDeal_ is null");
1223         return ERR_INVALID_VALUE;
1224     }
1225     return appLifeCycleDeal_->UpdateConfiguration(config);
1226 }
1227 
SetRenderRecord(const std::shared_ptr<RenderRecord> & record)1228 void AppRunningRecord::SetRenderRecord(const std::shared_ptr<RenderRecord> &record)
1229 {
1230     renderRecord_ = record;
1231 }
1232 
GetRenderRecord()1233 std::shared_ptr<RenderRecord> AppRunningRecord::GetRenderRecord()
1234 {
1235     return renderRecord_;
1236 }
1237 
SetStartMsg(const AppSpawnStartMsg & msg)1238 void AppRunningRecord::SetStartMsg(const AppSpawnStartMsg &msg)
1239 {
1240     startMsg_ = msg;
1241 }
1242 
GetStartMsg()1243 AppSpawnStartMsg AppRunningRecord::GetStartMsg()
1244 {
1245     return startMsg_;
1246 }
1247 
SetDebugApp(bool isDebugApp)1248 void AppRunningRecord::SetDebugApp(bool isDebugApp)
1249 {
1250     HILOG_INFO("SetDebugApp come, value is %{public}d", isDebugApp);
1251     isDebugApp_ = isDebugApp;
1252 }
1253 
IsDebugApp()1254 bool AppRunningRecord::IsDebugApp()
1255 {
1256     return isDebugApp_;
1257 }
1258 
SetAppIndex(const int32_t appIndex)1259 void AppRunningRecord::SetAppIndex(const int32_t appIndex)
1260 {
1261     appIndex_ = appIndex;
1262 }
1263 
GetAppIndex() const1264 int32_t AppRunningRecord::GetAppIndex() const
1265 {
1266     return appIndex_;
1267 }
1268 
SetSecurityFlag(bool securityFlag)1269 void AppRunningRecord::SetSecurityFlag(bool securityFlag)
1270 {
1271     securityFlag_ = securityFlag;
1272 }
1273 
GetSecurityFlag() const1274 bool AppRunningRecord::GetSecurityFlag() const
1275 {
1276     return securityFlag_;
1277 }
1278 
SetKilling()1279 void AppRunningRecord::SetKilling()
1280 {
1281     isKilling_ = true;
1282 }
1283 
IsKilling() const1284 bool AppRunningRecord::IsKilling() const
1285 {
1286     return isKilling_;
1287 }
1288 
RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject> & token) const1289 void AppRunningRecord::RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject>& token) const
1290 {
1291     auto moduleRecord = GetModuleRunningRecordByToken(token);
1292     if (!moduleRecord) {
1293         HILOG_ERROR("can not find module record");
1294         return;
1295     }
1296     (void)moduleRecord->RemoveTerminateAbilityTimeoutTask(token);
1297 }
1298 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1299 int32_t AppRunningRecord::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback,
1300     const int32_t recordId)
1301 {
1302     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1303     HILOG_DEBUG("function called.");
1304     if (!appLifeCycleDeal_) {
1305         HILOG_ERROR("appLifeCycleDeal_ is null");
1306         return ERR_INVALID_VALUE;
1307     }
1308     return appLifeCycleDeal_->NotifyLoadRepairPatch(bundleName, callback, recordId);
1309 }
1310 
NotifyHotReloadPage(const sptr<IQuickFixCallback> & callback,const int32_t recordId)1311 int32_t AppRunningRecord::NotifyHotReloadPage(const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1312 {
1313     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1314     HILOG_DEBUG("function called.");
1315     if (!appLifeCycleDeal_) {
1316         HILOG_ERROR("appLifeCycleDeal_ is null");
1317         return ERR_INVALID_VALUE;
1318     }
1319     return appLifeCycleDeal_->NotifyHotReloadPage(callback, recordId);
1320 }
1321 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1322 int32_t AppRunningRecord::NotifyUnLoadRepairPatch(const std::string &bundleName,
1323     const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1324 {
1325     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1326     HILOG_DEBUG("function called.");
1327     if (!appLifeCycleDeal_) {
1328         HILOG_ERROR("appLifeCycleDeal_ is null");
1329         return ERR_INVALID_VALUE;
1330     }
1331     return appLifeCycleDeal_->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
1332 }
1333 
IsContinuousTask()1334 bool AppRunningRecord::IsContinuousTask()
1335 {
1336     return isContinuousTask_;
1337 }
1338 
SetContinuousTaskAppState(bool isContinuousTask)1339 void AppRunningRecord::SetContinuousTaskAppState(bool isContinuousTask)
1340 {
1341     isContinuousTask_ = isContinuousTask;
1342 }
1343 
GetFocusFlag() const1344 bool AppRunningRecord::GetFocusFlag() const
1345 {
1346     return isFocused_;
1347 }
1348 
GetAppStartTime() const1349 int64_t AppRunningRecord::GetAppStartTime() const
1350 {
1351     return startTimeMillis_;
1352 }
1353 
SetRequestProcCode(int32_t requestProcCode)1354 void AppRunningRecord::SetRequestProcCode(int32_t requestProcCode)
1355 {
1356     requestProcCode_ = requestProcCode;
1357 }
1358 
GetRequestProcCode() const1359 int32_t AppRunningRecord::GetRequestProcCode() const
1360 {
1361     return requestProcCode_;
1362 }
1363 
SetProcessChangeReason(ProcessChangeReason reason)1364 void AppRunningRecord::SetProcessChangeReason(ProcessChangeReason reason)
1365 {
1366     processChangeReason_ = reason;
1367 }
1368 
GetProcessChangeReason() const1369 ProcessChangeReason AppRunningRecord::GetProcessChangeReason() const
1370 {
1371     return processChangeReason_;
1372 }
1373 }  // namespace AppExecFwk
1374 }  // namespace OHOS
1375