• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "bytrace.h"
19 #include "hilog_wrapper.h"
20 
21 namespace OHOS {
22 namespace AppExecFwk {
23 int64_t AppRunningRecord::appEventId_ = 0;
24 
RenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,const std::shared_ptr<AppRunningRecord> & host)25 RenderRecord::RenderRecord(pid_t hostPid, const std::string& renderParam,
26     int32_t ipcFd, int32_t sharedFd, const std::shared_ptr<AppRunningRecord> &host)
27     : hostPid_(hostPid), renderParam_(renderParam), ipcFd_(ipcFd), sharedFd_(sharedFd), host_(host)
28 {}
29 
~RenderRecord()30 RenderRecord::~RenderRecord()
31 {}
32 
CreateRenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,const std::shared_ptr<AppRunningRecord> & host)33 std::shared_ptr<RenderRecord> RenderRecord::CreateRenderRecord(pid_t hostPid, const std::string& renderParam,
34     int32_t ipcFd, int32_t sharedFd, const std::shared_ptr<AppRunningRecord> &host)
35 {
36     if (hostPid <= 0 || renderParam.empty() || ipcFd <= 0 || sharedFd <= 0 || !host) {
37         return nullptr;
38     }
39 
40     auto renderRecord = std::make_shared<RenderRecord>(hostPid, renderParam, ipcFd, sharedFd, host);
41     if (!renderRecord) {
42         HILOG_ERROR("create render record failed, hostPid:%{public}d.", hostPid);
43         return nullptr;
44     }
45 
46     return renderRecord;
47 }
48 
SetPid(pid_t pid)49 void RenderRecord::SetPid(pid_t pid)
50 {
51     pid_ = pid;
52 }
53 
GetPid()54 pid_t RenderRecord::GetPid()
55 {
56     return pid_;
57 }
58 
GetHostPid()59 pid_t RenderRecord::GetHostPid()
60 {
61     return hostPid_;
62 }
63 
GetRenderParam()64 std::string RenderRecord::GetRenderParam()
65 {
66     return renderParam_;
67 }
68 
GetIpcFd()69 int32_t RenderRecord::GetIpcFd()
70 {
71     return ipcFd_;
72 }
73 
GetSharedFd()74 int32_t RenderRecord::GetSharedFd()
75 {
76     return sharedFd_;
77 }
78 
GetHostRecord()79 std::shared_ptr<AppRunningRecord> RenderRecord::GetHostRecord()
80 {
81     return host_.lock();
82 }
83 
GetScheduler()84 sptr<IRenderScheduler> RenderRecord::GetScheduler()
85 {
86     return renderScheduler_;
87 }
88 
SetScheduler(const sptr<IRenderScheduler> & scheduler)89 void RenderRecord::SetScheduler(const sptr<IRenderScheduler> &scheduler)
90 {
91     renderScheduler_ = scheduler;
92 }
93 
SetDeathRecipient(const sptr<AppDeathRecipient> recipient)94 void RenderRecord::SetDeathRecipient(const sptr<AppDeathRecipient> recipient)
95 {
96     deathRecipient_ = recipient;
97 }
98 
RegisterDeathRecipient()99 void RenderRecord::RegisterDeathRecipient()
100 {
101     if (renderScheduler_ && deathRecipient_) {
102         auto obj = renderScheduler_->AsObject();
103         if (obj) {
104             obj->AddDeathRecipient(deathRecipient_);
105         }
106     }
107 }
108 
AppRunningRecord(const std::shared_ptr<ApplicationInfo> & info,const int32_t recordId,const std::string & processName)109 AppRunningRecord::AppRunningRecord(
110     const std::shared_ptr<ApplicationInfo> &info, const int32_t recordId, const std::string &processName)
111     : appRecordId_(recordId), processName_(processName)
112 {
113     if (info) {
114         appInfo_ = info;
115         mainBundleName_ = info->bundleName;
116         isLauncherApp_ = info->isLauncherApp;
117         isClonedApp_ = info->isCloned;
118         mainAppName_ = info->name;
119     }
120 }
121 
SetApplicationClient(const sptr<IAppScheduler> & thread)122 void AppRunningRecord::SetApplicationClient(const sptr<IAppScheduler> &thread)
123 {
124     if (!appLifeCycleDeal_) {
125         appLifeCycleDeal_ = std::make_shared<AppLifeCycleDeal>();
126     }
127     appLifeCycleDeal_->SetApplicationClient(thread);
128 
129     auto moduleRecordList = GetAllModuleRecord();
130     if (moduleRecordList.empty()) {
131         HILOG_ERROR("moduleRecordList is empty");
132         return;
133     }
134     for (const auto &moduleRecord : moduleRecordList) {
135         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
136     }
137 }
138 
GetBundleName() const139 const std::string &AppRunningRecord::GetBundleName() const
140 {
141     return mainBundleName_;
142 }
143 
IsLauncherApp() const144 bool AppRunningRecord::IsLauncherApp() const
145 {
146     return isLauncherApp_;
147 }
148 
GetRecordId() const149 int32_t AppRunningRecord::GetRecordId() const
150 {
151     return appRecordId_;
152 }
153 
GetName() const154 const std::string &AppRunningRecord::GetName() const
155 {
156     return mainAppName_;
157 }
158 
GetCloneInfo() const159 bool AppRunningRecord::GetCloneInfo() const
160 {
161     return isClonedApp_;
162 }
163 
GetSignCode() const164 const std::string &AppRunningRecord::GetSignCode() const
165 {
166     return signCode_;
167 }
168 
SetSignCode(const std::string & signCode)169 void AppRunningRecord::SetSignCode(const std::string &signCode)
170 {
171     signCode_ = signCode;
172 }
173 
GetJointUserId() const174 const std::string &AppRunningRecord::GetJointUserId() const
175 {
176     return jointUserId_;
177 }
178 
SetJointUserId(const std::string & jointUserId)179 void AppRunningRecord::SetJointUserId(const std::string &jointUserId)
180 {
181     jointUserId_ = jointUserId;
182 }
183 
GetProcessName() const184 const std::string &AppRunningRecord::GetProcessName() const
185 {
186     return processName_;
187 }
188 
GetUid() const189 int32_t AppRunningRecord::GetUid() const
190 {
191     return mainUid_;
192 }
193 
SetUid(const int32_t uid)194 void AppRunningRecord::SetUid(const int32_t uid)
195 {
196     mainUid_ = uid;
197 }
198 
GetState() const199 ApplicationState AppRunningRecord::GetState() const
200 {
201     return curState_;
202 }
203 
SetState(const ApplicationState state)204 void AppRunningRecord::SetState(const ApplicationState state)
205 {
206     if (state >= ApplicationState::APP_STATE_END) {
207         HILOG_ERROR("Invalid application state");
208         return;
209     }
210     curState_ = state;
211 }
212 
GetAppInfoList()213 const std::list<std::shared_ptr<ApplicationInfo>> AppRunningRecord::GetAppInfoList()
214 {
215     std::list<std::shared_ptr<ApplicationInfo>> appInfoList;
216     for (const auto &item : appInfos_) {
217         appInfoList.push_back(item.second);
218     }
219     return appInfoList;
220 }
221 
GetAbilities()222 const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> AppRunningRecord::GetAbilities()
223 {
224     std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilitysMap;
225     auto moduleRecordList = GetAllModuleRecord();
226     for (const auto &moduleRecord : moduleRecordList) {
227         auto abilities = moduleRecord->GetAbilities();
228         abilitysMap.insert(abilities.begin(), abilities.end());
229     }
230     return abilitysMap;
231 }
232 
GetModules()233 std::map<std::string, std::vector<std::shared_ptr<ModuleRunningRecord>>> &AppRunningRecord::GetModules()
234 {
235     return hapModules_;
236 }
237 
GetApplicationClient() const238 sptr<IAppScheduler> AppRunningRecord::GetApplicationClient() const
239 {
240     return (appLifeCycleDeal_ ? appLifeCycleDeal_->GetApplicationClient() : nullptr);
241 }
242 
GetAbilityRunningRecord(const std::string & abilityName,int32_t ownerUserId) const243 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecord(
244     const std::string &abilityName, int32_t ownerUserId) const
245 {
246     HILOG_INFO("Get ability running record by ability name.");
247     auto moduleRecordList = GetAllModuleRecord();
248     for (const auto &moduleRecord : moduleRecordList) {
249         auto abilityRecord = moduleRecord->GetAbilityRunningRecord(abilityName, ownerUserId);
250         if (abilityRecord) {
251             return abilityRecord;
252         }
253     }
254 
255     return nullptr;
256 }
257 
GetAbilityRunningRecord(const int64_t eventId) const258 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const
259 {
260     HILOG_INFO("Get ability running record by eventId.");
261     auto moduleRecordList = GetAllModuleRecord();
262     for (const auto &moduleRecord : moduleRecordList) {
263         auto abilityRecord = moduleRecord->GetAbilityRunningRecord(eventId);
264         if (abilityRecord) {
265             return abilityRecord;
266         }
267     }
268 
269     return nullptr;
270 }
271 
ClearAbility(const std::shared_ptr<AbilityRunningRecord> & record)272 void AppRunningRecord::ClearAbility(const std::shared_ptr<AbilityRunningRecord> &record)
273 {
274     if (!record) {
275         HILOG_ERROR("Param record is null");
276         return;
277     }
278 
279     auto moduleRecord = GetModuleRunningRecordByToken(record->GetToken());
280     if (!moduleRecord) {
281         HILOG_ERROR("moduleRecord is not exit");
282         return;
283     }
284 
285     moduleRecord->ClearAbility(record);
286 
287     if (moduleRecord->GetAbilities().empty()) {
288         RemoveModuleRecord(moduleRecord);
289     }
290 }
291 
RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> & moudleRecord)292 void AppRunningRecord::RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> &moudleRecord)
293 {
294     HILOG_INFO("Remove module record.");
295 
296     for (auto &item : hapModules_) {
297         auto iter = std::find_if(item.second.begin(),
298             item.second.end(),
299             [&moudleRecord](const std::shared_ptr<ModuleRunningRecord> &record) { return moudleRecord == record; });
300         if (iter != item.second.end()) {
301             iter = item.second.erase(iter);
302             if (item.second.empty()) {
303                 appInfos_.erase(item.first);
304                 hapModules_.erase(item.first);
305             }
306             return;
307         }
308     }
309 }
310 
ForceKillApp(const std::string & reason) const311 void AppRunningRecord::ForceKillApp([[maybe_unused]] const std::string &reason) const
312 {}
313 
ScheduleAppCrash(const std::string & description) const314 void AppRunningRecord::ScheduleAppCrash([[maybe_unused]] const std::string &description) const
315 {}
316 
LaunchApplication(const Configuration & config)317 void AppRunningRecord::LaunchApplication(const Configuration &config)
318 {
319     BYTRACE_NAME(BYTRACE_TAG_APP, __PRETTY_FUNCTION__);
320     if (appLifeCycleDeal_ == nullptr) {
321         HILOG_ERROR("appLifeCycleDeal_ is null");
322         return;
323     }
324     if (!appLifeCycleDeal_->GetApplicationClient()) {
325         HILOG_ERROR("appThread is null");
326         return;
327     }
328     AppLaunchData launchData;
329     auto moduleRecords = appInfos_.find(mainBundleName_);
330     if (moduleRecords != appInfos_.end()) {
331         launchData.SetApplicationInfo(*(moduleRecords->second));
332     }
333     ProcessInfo processInfo(processName_, GetPriorityObject()->GetPid());
334     launchData.SetProcessInfo(processInfo);
335     launchData.SetRecordId(appRecordId_);
336     launchData.SetUId(mainUid_);
337     launchData.SetUserTestInfo(userTestRecord_);
338     HILOG_INFO("ScheduleLaunchApplication app:%{public}s", GetName().c_str());
339     appLifeCycleDeal_->LaunchApplication(launchData, config);
340 }
341 
AddAbilityStage()342 void AppRunningRecord::AddAbilityStage()
343 {
344     if (!isNewMission_) {
345         HILOG_INFO("Current version than supports !");
346         return;
347     }
348     HapModuleInfo abilityStage;
349     if (GetTheModuleInfoNeedToUpdated(mainBundleName_, abilityStage)) {
350         SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG, AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
351         HILOG_INFO("Current Informed module : [%{public}s] | bundle : [%{public}s]",
352             abilityStage.moduleName.c_str(), mainBundleName_.c_str());
353         appLifeCycleDeal_->AddAbilityStage(abilityStage);
354         return;
355     }
356 
357     HILOG_INFO("The current process[%{public}s] is updated", processName_.c_str());
358 }
359 
AddAbilityStageBySpecifiedAbility(const std::string & bundleName)360 void AppRunningRecord::AddAbilityStageBySpecifiedAbility(const std::string &bundleName)
361 {
362     HapModuleInfo hapModuleInfo;
363     if (GetTheModuleInfoNeedToUpdated(bundleName, hapModuleInfo)) {
364         if (!eventHandler_->HasInnerEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG)) {
365             SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
366                 AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
367         } else {
368             HILOG_INFO(
369                 "%{public}s START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG is exist, don't set new event.", __func__);
370         }
371         appLifeCycleDeal_->AddAbilityStage(hapModuleInfo);
372     }
373 }
374 
AddAbilityStageDone()375 void AppRunningRecord::AddAbilityStageDone()
376 {
377     HILOG_INFO("Add ability stage done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
378         static_cast<int>(eventId_));
379     if (eventHandler_->HasInnerEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG)) {
380         eventHandler_->RemoveEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG);
381     }
382 
383     if (eventHandler_->HasInnerEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG)) {
384         eventHandler_->RemoveEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG);
385     }
386     // Should proceed to the next notification
387 
388     if (isSpecifiedAbility_) {
389         ScheduleAcceptWant(moduleName_);
390         return;
391     }
392 
393     AddAbilityStage();
394 }
395 
LaunchAbility(const std::shared_ptr<AbilityRunningRecord> & ability)396 void AppRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningRecord> &ability)
397 {
398     BYTRACE_NAME(BYTRACE_TAG_APP, __PRETTY_FUNCTION__);
399     if (appLifeCycleDeal_ == nullptr) {
400         HILOG_ERROR("appLifeCycleDeal_ is null");
401         return;
402     }
403     if (!ability || !ability->GetToken()) {
404         HILOG_ERROR("abilityRecord or abilityToken is nullptr.");
405         return;
406     }
407 
408     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
409     if (!moduleRecord) {
410         HILOG_ERROR("moduleRecord is nullptr");
411         return;
412     }
413 
414     moduleRecord->LaunchAbility(ability);
415 }
416 
ScheduleTerminate()417 void AppRunningRecord::ScheduleTerminate()
418 {
419     SendEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT);
420     if (appLifeCycleDeal_) {
421         appLifeCycleDeal_->ScheduleTerminate();
422     }
423 }
424 
LaunchPendingAbilities()425 void AppRunningRecord::LaunchPendingAbilities()
426 {
427     HILOG_INFO("Launch pending abilities.");
428 
429     auto moduleRecordList = GetAllModuleRecord();
430     if (moduleRecordList.empty()) {
431         HILOG_ERROR("moduleRecordList is empty");
432         return;
433     }
434     for (const auto &moduleRecord : moduleRecordList) {
435         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
436         moduleRecord->LaunchPendingAbilities();
437     }
438 }
ScheduleForegroundRunning()439 void AppRunningRecord::ScheduleForegroundRunning()
440 {
441     if (appLifeCycleDeal_) {
442         appLifeCycleDeal_->ScheduleForegroundRunning();
443     }
444 }
445 
ScheduleBackgroundRunning()446 void AppRunningRecord::ScheduleBackgroundRunning()
447 {
448     if (appLifeCycleDeal_) {
449         appLifeCycleDeal_->ScheduleBackgroundRunning();
450     }
451 }
452 
ScheduleProcessSecurityExit()453 void AppRunningRecord::ScheduleProcessSecurityExit()
454 {
455     if (appLifeCycleDeal_) {
456         appLifeCycleDeal_->ScheduleProcessSecurityExit();
457     }
458 }
459 
ScheduleTrimMemory()460 void AppRunningRecord::ScheduleTrimMemory()
461 {
462     if (appLifeCycleDeal_ && priorityObject_) {
463         appLifeCycleDeal_->ScheduleTrimMemory(priorityObject_->GetTimeLevel());
464     }
465 }
466 
LowMemoryWarning()467 void AppRunningRecord::LowMemoryWarning()
468 {
469     if (appLifeCycleDeal_) {
470         appLifeCycleDeal_->LowMemoryWarning();
471     }
472 }
473 
AddModules(const std::shared_ptr<ApplicationInfo> & appInfo,const std::vector<HapModuleInfo> & moduleInfos)474 void AppRunningRecord::AddModules(
475     const std::shared_ptr<ApplicationInfo> &appInfo, const std::vector<HapModuleInfo> &moduleInfos)
476 {
477     HILOG_INFO("Add modules");
478 
479     if (moduleInfos.empty()) {
480         HILOG_INFO("moduleInfos is empty.");
481         return;
482     }
483 
484     for (auto &iter : moduleInfos) {
485         AddModule(appInfo, nullptr, nullptr, iter, nullptr);
486     }
487 }
488 
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)489 void AppRunningRecord::AddModule(const std::shared_ptr<ApplicationInfo> &appInfo,
490     const std::shared_ptr<AbilityInfo> &abilityInfo, const sptr<IRemoteObject> &token,
491     const HapModuleInfo &hapModuleInfo, const std::shared_ptr<AAFwk::Want> &want)
492 {
493     HILOG_INFO("Add module.");
494 
495     if (!appInfo) {
496         HILOG_ERROR("appInfo is null");
497         return;
498     }
499 
500     std::shared_ptr<ModuleRunningRecord> moduleRecord;
501     std::vector<std::shared_ptr<ModuleRunningRecord>> moduleList;
502 
503     auto initModuleRecord = [=](const std::shared_ptr<ModuleRunningRecord> &moduleRecord) {
504         moduleRecord->Init(hapModuleInfo);
505         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
506         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
507     };
508 
509     const auto &iter = hapModules_.find(appInfo->bundleName);
510     if (iter != hapModules_.end()) {
511         moduleRecord = GetModuleRecordByModuleName(appInfo->bundleName, hapModuleInfo.moduleName);
512         if (!moduleRecord) {
513             moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
514             iter->second.push_back(moduleRecord);
515             initModuleRecord(moduleRecord);
516         }
517     } else {
518         moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
519         moduleList.push_back(moduleRecord);
520         hapModules_.emplace(appInfo->bundleName, moduleList);
521         appInfos_.emplace(appInfo->bundleName, appInfo);
522         initModuleRecord(moduleRecord);
523     }
524 
525     if (!abilityInfo || !token) {
526         HILOG_ERROR("abilityinfo or token is nullptr");
527         return;
528     }
529     moduleRecord->AddAbility(token, abilityInfo, want);
530 
531     return;
532 }
533 
GetModuleRecordByModuleName(const std::string bundleName,const std::string & moduleName)534 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRecordByModuleName(
535     const std::string bundleName, const std::string &moduleName)
536 {
537     HILOG_INFO("Get module record by module name.");
538     auto moduleRecords = hapModules_.find(bundleName);
539     if (moduleRecords != hapModules_.end()) {
540         for (auto &iter : moduleRecords->second) {
541             if (iter->GetModuleName() == moduleName) {
542                 return iter;
543             }
544         }
545     }
546 
547     return nullptr;
548 }
549 
StateChangedNotifyObserver(const std::shared_ptr<AbilityRunningRecord> & ability,const int32_t state,bool isAbility)550 void AppRunningRecord::StateChangedNotifyObserver(
551     const std::shared_ptr<AbilityRunningRecord> &ability, const int32_t state, bool isAbility)
552 {
553     if (!ability) {
554         HILOG_ERROR("ability is null");
555         return;
556     }
557     AbilityStateData abilityStateData;
558     abilityStateData.bundleName = ability->GetAbilityInfo()->applicationInfo.bundleName;
559     abilityStateData.abilityName = ability->GetName();
560     abilityStateData.pid = GetPriorityObject()->GetPid();
561     abilityStateData.abilityState = state;
562     abilityStateData.uid = ability->GetAbilityInfo()->applicationInfo.uid;
563     abilityStateData.token = ability->GetToken();
564     abilityStateData.abilityType = static_cast<int32_t>(ability->GetAbilityInfo()->type);
565 
566     if (isAbility && ability->GetAbilityInfo() != nullptr &&
567         ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
568         HILOG_INFO("extension type, not notify any more.");
569         return;
570     }
571     auto serviceInner = appMgrServiceInner_.lock();
572     if (serviceInner) {
573         serviceInner->StateChangedNotifyObserver(abilityStateData, isAbility);
574     }
575 }
576 
GetModuleRunningRecordByToken(const sptr<IRemoteObject> & token) const577 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByToken(
578     const sptr<IRemoteObject> &token) const
579 {
580     if (!token) {
581         HILOG_ERROR("token is null");
582         return nullptr;
583     }
584 
585     auto moduleRecordList = GetAllModuleRecord();
586     for (const auto &moduleRecord : moduleRecordList) {
587         if (moduleRecord && moduleRecord->GetAbilityRunningRecordByToken(token)) {
588             return moduleRecord;
589         }
590     }
591 
592     return nullptr;
593 }
594 
GetModuleRunningRecordByTerminateLists(const sptr<IRemoteObject> & token) const595 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByTerminateLists(
596     const sptr<IRemoteObject> &token) const
597 {
598     if (!token) {
599         HILOG_ERROR("token is null");
600         return nullptr;
601     }
602 
603     auto moduleRecordList = GetAllModuleRecord();
604     for (const auto &moduleRecord : moduleRecordList) {
605         if (moduleRecord && moduleRecord->GetAbilityByTerminateLists(token)) {
606             return moduleRecord;
607         }
608     }
609 
610     return nullptr;
611 }
612 
GetAbilityRunningRecordByToken(const sptr<IRemoteObject> & token) const613 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecordByToken(
614     const sptr<IRemoteObject> &token) const
615 {
616     auto moduleRecord = GetModuleRunningRecordByToken(token);
617     if (!moduleRecord) {
618         HILOG_ERROR("moduleRecord is not exit");
619         return nullptr;
620     }
621     return moduleRecord->GetAbilityRunningRecordByToken(token);
622 }
623 
GetAbilityByTerminateLists(const sptr<IRemoteObject> & token) const624 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityByTerminateLists(
625     const sptr<IRemoteObject> &token) const
626 {
627     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
628     if (!moduleRecord) {
629         HILOG_ERROR("moduleRecord is not exit");
630         return nullptr;
631     }
632     return moduleRecord->GetAbilityByTerminateLists(token);
633 }
634 
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)635 void AppRunningRecord::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
636 {
637     HILOG_INFO("state is :%{public}d", static_cast<int32_t>(state));
638     auto abilityRecord = GetAbilityRunningRecordByToken(token);
639     if (!abilityRecord) {
640         HILOG_ERROR("can not find ability record");
641         return;
642     }
643     if (state == abilityRecord->GetState()) {
644         HILOG_ERROR("current state is already, no need update");
645         return;
646     }
647 
648     if (state == AbilityState::ABILITY_STATE_FOREGROUND) {
649         AbilityForeground(abilityRecord);
650     } else if (state == AbilityState::ABILITY_STATE_BACKGROUND) {
651         AbilityBackground(abilityRecord);
652     } else {
653         HILOG_WARN("wrong state");
654     }
655 }
656 
AbilityForeground(const std::shared_ptr<AbilityRunningRecord> & ability)657 void AppRunningRecord::AbilityForeground(const std::shared_ptr<AbilityRunningRecord> &ability)
658 {
659     BYTRACE_NAME(BYTRACE_TAG_APP, __PRETTY_FUNCTION__);
660     if (!ability) {
661         HILOG_ERROR("ability is null");
662         return;
663     }
664     AbilityState curAbilityState = ability->GetState();
665     if (curAbilityState != AbilityState::ABILITY_STATE_READY &&
666         curAbilityState != AbilityState::ABILITY_STATE_BACKGROUND) {
667         HILOG_ERROR("ability state(%{public}d) error", static_cast<int32_t>(curAbilityState));
668         return;
669     }
670 
671     // We need schedule application to foregrounded when current application state is ready or background running.
672     if (curState_ == ApplicationState::APP_STATE_READY || curState_ == ApplicationState::APP_STATE_BACKGROUND) {
673         if (foregroundingAbilityTokens_.empty()) {
674             ScheduleForegroundRunning();
675         }
676         foregroundingAbilityTokens_.push_back(ability->GetToken());
677         return;
678     } else if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
679         // Just change ability to foreground if current application state is foreground.
680         auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
681         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
682         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
683         auto serviceInner = appMgrServiceInner_.lock();
684         if (serviceInner) {
685             serviceInner->OnAppStateChanged(shared_from_this(), curState_);
686         }
687     } else {
688         HILOG_WARN("wrong application state");
689     }
690 }
691 
AbilityBackground(const std::shared_ptr<AbilityRunningRecord> & ability)692 void AppRunningRecord::AbilityBackground(const std::shared_ptr<AbilityRunningRecord> &ability)
693 {
694     BYTRACE_NAME(BYTRACE_TAG_APP, __PRETTY_FUNCTION__);
695     if (!ability) {
696         HILOG_ERROR("ability is null");
697         return;
698     }
699     if (ability->GetState() != AbilityState::ABILITY_STATE_FOREGROUND) {
700         HILOG_ERROR("ability state is not foreground");
701         return;
702     }
703 
704     // First change ability to backgrounded.
705     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
706     moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_BACKGROUND);
707     StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_BACKGROUND), true);
708     if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
709         int32_t foregroundSize = 0;
710         auto abilitysMap = GetAbilities();
711         for (const auto &item : abilitysMap) {
712             const auto &abilityRecord = item.second;
713             if (abilityRecord && abilityRecord->GetState() == AbilityState::ABILITY_STATE_FOREGROUND) {
714                 foregroundSize++;
715                 break;
716             }
717         }
718 
719         // Then schedule application background when all ability is not foreground.
720         if (foregroundSize == 0) {
721             ScheduleBackgroundRunning();
722         }
723     } else {
724         HILOG_WARN("wrong application state");
725     }
726 }
727 
PopForegroundingAbilityTokens()728 void AppRunningRecord::PopForegroundingAbilityTokens()
729 {
730     HILOG_INFO("size:%{public}d", static_cast<int32_t>(foregroundingAbilityTokens_.size()));
731     while (!foregroundingAbilityTokens_.empty()) {
732         const auto &token = foregroundingAbilityTokens_.front();
733         auto ability = GetAbilityRunningRecordByToken(token);
734         auto moduleRecord = GetModuleRunningRecordByToken(token);
735         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
736         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
737         foregroundingAbilityTokens_.pop_front();
738     }
739 }
740 
TerminateAbility(const sptr<IRemoteObject> & token,const bool isForce)741 void AppRunningRecord::TerminateAbility(const sptr<IRemoteObject> &token, const bool isForce)
742 {
743     HILOG_INFO("Terminate ability, isForce: %{public}d", static_cast<int>(isForce));
744 
745     auto moduleRecord = GetModuleRunningRecordByToken(token);
746     if (!moduleRecord) {
747         HILOG_ERROR("can not find module record");
748         return;
749     }
750 
751     auto abilityRecord = GetAbilityRunningRecordByToken(token);
752     StateChangedNotifyObserver(abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_TERMINATED), true);
753     moduleRecord->TerminateAbility(token, isForce);
754     HILOG_INFO("AppRunningRecord::TerminateAbility end");
755 }
756 
AbilityTerminated(const sptr<IRemoteObject> & token)757 void AppRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
758 {
759     HILOG_INFO("Ability terminated.");
760     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
761     if (!moduleRecord) {
762         HILOG_ERROR("Can not find module record");
763         return;
764     }
765     moduleRecord->AbilityTerminated(token);
766 
767     if (moduleRecord->GetAbilities().empty()) {
768         RemoveModuleRecord(moduleRecord);
769     }
770 
771     auto moduleRecordList = GetAllModuleRecord();
772     if (moduleRecordList.empty()) {
773         ScheduleTerminate();
774     }
775 }
776 
GetAllModuleRecord() const777 std::list<std::shared_ptr<ModuleRunningRecord>> AppRunningRecord::GetAllModuleRecord() const
778 {
779     std::list<std::shared_ptr<ModuleRunningRecord>> moduleRecordList;
780     for (const auto &item : hapModules_) {
781         for (const auto &list : item.second) {
782             moduleRecordList.push_back(list);
783         }
784     }
785     HILOG_INFO("GetAllModuleRecord size:%{public}zu", moduleRecordList.size());
786     return moduleRecordList;
787 }
788 
RegisterAppDeathRecipient() const789 void AppRunningRecord::RegisterAppDeathRecipient() const
790 {
791     if (appLifeCycleDeal_ == nullptr) {
792         HILOG_ERROR("appLifeCycleDeal_ is null");
793         return;
794     }
795     if (!appLifeCycleDeal_->GetApplicationClient()) {
796         HILOG_ERROR("appThread is nullptr");
797         return;
798     }
799     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
800     if (object) {
801         object->AddDeathRecipient(appDeathRecipient_);
802     }
803 }
804 
RemoveAppDeathRecipient() const805 void AppRunningRecord::RemoveAppDeathRecipient() const
806 {
807     if (appLifeCycleDeal_ == nullptr) {
808         HILOG_ERROR("appLifeCycleDeal_ is null");
809         return;
810     }
811     if (!appLifeCycleDeal_->GetApplicationClient()) {
812         HILOG_ERROR("appThread is nullptr.");
813         return;
814     }
815     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
816     if (object) {
817         object->RemoveDeathRecipient(appDeathRecipient_);
818     }
819 }
820 
SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> & inner)821 void AppRunningRecord::SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> &inner)
822 {
823     appMgrServiceInner_ = inner;
824 
825     auto moduleRecordList = GetAllModuleRecord();
826     if (moduleRecordList.empty()) {
827         HILOG_ERROR("moduleRecordList is empty");
828         return;
829     }
830 
831     for (const auto &moduleRecord : moduleRecordList) {
832         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
833     }
834 }
835 
SetAppDeathRecipient(const sptr<AppDeathRecipient> & appDeathRecipient)836 void AppRunningRecord::SetAppDeathRecipient(const sptr<AppDeathRecipient> &appDeathRecipient)
837 {
838     appDeathRecipient_ = appDeathRecipient;
839 }
840 
GetPriorityObject()841 std::shared_ptr<PriorityObject> AppRunningRecord::GetPriorityObject()
842 {
843     if (!priorityObject_) {
844         priorityObject_ = std::make_shared<PriorityObject>();
845     }
846 
847     return priorityObject_;
848 }
849 
SendEventForSpecifiedAbility(uint32_t msg,int64_t timeOut)850 void AppRunningRecord::SendEventForSpecifiedAbility(uint32_t msg, int64_t timeOut)
851 {
852     SendEvent(msg, timeOut);
853 }
854 
SendEvent(uint32_t msg,int64_t timeOut)855 void AppRunningRecord::SendEvent(uint32_t msg, int64_t timeOut)
856 {
857     if (!eventHandler_) {
858         HILOG_ERROR("eventHandler_ is nullptr");
859         return;
860     }
861 
862     if (isDebugApp_) {
863         HILOG_INFO("Is debug mode, no need to handle time out.");
864         return;
865     }
866 
867     appEventId_++;
868     eventId_ = appEventId_;
869     HILOG_INFO("eventId %{public}d", static_cast<int>(eventId_));
870     eventHandler_->SendEvent(msg, appEventId_, timeOut);
871 }
872 
GetEventId() const873 int64_t AppRunningRecord::GetEventId() const
874 {
875     return eventId_;
876 }
877 
SetEventHandler(const std::shared_ptr<AMSEventHandler> & handler)878 void AppRunningRecord::SetEventHandler(const std::shared_ptr<AMSEventHandler> &handler)
879 {
880     eventHandler_ = handler;
881 }
882 
IsLastAbilityRecord(const sptr<IRemoteObject> & token)883 bool AppRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
884 {
885     if (!token) {
886         HILOG_ERROR("token is nullptr");
887         return false;
888     }
889 
890     auto moduleRecord = GetModuleRunningRecordByToken(token);
891     if (!moduleRecord) {
892         HILOG_ERROR("can not find module record");
893         return false;
894     }
895 
896     auto moduleRecordList = GetAllModuleRecord();
897     if (moduleRecordList.size() == 1) {
898         return moduleRecord->IsLastAbilityRecord(token);
899     }
900 
901     return false;
902 }
903 
SetTerminating()904 void AppRunningRecord::SetTerminating()
905 {
906     isTerminating = true;
907 }
908 
IsTerminating()909 bool AppRunningRecord::IsTerminating()
910 {
911     return isTerminating;
912 }
913 
IsKeepAliveApp() const914 bool AppRunningRecord::IsKeepAliveApp() const
915 {
916     return isKeepAliveApp_;
917 }
918 
SetKeepAliveAppState(bool isKeepAlive,bool isNewMission)919 void AppRunningRecord::SetKeepAliveAppState(bool isKeepAlive, bool isNewMission)
920 {
921     isKeepAliveApp_ = isKeepAlive;
922     isNewMission_ = isNewMission;
923 }
924 
GetTheModuleInfoNeedToUpdated(const std::string bundleName,HapModuleInfo & info)925 bool AppRunningRecord::GetTheModuleInfoNeedToUpdated(const std::string bundleName, HapModuleInfo &info)
926 {
927     bool result = false;
928     auto moduleInfoVectorIter = hapModules_.find(bundleName);
929     if (moduleInfoVectorIter == hapModules_.end() || moduleInfoVectorIter->second.empty()) {
930         return result;
931     }
932     auto findCondition = [](const std::shared_ptr<ModuleRunningRecord> &record) {
933         if (record) {
934             return record->GetModuleRecordState() == ModuleRecordState::INITIALIZED_STATE;
935         }
936         return false;
937     };
938     auto moduleRecordIter =
939         std::find_if(moduleInfoVectorIter->second.begin(), moduleInfoVectorIter->second.end(), findCondition);
940     if (moduleRecordIter != moduleInfoVectorIter->second.end()) {
941         (*moduleRecordIter)->GetHapModuleInfo(info);
942         (*moduleRecordIter)->SetModuleRecordState(ModuleRecordState::RUNNING_STATE);
943         result = true;
944     }
945 
946     return result;
947 }
948 
SetRestartResidentProcCount(int count)949 void AppRunningRecord::SetRestartResidentProcCount(int count)
950 {
951     restartResidentProcCount_ = count;
952 }
953 
DecRestartResidentProcCount()954 void AppRunningRecord::DecRestartResidentProcCount()
955 {
956     restartResidentProcCount_--;
957 }
958 
GetRestartResidentProcCount() const959 int AppRunningRecord::GetRestartResidentProcCount() const
960 {
961     return restartResidentProcCount_;
962 }
963 
CanRestartResidentProc()964 bool AppRunningRecord::CanRestartResidentProc()
965 {
966     return (restartResidentProcCount_ > 0);
967 }
968 
GetBundleNames(std::vector<std::string> & bundleNames)969 void AppRunningRecord::GetBundleNames(std::vector<std::string> &bundleNames)
970 {
971     for (auto &app : appInfos_) {
972         bundleNames.emplace_back(app.first);
973     }
974 }
975 
SetUserTestInfo(const std::shared_ptr<UserTestRecord> & record)976 void AppRunningRecord::SetUserTestInfo(const std::shared_ptr<UserTestRecord> &record)
977 {
978     userTestRecord_ = record;
979 }
980 
GetUserTestInfo()981 std::shared_ptr<UserTestRecord> AppRunningRecord::GetUserTestInfo()
982 {
983     return userTestRecord_;
984 }
985 
SetSpecifiedAbilityFlagAndWant(const bool flag,const AAFwk::Want & want,const std::string & moduleName)986 void AppRunningRecord::SetSpecifiedAbilityFlagAndWant(
987     const bool flag, const AAFwk::Want &want, const std::string &moduleName)
988 {
989     isSpecifiedAbility_ = flag;
990     SpecifiedWant_ = want;
991     moduleName_ = moduleName;
992 }
993 
IsStartSpecifiedAbility() const994 bool AppRunningRecord::IsStartSpecifiedAbility() const
995 {
996     return isSpecifiedAbility_;
997 }
998 
ScheduleAcceptWant(const std::string & moduleName)999 void AppRunningRecord::ScheduleAcceptWant(const std::string &moduleName)
1000 {
1001     SendEvent(
1002         AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT);
1003     appLifeCycleDeal_->ScheduleAcceptWant(SpecifiedWant_, moduleName);
1004 }
1005 
ScheduleAcceptWantDone()1006 void AppRunningRecord::ScheduleAcceptWantDone()
1007 {
1008     HILOG_INFO("Schedule accept want done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1009         static_cast<int>(eventId_));
1010     eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, eventId_);
1011 }
1012 
ApplicationTerminated()1013 void AppRunningRecord::ApplicationTerminated()
1014 {
1015     HILOG_DEBUG("Application terminated bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1016         static_cast<int>(eventId_));
1017 
1018     if (!eventHandler_) {
1019         HILOG_ERROR("eventHandler_ is nullptr");
1020         return;
1021     }
1022 
1023     eventHandler_->RemoveEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, eventId_);
1024 }
1025 
GetSpecifiedWant() const1026 const AAFwk::Want &AppRunningRecord::GetSpecifiedWant() const
1027 {
1028     return SpecifiedWant_;
1029 }
1030 
UpdateConfiguration(const Configuration & config)1031 void AppRunningRecord::UpdateConfiguration(const Configuration &config)
1032 {
1033     HILOG_INFO("call %{public}s", __func__);
1034     if (!appLifeCycleDeal_) {
1035         HILOG_INFO("appLifeCycleDeal_ is null");
1036         return;
1037     }
1038     appLifeCycleDeal_->UpdateConfiguration(config);
1039 }
1040 
SetRenderRecord(const std::shared_ptr<RenderRecord> & record)1041 void AppRunningRecord::SetRenderRecord(const std::shared_ptr<RenderRecord> &record)
1042 {
1043     renderRecord_ = record;
1044 }
1045 
GetRenderRecord()1046 std::shared_ptr<RenderRecord> AppRunningRecord::GetRenderRecord()
1047 {
1048     return renderRecord_;
1049 }
1050 
SetStartMsg(const AppSpawnStartMsg & msg)1051 void AppRunningRecord::SetStartMsg(const AppSpawnStartMsg &msg)
1052 {
1053     startMsg_ = msg;
1054 }
1055 
GetStartMsg()1056 AppSpawnStartMsg AppRunningRecord::GetStartMsg()
1057 {
1058     return startMsg_;
1059 }
1060 
SetDebugApp(bool isDebugApp)1061 void AppRunningRecord::SetDebugApp(bool isDebugApp)
1062 {
1063     HILOG_INFO("SetDebugApp come, value is %{public}d", isDebugApp);
1064     isDebugApp_ = isDebugApp;
1065 }
1066 
SetKilling()1067 void AppRunningRecord::SetKilling()
1068 {
1069     isKilling_ = true;
1070 }
1071 
IsKilling() const1072 bool AppRunningRecord::IsKilling() const
1073 {
1074     return isKilling_;
1075 }
1076 }  // namespace AppExecFwk
1077 }  // namespace OHOS