• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "app_running_record.h"
17 #include "app_mgr_service_inner.h"
18 #include "event_report.h"
19 #include "hitrace_meter.h"
20 #include "hilog_wrapper.h"
21 #include "ui_extension_utils.h"
22 
23 namespace OHOS {
24 namespace AppExecFwk {
25 namespace {
26 static constexpr int64_t NANOSECONDS = 1000000000;  // NANOSECONDS mean 10^9 nano second
27 static constexpr int64_t MICROSECONDS = 1000000;    // MICROSECONDS mean 10^6 millias second
28 constexpr int32_t MAX_RESTART_COUNT = 3;
29 constexpr int32_t RESTART_INTERVAL_TIME = 120000;
30 }
31 
32 int64_t AppRunningRecord::appEventId_ = 0;
33 
RenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,const std::shared_ptr<AppRunningRecord> & host)34 RenderRecord::RenderRecord(pid_t hostPid, const std::string &renderParam,
35                            int32_t ipcFd, int32_t sharedFd, int32_t crashFd,
36                            const std::shared_ptr<AppRunningRecord> &host)
37     : hostPid_(hostPid), renderParam_(renderParam), ipcFd_(ipcFd),
38       sharedFd_(sharedFd), crashFd_(crashFd), host_(host) {}
39 
~RenderRecord()40 RenderRecord::~RenderRecord()
41 {
42     close(sharedFd_);
43     close(ipcFd_);
44     close(crashFd_);
45 }
46 
CreateRenderRecord(pid_t hostPid,const std::string & renderParam,int32_t ipcFd,int32_t sharedFd,int32_t crashFd,const std::shared_ptr<AppRunningRecord> & host)47 std::shared_ptr<RenderRecord> RenderRecord::CreateRenderRecord(
48     pid_t hostPid, const std::string &renderParam, int32_t ipcFd,
49     int32_t sharedFd, int32_t crashFd,
50     const std::shared_ptr<AppRunningRecord> &host)
51 {
52     if (hostPid <= 0 || renderParam.empty() || ipcFd <= 0 || sharedFd <= 0 ||
53         crashFd <= 0 || !host) {
54         return nullptr;
55     }
56 
57     auto renderRecord = std::make_shared<RenderRecord>(
58         hostPid, renderParam, ipcFd, sharedFd, crashFd, host);
59     renderRecord->SetHostUid(host->GetUid());
60     renderRecord->SetHostBundleName(host->GetBundleName());
61     renderRecord->SetProcessName(host->GetProcessName());
62     return renderRecord;
63 }
64 
SetPid(pid_t pid)65 void RenderRecord::SetPid(pid_t pid)
66 {
67     pid_ = pid;
68 }
69 
GetPid() const70 pid_t RenderRecord::GetPid() const
71 {
72     return pid_;
73 }
74 
GetHostPid() const75 pid_t RenderRecord::GetHostPid() const
76 {
77     return hostPid_;
78 }
79 
SetUid(int32_t uid)80 void RenderRecord::SetUid(int32_t uid)
81 {
82     uid_ = uid;
83 }
84 
GetUid() const85 int32_t RenderRecord::GetUid() const
86 {
87     return uid_;
88 }
89 
SetHostUid(const int32_t hostUid)90 void RenderRecord::SetHostUid(const int32_t hostUid)
91 {
92     hostUid_ = hostUid;
93 }
94 
GetHostUid() const95 int32_t RenderRecord::GetHostUid() const
96 {
97     return hostUid_;
98 }
99 
SetHostBundleName(const std::string & hostBundleName)100 void RenderRecord::SetHostBundleName(const std::string &hostBundleName)
101 {
102     hostBundleName_ = hostBundleName;
103 }
104 
GetHostBundleName() const105 std::string RenderRecord::GetHostBundleName() const
106 {
107     return hostBundleName_;
108 }
109 
SetProcessName(const std::string & hostProcessName)110 void RenderRecord::SetProcessName(const std::string &hostProcessName)
111 {
112     processName_ = hostProcessName;
113 }
114 
GetProcessName() const115 std::string RenderRecord::GetProcessName() const
116 {
117     return processName_;
118 }
119 
GetRenderParam() const120 std::string RenderRecord::GetRenderParam() const
121 {
122     return renderParam_;
123 }
124 
GetIpcFd() const125 int32_t RenderRecord::GetIpcFd() const
126 {
127     return ipcFd_;
128 }
129 
GetSharedFd() const130 int32_t RenderRecord::GetSharedFd() const
131 {
132     return sharedFd_;
133 }
134 
GetCrashFd() const135 int32_t RenderRecord::GetCrashFd() const
136 {
137     return crashFd_;
138 }
139 
GetProcessType() const140 ProcessType RenderRecord::GetProcessType() const
141 {
142     return processType_;
143 }
144 
GetHostRecord() const145 std::shared_ptr<AppRunningRecord> RenderRecord::GetHostRecord() const
146 {
147     return host_.lock();
148 }
149 
GetScheduler() const150 sptr<IRenderScheduler> RenderRecord::GetScheduler() const
151 {
152     return renderScheduler_;
153 }
154 
SetScheduler(const sptr<IRenderScheduler> & scheduler)155 void RenderRecord::SetScheduler(const sptr<IRenderScheduler> &scheduler)
156 {
157     renderScheduler_ = scheduler;
158 }
159 
SetDeathRecipient(const sptr<AppDeathRecipient> recipient)160 void RenderRecord::SetDeathRecipient(const sptr<AppDeathRecipient> recipient)
161 {
162     deathRecipient_ = recipient;
163 }
164 
RegisterDeathRecipient()165 void RenderRecord::RegisterDeathRecipient()
166 {
167     if (renderScheduler_ && deathRecipient_) {
168         auto obj = renderScheduler_->AsObject();
169         if (!obj || !obj->AddDeathRecipient(deathRecipient_)) {
170             HILOG_ERROR("AddDeathRecipient failed.");
171         }
172     }
173 }
174 
AppRunningRecord(const std::shared_ptr<ApplicationInfo> & info,const int32_t recordId,const std::string & processName)175 AppRunningRecord::AppRunningRecord(
176     const std::shared_ptr<ApplicationInfo> &info, const int32_t recordId, const std::string &processName)
177     : appRecordId_(recordId), processName_(processName)
178 {
179     if (info) {
180         appInfo_ = info;
181         mainBundleName_ = info->bundleName;
182         isLauncherApp_ = info->isLauncherApp;
183         mainAppName_ = info->name;
184     }
185 
186     struct timespec t;
187     t.tv_sec = 0;
188     t.tv_nsec = 0;
189     clock_gettime(CLOCK_MONOTONIC, &t);
190     startTimeMillis_ = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
191 }
192 
SetApplicationClient(const sptr<IAppScheduler> & thread)193 void AppRunningRecord::SetApplicationClient(const sptr<IAppScheduler> &thread)
194 {
195     if (!appLifeCycleDeal_) {
196         appLifeCycleDeal_ = std::make_shared<AppLifeCycleDeal>();
197     }
198     appLifeCycleDeal_->SetApplicationClient(thread);
199 
200     auto moduleRecordList = GetAllModuleRecord();
201     if (moduleRecordList.empty()) {
202         HILOG_ERROR("moduleRecordList is empty");
203         return;
204     }
205     for (const auto &moduleRecord : moduleRecordList) {
206         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
207     }
208 }
209 
GetBundleName() const210 const std::string &AppRunningRecord::GetBundleName() const
211 {
212     return mainBundleName_;
213 }
214 
GetCallerPid() const215 int32_t AppRunningRecord::GetCallerPid() const
216 {
217     return callerPid_;
218 }
219 
SetCallerPid(int32_t pid)220 void AppRunningRecord::SetCallerPid(int32_t pid)
221 {
222     callerPid_ = pid;
223 }
224 
GetCallerUid() const225 int32_t AppRunningRecord::GetCallerUid() const
226 {
227     return callerUid_;
228 }
229 
SetCallerUid(int32_t uid)230 void AppRunningRecord::SetCallerUid(int32_t uid)
231 {
232     callerUid_ = uid;
233 }
234 
GetCallerTokenId() const235 int32_t AppRunningRecord::GetCallerTokenId() const
236 {
237     return callerTokenId_;
238 }
239 
SetCallerTokenId(int32_t tokenId)240 void AppRunningRecord::SetCallerTokenId(int32_t tokenId)
241 {
242     callerTokenId_ = tokenId;
243 }
244 
IsLauncherApp() const245 bool AppRunningRecord::IsLauncherApp() const
246 {
247     return isLauncherApp_;
248 }
249 
GetRecordId() const250 int32_t AppRunningRecord::GetRecordId() const
251 {
252     return appRecordId_;
253 }
254 
GetName() const255 const std::string &AppRunningRecord::GetName() const
256 {
257     return mainAppName_;
258 }
259 
GetSignCode() const260 const std::string &AppRunningRecord::GetSignCode() const
261 {
262     return signCode_;
263 }
264 
SetSignCode(const std::string & signCode)265 void AppRunningRecord::SetSignCode(const std::string &signCode)
266 {
267     signCode_ = signCode;
268 }
269 
GetJointUserId() const270 const std::string &AppRunningRecord::GetJointUserId() const
271 {
272     return jointUserId_;
273 }
274 
SetJointUserId(const std::string & jointUserId)275 void AppRunningRecord::SetJointUserId(const std::string &jointUserId)
276 {
277     jointUserId_ = jointUserId;
278 }
279 
GetProcessName() const280 const std::string &AppRunningRecord::GetProcessName() const
281 {
282     return processName_;
283 }
284 
GetUid() const285 int32_t AppRunningRecord::GetUid() const
286 {
287     return mainUid_;
288 }
289 
SetUid(const int32_t uid)290 void AppRunningRecord::SetUid(const int32_t uid)
291 {
292     mainUid_ = uid;
293 }
294 
GetState() const295 ApplicationState AppRunningRecord::GetState() const
296 {
297     return curState_;
298 }
299 
SetState(const ApplicationState state)300 void AppRunningRecord::SetState(const ApplicationState state)
301 {
302     if (state >= ApplicationState::APP_STATE_END) {
303         HILOG_ERROR("Invalid application state");
304         return;
305     }
306     if (state == ApplicationState::APP_STATE_FOREGROUND || state == ApplicationState::APP_STATE_BACKGROUND) {
307         restartResidentProcCount_ = MAX_RESTART_COUNT;
308     }
309     curState_ = state;
310 }
311 
SetRestartTimeMillis(const int64_t restartTimeMillis)312 void AppRunningRecord::SetRestartTimeMillis(const int64_t restartTimeMillis)
313 {
314     restartTimeMillis_ = restartTimeMillis;
315 }
316 
GetAppInfoList()317 const std::list<std::shared_ptr<ApplicationInfo>> AppRunningRecord::GetAppInfoList()
318 {
319     std::list<std::shared_ptr<ApplicationInfo>> appInfoList;
320     std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
321     for (const auto &item : appInfos_) {
322         appInfoList.push_back(item.second);
323     }
324     return appInfoList;
325 }
326 
GetAbilities()327 const std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> AppRunningRecord::GetAbilities()
328 {
329     std::map<const sptr<IRemoteObject>, std::shared_ptr<AbilityRunningRecord>> abilitysMap;
330     auto moduleRecordList = GetAllModuleRecord();
331     for (const auto &moduleRecord : moduleRecordList) {
332         auto abilities = moduleRecord->GetAbilities();
333         abilitysMap.insert(abilities.begin(), abilities.end());
334     }
335     return abilitysMap;
336 }
337 
GetApplicationClient() const338 sptr<IAppScheduler> AppRunningRecord::GetApplicationClient() const
339 {
340     return (appLifeCycleDeal_ ? appLifeCycleDeal_->GetApplicationClient() : nullptr);
341 }
342 
GetAbilityRunningRecord(const int64_t eventId) const343 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const
344 {
345     HILOG_INFO("Get ability running record by eventId.");
346     auto moduleRecordList = GetAllModuleRecord();
347     for (const auto &moduleRecord : moduleRecordList) {
348         auto abilityRecord = moduleRecord->GetAbilityRunningRecord(eventId);
349         if (abilityRecord) {
350             return abilityRecord;
351         }
352     }
353 
354     return nullptr;
355 }
356 
RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> & moduleRecord)357 void AppRunningRecord::RemoveModuleRecord(const std::shared_ptr<ModuleRunningRecord> &moduleRecord)
358 {
359     HILOG_INFO("Remove module record.");
360 
361     std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
362     for (auto &item : hapModules_) {
363         auto iter = std::find_if(item.second.begin(),
364             item.second.end(),
365             [&moduleRecord](const std::shared_ptr<ModuleRunningRecord> &record) { return moduleRecord == record; });
366         if (iter != item.second.end()) {
367             iter = item.second.erase(iter);
368             if (item.second.empty()) {
369                 {
370                     std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
371                     appInfos_.erase(item.first);
372                 }
373                 hapModules_.erase(item.first);
374             }
375             return;
376         }
377     }
378 }
379 
ForceKillApp(const std::string & reason) const380 void AppRunningRecord::ForceKillApp([[maybe_unused]] const std::string &reason) const
381 {}
382 
ScheduleAppCrash(const std::string & description) const383 void AppRunningRecord::ScheduleAppCrash([[maybe_unused]] const std::string &description) const
384 {}
385 
LaunchApplication(const Configuration & config)386 void AppRunningRecord::LaunchApplication(const Configuration &config)
387 {
388     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
389     if (appLifeCycleDeal_ == nullptr) {
390         HILOG_ERROR("appLifeCycleDeal_ is null");
391         return;
392     }
393     if (!appLifeCycleDeal_->GetApplicationClient()) {
394         HILOG_ERROR("appThread is null");
395         return;
396     }
397     AppLaunchData launchData;
398     {
399         std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
400         auto moduleRecords = appInfos_.find(mainBundleName_);
401         if (moduleRecords != appInfos_.end()) {
402             launchData.SetApplicationInfo(*(moduleRecords->second));
403         }
404     }
405     ProcessInfo processInfo(processName_, GetPriorityObject()->GetPid());
406     launchData.SetProcessInfo(processInfo);
407     launchData.SetRecordId(appRecordId_);
408     launchData.SetUId(mainUid_);
409     launchData.SetUserTestInfo(userTestRecord_);
410     launchData.SetAppIndex(appIndex_);
411     HILOG_INFO("Schedule launch application, app is %{public}s.", GetName().c_str());
412     appLifeCycleDeal_->LaunchApplication(launchData, config);
413 }
414 
UpdateApplicationInfoInstalled(const ApplicationInfo & appInfo)415 void AppRunningRecord::UpdateApplicationInfoInstalled(const ApplicationInfo &appInfo)
416 {
417     if (!isStageBasedModel_) {
418         HILOG_INFO("Current version than supports !");
419         return;
420     }
421 
422     if (appLifeCycleDeal_ == nullptr) {
423         HILOG_ERROR("appLifeCycleDeal_ is null");
424         return;
425     }
426     appLifeCycleDeal_->UpdateApplicationInfoInstalled(appInfo);
427 }
428 
AddAbilityStage()429 void AppRunningRecord::AddAbilityStage()
430 {
431     if (!isStageBasedModel_) {
432         HILOG_INFO("Current version than supports !");
433         return;
434     }
435     HapModuleInfo abilityStage;
436     if (GetTheModuleInfoNeedToUpdated(mainBundleName_, abilityStage)) {
437         SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG, AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
438         HILOG_INFO("Current Informed module : [%{public}s] | bundle : [%{public}s]",
439             abilityStage.moduleName.c_str(), mainBundleName_.c_str());
440         if (appLifeCycleDeal_ == nullptr) {
441             HILOG_WARN("appLifeCycleDeal_ is null");
442             return;
443         }
444         appLifeCycleDeal_->AddAbilityStage(abilityStage);
445     }
446 }
447 
AddAbilityStageBySpecifiedAbility(const std::string & bundleName)448 void AppRunningRecord::AddAbilityStageBySpecifiedAbility(const std::string &bundleName)
449 {
450     if (!eventHandler_) {
451         HILOG_ERROR("eventHandler_ is nullptr");
452         return;
453     }
454 
455     HapModuleInfo hapModuleInfo;
456     if (GetTheModuleInfoNeedToUpdated(bundleName, hapModuleInfo)) {
457         if (startProcessSpecifiedAbilityEventId_ == 0) {
458             HILOG_INFO("%{public}s START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG is not exist.", __func__);
459             SendEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
460                 AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT);
461         }
462         if (appLifeCycleDeal_ == nullptr) {
463             HILOG_WARN("appLifeCycleDeal_ is null");
464             return;
465         }
466         appLifeCycleDeal_->AddAbilityStage(hapModuleInfo);
467     }
468 }
469 
AddAbilityStageDone()470 void AppRunningRecord::AddAbilityStageDone()
471 {
472     HILOG_INFO("Add ability stage done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
473         static_cast<int>(eventId_));
474 
475     if (!eventHandler_) {
476         HILOG_ERROR("eventHandler_ is nullptr");
477         return;
478     }
479 
480     if (startProcessSpecifiedAbilityEventId_ != 0) {
481         eventHandler_->RemoveEvent(AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG,
482             startProcessSpecifiedAbilityEventId_);
483         startProcessSpecifiedAbilityEventId_ = 0;
484     }
485     if (addAbilityStageInfoEventId_ != 0) {
486         eventHandler_->RemoveEvent(AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG,
487             addAbilityStageInfoEventId_);
488         addAbilityStageInfoEventId_ = 0;
489     }
490     // Should proceed to the next notification
491 
492     if (isSpecifiedAbility_) {
493         ScheduleAcceptWant(moduleName_);
494         return;
495     }
496 
497     AddAbilityStage();
498 }
499 
LaunchAbility(const std::shared_ptr<AbilityRunningRecord> & ability)500 void AppRunningRecord::LaunchAbility(const std::shared_ptr<AbilityRunningRecord> &ability)
501 {
502     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
503     if (appLifeCycleDeal_ == nullptr) {
504         HILOG_ERROR("appLifeCycleDeal_ is null");
505         return;
506     }
507     if (!ability || !ability->GetToken()) {
508         HILOG_ERROR("abilityRecord or abilityToken is nullptr.");
509         return;
510     }
511 
512     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
513     if (!moduleRecord) {
514         HILOG_ERROR("moduleRecord is nullptr");
515         return;
516     }
517 
518     moduleRecord->LaunchAbility(ability);
519 }
520 
ScheduleTerminate()521 void AppRunningRecord::ScheduleTerminate()
522 {
523     SendEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT);
524     if (appLifeCycleDeal_ == nullptr) {
525         HILOG_WARN("appLifeCycleDeal_ is null");
526         return;
527     }
528     appLifeCycleDeal_->ScheduleTerminate();
529 }
530 
LaunchPendingAbilities()531 void AppRunningRecord::LaunchPendingAbilities()
532 {
533     HILOG_DEBUG("Launch pending abilities.");
534 
535     auto moduleRecordList = GetAllModuleRecord();
536     if (moduleRecordList.empty()) {
537         HILOG_ERROR("moduleRecordList is empty");
538         return;
539     }
540     for (const auto &moduleRecord : moduleRecordList) {
541         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
542         moduleRecord->LaunchPendingAbilities();
543     }
544 }
ScheduleForegroundRunning()545 void AppRunningRecord::ScheduleForegroundRunning()
546 {
547     if (appLifeCycleDeal_) {
548         appLifeCycleDeal_->ScheduleForegroundRunning();
549     }
550 }
551 
ScheduleBackgroundRunning()552 void AppRunningRecord::ScheduleBackgroundRunning()
553 {
554     if (appLifeCycleDeal_) {
555         appLifeCycleDeal_->ScheduleBackgroundRunning();
556     }
557     isAbilityForegrounding_.store(false);
558 }
559 
ScheduleProcessSecurityExit()560 void AppRunningRecord::ScheduleProcessSecurityExit()
561 {
562     if (appLifeCycleDeal_) {
563         appLifeCycleDeal_->ScheduleProcessSecurityExit();
564     }
565 }
566 
ScheduleTrimMemory()567 void AppRunningRecord::ScheduleTrimMemory()
568 {
569     if (appLifeCycleDeal_ && priorityObject_) {
570         appLifeCycleDeal_->ScheduleTrimMemory(priorityObject_->GetTimeLevel());
571     }
572 }
573 
ScheduleMemoryLevel(int32_t level)574 void AppRunningRecord::ScheduleMemoryLevel(int32_t level)
575 {
576     if (appLifeCycleDeal_) {
577         appLifeCycleDeal_->ScheduleMemoryLevel(level);
578     }
579 }
580 
ScheduleHeapMemory(const int32_t pid,OHOS::AppExecFwk::MallocInfo & mallocInfo)581 void AppRunningRecord::ScheduleHeapMemory(const int32_t pid, OHOS::AppExecFwk::MallocInfo &mallocInfo)
582 {
583     if (appLifeCycleDeal_) {
584         appLifeCycleDeal_->ScheduleHeapMemory(pid, mallocInfo);
585     }
586 }
587 
LowMemoryWarning()588 void AppRunningRecord::LowMemoryWarning()
589 {
590     if (appLifeCycleDeal_) {
591         appLifeCycleDeal_->LowMemoryWarning();
592     }
593 }
594 
AddModules(const std::shared_ptr<ApplicationInfo> & appInfo,const std::vector<HapModuleInfo> & moduleInfos)595 void AppRunningRecord::AddModules(
596     const std::shared_ptr<ApplicationInfo> &appInfo, const std::vector<HapModuleInfo> &moduleInfos)
597 {
598     HILOG_DEBUG("Add modules");
599 
600     if (moduleInfos.empty()) {
601         HILOG_INFO("moduleInfos is empty.");
602         return;
603     }
604 
605     for (auto &iter : moduleInfos) {
606         AddModule(appInfo, nullptr, nullptr, iter, nullptr);
607     }
608 }
609 
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)610 void AppRunningRecord::AddModule(const std::shared_ptr<ApplicationInfo> &appInfo,
611     const std::shared_ptr<AbilityInfo> &abilityInfo, const sptr<IRemoteObject> &token,
612     const HapModuleInfo &hapModuleInfo, const std::shared_ptr<AAFwk::Want> &want)
613 {
614     HILOG_INFO("Add module.");
615 
616     if (!appInfo) {
617         HILOG_ERROR("appInfo is null");
618         return;
619     }
620 
621     std::shared_ptr<ModuleRunningRecord> moduleRecord;
622 
623     auto initModuleRecord = [=](const std::shared_ptr<ModuleRunningRecord> &moduleRecord) {
624         moduleRecord->Init(hapModuleInfo);
625         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
626         moduleRecord->SetApplicationClient(appLifeCycleDeal_);
627     };
628 
629     std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
630     const auto &iter = hapModules_.find(appInfo->bundleName);
631     if (iter != hapModules_.end()) {
632         moduleRecord = GetModuleRecordByModuleName(appInfo->bundleName, hapModuleInfo.moduleName);
633         if (!moduleRecord) {
634             moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
635             iter->second.push_back(moduleRecord);
636             initModuleRecord(moduleRecord);
637         }
638     } else {
639         moduleRecord = std::make_shared<ModuleRunningRecord>(appInfo, eventHandler_);
640         std::vector<std::shared_ptr<ModuleRunningRecord>> moduleList;
641         moduleList.push_back(moduleRecord);
642         hapModules_.emplace(appInfo->bundleName, moduleList);
643         {
644             std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
645             appInfos_.emplace(appInfo->bundleName, appInfo);
646         }
647         initModuleRecord(moduleRecord);
648     }
649 
650     if (!abilityInfo || !token) {
651         HILOG_ERROR("abilityInfo or token is nullptr");
652         return;
653     }
654     moduleRecord->AddAbility(token, abilityInfo, want);
655 
656     return;
657 }
658 
GetModuleRecordByModuleName(const std::string bundleName,const std::string & moduleName)659 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRecordByModuleName(
660     const std::string bundleName, const std::string &moduleName)
661 {
662     HILOG_INFO("Get module record by module name.");
663     auto moduleRecords = hapModules_.find(bundleName);
664     if (moduleRecords != hapModules_.end()) {
665         for (auto &iter : moduleRecords->second) {
666             if (iter->GetModuleName() == moduleName) {
667                 return iter;
668             }
669         }
670     }
671 
672     return nullptr;
673 }
674 
StateChangedNotifyObserver(const std::shared_ptr<AbilityRunningRecord> & ability,const int32_t state,bool isAbility)675 void AppRunningRecord::StateChangedNotifyObserver(
676     const std::shared_ptr<AbilityRunningRecord> &ability, const int32_t state, bool isAbility)
677 {
678     if (!ability || ability->GetAbilityInfo() == nullptr) {
679         HILOG_ERROR("ability is null");
680         return;
681     }
682     AbilityStateData abilityStateData;
683     abilityStateData.bundleName = ability->GetAbilityInfo()->applicationInfo.bundleName;
684     abilityStateData.moduleName = ability->GetAbilityInfo()->moduleName;
685     abilityStateData.abilityName = ability->GetName();
686     abilityStateData.pid = GetPriorityObject()->GetPid();
687     abilityStateData.abilityState = state;
688     abilityStateData.uid = ability->GetAbilityInfo()->applicationInfo.uid;
689     abilityStateData.token = ability->GetToken();
690     abilityStateData.abilityType = static_cast<int32_t>(ability->GetAbilityInfo()->type);
691     abilityStateData.isFocused = ability->GetFocusFlag();
692 
693     if (isAbility && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
694         HILOG_INFO("extension type, not notify any more.");
695         return;
696     }
697     auto serviceInner = appMgrServiceInner_.lock();
698     if (serviceInner) {
699         serviceInner->StateChangedNotifyObserver(abilityStateData, isAbility);
700     }
701 }
702 
GetModuleRunningRecordByToken(const sptr<IRemoteObject> & token) const703 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByToken(
704     const sptr<IRemoteObject> &token) const
705 {
706     if (!token) {
707         HILOG_ERROR("token is null");
708         return nullptr;
709     }
710 
711     auto moduleRecordList = GetAllModuleRecord();
712     for (const auto &moduleRecord : moduleRecordList) {
713         if (moduleRecord && moduleRecord->GetAbilityRunningRecordByToken(token)) {
714             return moduleRecord;
715         }
716     }
717 
718     return nullptr;
719 }
720 
GetModuleRunningRecordByTerminateLists(const sptr<IRemoteObject> & token) const721 std::shared_ptr<ModuleRunningRecord> AppRunningRecord::GetModuleRunningRecordByTerminateLists(
722     const sptr<IRemoteObject> &token) const
723 {
724     if (!token) {
725         HILOG_ERROR("token is null");
726         return nullptr;
727     }
728 
729     auto moduleRecordList = GetAllModuleRecord();
730     for (const auto &moduleRecord : moduleRecordList) {
731         if (moduleRecord && moduleRecord->GetAbilityByTerminateLists(token)) {
732             return moduleRecord;
733         }
734     }
735 
736     return nullptr;
737 }
738 
GetAbilityRunningRecordByToken(const sptr<IRemoteObject> & token) const739 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityRunningRecordByToken(
740     const sptr<IRemoteObject> &token) const
741 {
742     auto moduleRecord = GetModuleRunningRecordByToken(token);
743     if (!moduleRecord) {
744         return nullptr;
745     }
746     return moduleRecord->GetAbilityRunningRecordByToken(token);
747 }
748 
GetAbilityByTerminateLists(const sptr<IRemoteObject> & token) const749 std::shared_ptr<AbilityRunningRecord> AppRunningRecord::GetAbilityByTerminateLists(
750     const sptr<IRemoteObject> &token) const
751 {
752     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
753     if (!moduleRecord) {
754         return nullptr;
755     }
756     return moduleRecord->GetAbilityByTerminateLists(token);
757 }
758 
UpdateAbilityFocusState(const sptr<IRemoteObject> & token,bool isFocus)759 bool AppRunningRecord::UpdateAbilityFocusState(const sptr<IRemoteObject> &token, bool isFocus)
760 {
761     HILOG_INFO("focus state is :%{public}d", isFocus);
762     auto abilityRecord = GetAbilityRunningRecordByToken(token);
763     if (!abilityRecord) {
764         HILOG_ERROR("can not find ability record");
765         return false;
766     }
767 
768     bool lastFocusState = abilityRecord->GetFocusFlag();
769     if (lastFocusState == isFocus) {
770         HILOG_ERROR("focus state not change, no need update");
771         return false;
772     }
773 
774     if (isFocus) {
775         return AbilityFocused(abilityRecord);
776     } else {
777         return AbilityUnfocused(abilityRecord);
778     }
779 }
780 
UpdateAbilityState(const sptr<IRemoteObject> & token,const AbilityState state)781 void AppRunningRecord::UpdateAbilityState(const sptr<IRemoteObject> &token, const AbilityState state)
782 {
783     HILOG_INFO("state is :%{public}d", static_cast<int32_t>(state));
784     auto abilityRecord = GetAbilityRunningRecordByToken(token);
785     if (!abilityRecord) {
786         HILOG_ERROR("can not find ability record");
787         return;
788     }
789     if (state == abilityRecord->GetState()) {
790         HILOG_ERROR("current state is already, no need update");
791         return;
792     }
793 
794     if (state == AbilityState::ABILITY_STATE_FOREGROUND) {
795         AbilityForeground(abilityRecord);
796     } else if (state == AbilityState::ABILITY_STATE_BACKGROUND) {
797         AbilityBackground(abilityRecord);
798     } else {
799         HILOG_WARN("wrong state");
800     }
801 }
802 
AbilityForeground(const std::shared_ptr<AbilityRunningRecord> & ability)803 void AppRunningRecord::AbilityForeground(const std::shared_ptr<AbilityRunningRecord> &ability)
804 {
805     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
806     if (!ability) {
807         HILOG_ERROR("ability is null");
808         return;
809     }
810     AbilityState curAbilityState = ability->GetState();
811     if (curAbilityState != AbilityState::ABILITY_STATE_READY &&
812         curAbilityState != AbilityState::ABILITY_STATE_BACKGROUND) {
813         HILOG_ERROR("ability state(%{public}d) error", static_cast<int32_t>(curAbilityState));
814         return;
815     }
816 
817     // We need schedule application to foregrounded when current application state is ready or background running.
818     if (curState_ == ApplicationState::APP_STATE_READY || curState_ == ApplicationState::APP_STATE_BACKGROUND) {
819         if (foregroundingAbilityTokens_.empty()) {
820             ScheduleForegroundRunning();
821         }
822         foregroundingAbilityTokens_.push_back(ability->GetToken());
823         if (curState_ == ApplicationState::APP_STATE_BACKGROUND) {
824             SendAppStartupTypeEvent(ability, AppStartType::HOT);
825         }
826         return;
827     } else if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
828         // Just change ability to foreground if current application state is foreground or focus.
829         auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
830         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
831         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
832         auto serviceInner = appMgrServiceInner_.lock();
833         if (serviceInner) {
834             serviceInner->OnAppStateChanged(shared_from_this(), curState_, false);
835         }
836     } else {
837         HILOG_WARN("wrong application state");
838     }
839 }
840 
AbilityBackground(const std::shared_ptr<AbilityRunningRecord> & ability)841 void AppRunningRecord::AbilityBackground(const std::shared_ptr<AbilityRunningRecord> &ability)
842 {
843     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
844     if (!ability) {
845         HILOG_ERROR("ability is null");
846         return;
847     }
848     if (ability->GetState() != AbilityState::ABILITY_STATE_FOREGROUND &&
849         ability->GetState() != AbilityState::ABILITY_STATE_READY) {
850         HILOG_ERROR("ability state is not foreground or focus");
851         return;
852     }
853 
854     // First change ability to background.
855     auto moduleRecord = GetModuleRunningRecordByToken(ability->GetToken());
856     moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_BACKGROUND);
857     StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_BACKGROUND), true);
858     if (curState_ == ApplicationState::APP_STATE_FOREGROUND) {
859         int32_t foregroundSize = 0;
860         auto abilitiesMap = GetAbilities();
861         for (const auto &item : abilitiesMap) {
862             const auto &abilityRecord = item.second;
863             if (abilityRecord && abilityRecord->GetState() == AbilityState::ABILITY_STATE_FOREGROUND &&
864                 abilityRecord->GetAbilityInfo() &&
865                 (abilityRecord->GetAbilityInfo()->type == AppExecFwk::AbilityType::PAGE
866                 || AAFwk::UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo()->extensionAbilityType))) {
867                 foregroundSize++;
868                 break;
869             }
870         }
871 
872         // Then schedule application background when all ability is not foreground.
873         if (foregroundSize == 0) {
874             ScheduleBackgroundRunning();
875         }
876     } else {
877         HILOG_WARN("wrong application state");
878     }
879 }
880 
AbilityFocused(const std::shared_ptr<AbilityRunningRecord> & ability)881 bool AppRunningRecord::AbilityFocused(const std::shared_ptr<AbilityRunningRecord> &ability)
882 {
883     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
884     if (!ability) {
885         HILOG_ERROR("ability is null");
886         return false;
887     }
888     ability->UpdateFocusState(true);
889 
890     // update ability state
891     int32_t abilityState = static_cast<int32_t>(ability->GetState());
892     bool isAbility = true;
893     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
894         isAbility = false;
895     }
896     StateChangedNotifyObserver(ability, abilityState, isAbility);
897 
898     if (isFocused_) {
899         // process state is already focused, no need update process state.
900         return false;
901     }
902 
903     // update process focus state to true.
904     isFocused_ = true;
905     return true;
906 }
907 
AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> & ability)908 bool AppRunningRecord::AbilityUnfocused(const std::shared_ptr<AbilityRunningRecord> &ability)
909 {
910     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
911     if (!ability) {
912         HILOG_ERROR("ability is null");
913         return false;
914     }
915     ability->UpdateFocusState(false);
916 
917     // update ability state to unfocused.
918     int32_t abilityState = static_cast<int32_t>(ability->GetState());
919     bool isAbility = true;
920     if (ability->GetAbilityInfo() != nullptr && ability->GetAbilityInfo()->type == AbilityType::EXTENSION) {
921         isAbility = false;
922     }
923     StateChangedNotifyObserver(ability, abilityState, isAbility);
924 
925     if (!isFocused_) {
926         return false; // invalid process focus state, already unfocused, process state not change.
927     }
928 
929     bool changeProcessToUnfocused = true;
930     auto abilitysMap = GetAbilities();
931     for (const auto &item : abilitysMap) {
932         const auto &abilityRecord = item.second;
933         if (abilityRecord && abilityRecord->GetFocusFlag()) {
934             changeProcessToUnfocused = false;
935             break;
936         }
937     }
938 
939     if (changeProcessToUnfocused) {
940         isFocused_ = false; // process focus state : from focus to unfocus.
941     }
942     return changeProcessToUnfocused;
943 }
944 
PopForegroundingAbilityTokens()945 void AppRunningRecord::PopForegroundingAbilityTokens()
946 {
947     while (!foregroundingAbilityTokens_.empty()) {
948         const auto &token = foregroundingAbilityTokens_.front();
949         auto ability = GetAbilityRunningRecordByToken(token);
950         auto moduleRecord = GetModuleRunningRecordByToken(token);
951         moduleRecord->OnAbilityStateChanged(ability, AbilityState::ABILITY_STATE_FOREGROUND);
952         StateChangedNotifyObserver(ability, static_cast<int32_t>(AbilityState::ABILITY_STATE_FOREGROUND), true);
953         foregroundingAbilityTokens_.pop_front();
954     }
955 }
956 
TerminateAbility(const sptr<IRemoteObject> & token,const bool isForce)957 void AppRunningRecord::TerminateAbility(const sptr<IRemoteObject> &token, const bool isForce)
958 {
959     HILOG_INFO("Terminate ability, isForce: %{public}d", static_cast<int>(isForce));
960 
961     auto moduleRecord = GetModuleRunningRecordByToken(token);
962     if (!moduleRecord) {
963         HILOG_ERROR("can not find module record");
964         return;
965     }
966 
967     auto abilityRecord = GetAbilityRunningRecordByToken(token);
968     StateChangedNotifyObserver(abilityRecord, static_cast<int32_t>(AbilityState::ABILITY_STATE_TERMINATED), true);
969     moduleRecord->TerminateAbility(shared_from_this(), token, isForce);
970 }
971 
AbilityTerminated(const sptr<IRemoteObject> & token)972 void AppRunningRecord::AbilityTerminated(const sptr<IRemoteObject> &token)
973 {
974     HILOG_INFO("AbilityTerminated come.");
975     auto moduleRecord = GetModuleRunningRecordByTerminateLists(token);
976     if (!moduleRecord) {
977         HILOG_ERROR("AbilityTerminated error, can not find module record");
978         return;
979     }
980     moduleRecord->AbilityTerminated(token);
981 
982     if (moduleRecord->GetAbilities().empty() && !IsKeepAliveApp()) {
983         RemoveModuleRecord(moduleRecord);
984     }
985 
986     auto moduleRecordList = GetAllModuleRecord();
987     if (moduleRecordList.empty() && !IsKeepAliveApp()) {
988         ScheduleTerminate();
989     }
990 }
991 
GetAllModuleRecord() const992 std::list<std::shared_ptr<ModuleRunningRecord>> AppRunningRecord::GetAllModuleRecord() const
993 {
994     std::list<std::shared_ptr<ModuleRunningRecord>> moduleRecordList;
995     std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
996     for (const auto &item : hapModules_) {
997         for (const auto &list : item.second) {
998             moduleRecordList.push_back(list);
999         }
1000     }
1001     return moduleRecordList;
1002 }
1003 
RegisterAppDeathRecipient() const1004 void AppRunningRecord::RegisterAppDeathRecipient() const
1005 {
1006     if (appLifeCycleDeal_ == nullptr) {
1007         HILOG_ERROR("appLifeCycleDeal_ is null");
1008         return;
1009     }
1010     if (!appLifeCycleDeal_->GetApplicationClient()) {
1011         HILOG_ERROR("appThread is nullptr");
1012         return;
1013     }
1014     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
1015     if (!object || !object->AddDeathRecipient(appDeathRecipient_)) {
1016         HILOG_ERROR("AddDeathRecipient failed.");
1017     }
1018 }
1019 
RemoveAppDeathRecipient() const1020 void AppRunningRecord::RemoveAppDeathRecipient() const
1021 {
1022     if (appLifeCycleDeal_ == nullptr) {
1023         HILOG_ERROR("appLifeCycleDeal_ is null");
1024         return;
1025     }
1026     if (!appLifeCycleDeal_->GetApplicationClient()) {
1027         HILOG_ERROR("appThread is nullptr.");
1028         return;
1029     }
1030     auto object = appLifeCycleDeal_->GetApplicationClient()->AsObject();
1031     if (object) {
1032         object->RemoveDeathRecipient(appDeathRecipient_);
1033     }
1034 }
1035 
SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> & inner)1036 void AppRunningRecord::SetAppMgrServiceInner(const std::weak_ptr<AppMgrServiceInner> &inner)
1037 {
1038     appMgrServiceInner_ = inner;
1039 
1040     auto moduleRecordList = GetAllModuleRecord();
1041     if (moduleRecordList.empty()) {
1042         HILOG_ERROR("moduleRecordList is empty");
1043         return;
1044     }
1045 
1046     for (const auto &moduleRecord : moduleRecordList) {
1047         moduleRecord->SetAppMgrServiceInner(appMgrServiceInner_);
1048     }
1049 }
1050 
SetAppDeathRecipient(const sptr<AppDeathRecipient> & appDeathRecipient)1051 void AppRunningRecord::SetAppDeathRecipient(const sptr<AppDeathRecipient> &appDeathRecipient)
1052 {
1053     appDeathRecipient_ = appDeathRecipient;
1054 }
1055 
GetPriorityObject()1056 std::shared_ptr<PriorityObject> AppRunningRecord::GetPriorityObject()
1057 {
1058     if (!priorityObject_) {
1059         priorityObject_ = std::make_shared<PriorityObject>();
1060     }
1061 
1062     return priorityObject_;
1063 }
1064 
SendEventForSpecifiedAbility(uint32_t msg,int64_t timeOut)1065 void AppRunningRecord::SendEventForSpecifiedAbility(uint32_t msg, int64_t timeOut)
1066 {
1067     SendEvent(msg, timeOut);
1068 }
1069 
SendAppStartupTypeEvent(const std::shared_ptr<AbilityRunningRecord> & ability,const AppStartType startType)1070 void AppRunningRecord::SendAppStartupTypeEvent(const std::shared_ptr<AbilityRunningRecord> &ability,
1071     const AppStartType startType)
1072 {
1073     if (!ability) {
1074         HILOG_ERROR("AbilityRunningRecord is nullptr");
1075         return;
1076     }
1077     AAFwk::EventInfo eventInfo;
1078     auto applicationInfo = GetApplicationInfo();
1079     if (!applicationInfo) {
1080         HILOG_ERROR("applicationInfo is nullptr, can not get app information");
1081     } else {
1082         eventInfo.bundleName = applicationInfo->name;
1083         eventInfo.versionName = applicationInfo->versionName;
1084         eventInfo.versionCode = applicationInfo->versionCode;
1085     }
1086 
1087     auto abilityInfo = ability->GetAbilityInfo();
1088     if (!abilityInfo) {
1089         HILOG_ERROR("abilityInfo is nullptr, can not get ability information");
1090     } else {
1091         eventInfo.abilityName = abilityInfo->name;
1092     }
1093     if (GetPriorityObject() == nullptr) {
1094         HILOG_ERROR("appRecord's priorityObject is null");
1095     } else {
1096         eventInfo.pid = GetPriorityObject()->GetPid();
1097     }
1098     eventInfo.startType = static_cast<int32_t>(startType);
1099     AAFwk::EventReport::SendAppEvent(AAFwk::EventName::APP_STARTUP_TYPE, HiSysEventType::BEHAVIOR, eventInfo);
1100 }
1101 
SendEvent(uint32_t msg,int64_t timeOut)1102 void AppRunningRecord::SendEvent(uint32_t msg, int64_t timeOut)
1103 {
1104     if (!eventHandler_) {
1105         HILOG_ERROR("eventHandler_ is nullptr");
1106         return;
1107     }
1108 
1109     if (isDebugApp_ || isNativeDebug_) {
1110         HILOG_INFO("Is debug mode, no need to handle time out.");
1111         return;
1112     }
1113 
1114     appEventId_++;
1115     eventId_ = appEventId_;
1116     if (msg == AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG) {
1117         startProcessSpecifiedAbilityEventId_ = eventId_;
1118     }
1119     if (msg == AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG) {
1120         addAbilityStageInfoEventId_ = eventId_;
1121     }
1122 
1123     HILOG_INFO("eventId %{public}d", static_cast<int>(eventId_));
1124     eventHandler_->SendEvent(AAFwk::EventWrap(msg, eventId_), timeOut, false);
1125     SendClearTask(msg, timeOut);
1126 }
1127 
SendClearTask(uint32_t msg,int64_t timeOut)1128 void AppRunningRecord::SendClearTask(uint32_t msg, int64_t timeOut)
1129 {
1130     if (!taskHandler_) {
1131         HILOG_ERROR("taskHandler_ is nullptr");
1132         return;
1133     }
1134     int64_t* eventId = nullptr;
1135     if (msg == AMSEventHandler::START_PROCESS_SPECIFIED_ABILITY_TIMEOUT_MSG) {
1136         eventId = &startProcessSpecifiedAbilityEventId_;
1137     } else if (msg == AMSEventHandler::ADD_ABILITY_STAGE_INFO_TIMEOUT_MSG) {
1138         eventId = &addAbilityStageInfoEventId_;
1139     } else {
1140         HILOG_INFO("Other msg: %{public}d", msg);
1141         return;
1142     }
1143     taskHandler_->SubmitTask([wthis = weak_from_this(), eventId]() {
1144         auto pthis = wthis.lock();
1145         if (pthis) {
1146             *eventId = 0;
1147         }
1148         }, timeOut);
1149 }
1150 
PostTask(std::string msg,int64_t timeOut,const Closure & task)1151 void AppRunningRecord::PostTask(std::string msg, int64_t timeOut, const Closure &task)
1152 {
1153     if (!taskHandler_) {
1154         HILOG_ERROR("taskHandler_ is nullptr");
1155         return;
1156     }
1157     taskHandler_->SubmitTask(task, msg, timeOut);
1158 }
1159 
GetEventId() const1160 int64_t AppRunningRecord::GetEventId() const
1161 {
1162     return eventId_;
1163 }
1164 
SetTaskHandler(std::shared_ptr<AAFwk::TaskHandlerWrap> taskHandler)1165 void AppRunningRecord::SetTaskHandler(std::shared_ptr<AAFwk::TaskHandlerWrap> taskHandler)
1166 {
1167     taskHandler_ = taskHandler;
1168 }
1169 
SetEventHandler(const std::shared_ptr<AMSEventHandler> & handler)1170 void AppRunningRecord::SetEventHandler(const std::shared_ptr<AMSEventHandler> &handler)
1171 {
1172     eventHandler_ = handler;
1173 }
1174 
IsLastAbilityRecord(const sptr<IRemoteObject> & token)1175 bool AppRunningRecord::IsLastAbilityRecord(const sptr<IRemoteObject> &token)
1176 {
1177     auto moduleRecord = GetModuleRunningRecordByToken(token);
1178     if (!moduleRecord) {
1179         HILOG_ERROR("can not find module record");
1180         return false;
1181     }
1182 
1183     auto moduleRecordList = GetAllModuleRecord();
1184     if (moduleRecordList.size() == 1) {
1185         return moduleRecord->IsLastAbilityRecord(token);
1186     }
1187 
1188     return false;
1189 }
1190 
IsLastPageAbilityRecord(const sptr<IRemoteObject> & token)1191 bool AppRunningRecord::IsLastPageAbilityRecord(const sptr<IRemoteObject> &token)
1192 {
1193     auto moduleRecord = GetModuleRunningRecordByToken(token);
1194     if (!moduleRecord) {
1195         HILOG_ERROR("can not find module record");
1196         return false;
1197     }
1198 
1199     int32_t pageAbilitySize = 0;
1200     auto moduleRecordList = GetAllModuleRecord();
1201     for (auto moduleRecord : moduleRecordList) {
1202         pageAbilitySize += moduleRecord->GetPageAbilitySize() ;
1203         if (pageAbilitySize > 1) {
1204             return false;
1205         }
1206     }
1207 
1208     return pageAbilitySize == 1;
1209 }
1210 
SetTerminating()1211 void AppRunningRecord::SetTerminating()
1212 {
1213     isTerminating = true;
1214 }
1215 
IsTerminating()1216 bool AppRunningRecord::IsTerminating()
1217 {
1218     return isTerminating;
1219 }
1220 
IsKeepAliveApp() const1221 bool AppRunningRecord::IsKeepAliveApp() const
1222 {
1223     return isKeepAliveApp_;
1224 }
1225 
IsEmptyKeepAliveApp() const1226 bool AppRunningRecord::IsEmptyKeepAliveApp() const
1227 {
1228     return isEmptyKeepAliveApp_;
1229 }
1230 
SetKeepAliveAppState(bool isKeepAlive,bool isEmptyKeepAliveApp)1231 void AppRunningRecord::SetKeepAliveAppState(bool isKeepAlive, bool isEmptyKeepAliveApp)
1232 {
1233     isKeepAliveApp_ = isKeepAlive;
1234     isEmptyKeepAliveApp_ = isEmptyKeepAliveApp;
1235 }
1236 
SetStageModelState(bool isStageBasedModel)1237 void AppRunningRecord::SetStageModelState(bool isStageBasedModel)
1238 {
1239     isStageBasedModel_ = isStageBasedModel;
1240 }
1241 
GetTheModuleInfoNeedToUpdated(const std::string bundleName,HapModuleInfo & info)1242 bool AppRunningRecord::GetTheModuleInfoNeedToUpdated(const std::string bundleName, HapModuleInfo &info)
1243 {
1244     bool result = false;
1245     std::lock_guard<ffrt::mutex> hapModulesLock(hapModulesLock_);
1246     auto moduleInfoVectorIter = hapModules_.find(bundleName);
1247     if (moduleInfoVectorIter == hapModules_.end() || moduleInfoVectorIter->second.empty()) {
1248         return result;
1249     }
1250     std::string moduleName = moduleName_;
1251     auto findCondition = [moduleName](const std::shared_ptr<ModuleRunningRecord> &record) {
1252         if (record) {
1253             return (moduleName.empty() || (moduleName == record->GetModuleName())) &&
1254                 (record->GetModuleRecordState() == ModuleRecordState::INITIALIZED_STATE);
1255         }
1256         return false;
1257     };
1258     auto moduleRecordIter =
1259         std::find_if(moduleInfoVectorIter->second.begin(), moduleInfoVectorIter->second.end(), findCondition);
1260     if (moduleRecordIter != moduleInfoVectorIter->second.end()) {
1261         (*moduleRecordIter)->GetHapModuleInfo(info);
1262         (*moduleRecordIter)->SetModuleRecordState(ModuleRecordState::RUNNING_STATE);
1263         result = true;
1264     }
1265 
1266     return result;
1267 }
1268 
SetRestartResidentProcCount(int count)1269 void AppRunningRecord::SetRestartResidentProcCount(int count)
1270 {
1271     restartResidentProcCount_ = count;
1272 }
1273 
DecRestartResidentProcCount()1274 void AppRunningRecord::DecRestartResidentProcCount()
1275 {
1276     restartResidentProcCount_--;
1277 }
1278 
GetRestartResidentProcCount() const1279 int AppRunningRecord::GetRestartResidentProcCount() const
1280 {
1281     return restartResidentProcCount_;
1282 }
1283 
CanRestartResidentProc()1284 bool AppRunningRecord::CanRestartResidentProc()
1285 {
1286     struct timespec t;
1287     t.tv_sec = 0;
1288     t.tv_nsec = 0;
1289     clock_gettime(CLOCK_MONOTONIC, &t);
1290     int64_t systemTimeMillis = static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
1291     if ((restartResidentProcCount_ >= 0) || ((systemTimeMillis - restartTimeMillis_) > RESTART_INTERVAL_TIME)) {
1292         return true;
1293     }
1294     return false;
1295 }
1296 
GetBundleNames(std::vector<std::string> & bundleNames)1297 void AppRunningRecord::GetBundleNames(std::vector<std::string> &bundleNames)
1298 {
1299     std::lock_guard<ffrt::mutex> appInfosLock(appInfosLock_);
1300     for (auto &app : appInfos_) {
1301         bundleNames.emplace_back(app.first);
1302     }
1303 }
1304 
SetUserTestInfo(const std::shared_ptr<UserTestRecord> & record)1305 void AppRunningRecord::SetUserTestInfo(const std::shared_ptr<UserTestRecord> &record)
1306 {
1307     userTestRecord_ = record;
1308 }
1309 
GetUserTestInfo()1310 std::shared_ptr<UserTestRecord> AppRunningRecord::GetUserTestInfo()
1311 {
1312     return userTestRecord_;
1313 }
1314 
SetProcessAndExtensionType(const std::shared_ptr<AbilityInfo> & abilityInfo)1315 void AppRunningRecord::SetProcessAndExtensionType(const std::shared_ptr<AbilityInfo> &abilityInfo)
1316 {
1317     if (abilityInfo == nullptr) {
1318         HILOG_ERROR("abilityInfo is nullptr");
1319         return;
1320     }
1321     extensionType_ = abilityInfo->extensionAbilityType;
1322     if (extensionType_ == ExtensionAbilityType::UNSPECIFIED) {
1323         processType_ = ProcessType::NORMAL;
1324         return;
1325     }
1326     processType_ = ProcessType::EXTENSION;
1327     return;
1328 }
1329 
SetSpecifiedAbilityFlagAndWant(const bool flag,const AAFwk::Want & want,const std::string & moduleName)1330 void AppRunningRecord::SetSpecifiedAbilityFlagAndWant(
1331     const bool flag, const AAFwk::Want &want, const std::string &moduleName)
1332 {
1333     isSpecifiedAbility_ = flag;
1334     SpecifiedWant_ = want;
1335     moduleName_ = moduleName;
1336 }
1337 
IsStartSpecifiedAbility() const1338 bool AppRunningRecord::IsStartSpecifiedAbility() const
1339 {
1340     return isSpecifiedAbility_;
1341 }
1342 
ScheduleAcceptWant(const std::string & moduleName)1343 void AppRunningRecord::ScheduleAcceptWant(const std::string &moduleName)
1344 {
1345     SendEvent(
1346         AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT);
1347     if (appLifeCycleDeal_ == nullptr) {
1348         HILOG_WARN("appLifeCycleDeal_ is null");
1349         return;
1350     }
1351     appLifeCycleDeal_->ScheduleAcceptWant(SpecifiedWant_, moduleName);
1352 }
1353 
ScheduleAcceptWantDone()1354 void AppRunningRecord::ScheduleAcceptWantDone()
1355 {
1356     HILOG_INFO("Schedule accept want done. bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1357         static_cast<int>(eventId_));
1358 
1359     if (!eventHandler_) {
1360         HILOG_ERROR("eventHandler_ is nullptr");
1361         return;
1362     }
1363 
1364     eventHandler_->RemoveEvent(AMSEventHandler::START_SPECIFIED_ABILITY_TIMEOUT_MSG, eventId_);
1365 }
1366 
ApplicationTerminated()1367 void AppRunningRecord::ApplicationTerminated()
1368 {
1369     HILOG_DEBUG("Application terminated bundle %{public}s and eventId %{public}d", mainBundleName_.c_str(),
1370         static_cast<int>(eventId_));
1371 
1372     if (!eventHandler_) {
1373         HILOG_ERROR("eventHandler_ is nullptr");
1374         return;
1375     }
1376 
1377     eventHandler_->RemoveEvent(AMSEventHandler::TERMINATE_APPLICATION_TIMEOUT_MSG, eventId_);
1378 }
1379 
GetSpecifiedWant() const1380 const AAFwk::Want &AppRunningRecord::GetSpecifiedWant() const
1381 {
1382     return SpecifiedWant_;
1383 }
1384 
UpdateConfiguration(const Configuration & config)1385 int32_t AppRunningRecord::UpdateConfiguration(const Configuration &config)
1386 {
1387     HILOG_INFO("call %{public}s", __func__);
1388     if (!appLifeCycleDeal_) {
1389         HILOG_INFO("appLifeCycleDeal_ is null");
1390         return ERR_INVALID_VALUE;
1391     }
1392     return appLifeCycleDeal_->UpdateConfiguration(config);
1393 }
1394 
AddRenderRecord(const std::shared_ptr<RenderRecord> & record)1395 void AppRunningRecord::AddRenderRecord(const std::shared_ptr<RenderRecord> &record)
1396 {
1397     if (!record) {
1398         HILOG_DEBUG("AddRenderRecord: record is null");
1399         return;
1400     }
1401     std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1402     renderRecordMap_.emplace(record->GetUid(), record);
1403 }
1404 
RemoveRenderRecord(const std::shared_ptr<RenderRecord> & record)1405 void AppRunningRecord::RemoveRenderRecord(const std::shared_ptr<RenderRecord> &record)
1406 {
1407     if (!record) {
1408         HILOG_DEBUG("RemoveRenderRecord: record is null");
1409         return;
1410     }
1411     std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1412     renderRecordMap_.erase(record->GetUid());
1413 }
1414 
GetRenderRecordByPid(const pid_t pid)1415 std::shared_ptr<RenderRecord> AppRunningRecord::GetRenderRecordByPid(const pid_t pid)
1416 {
1417     std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1418     if (renderRecordMap_.empty()) {
1419         return nullptr;
1420     }
1421     for (auto iter : renderRecordMap_) {
1422         auto renderRecord = iter.second;
1423         if (renderRecord && renderRecord->GetPid() == pid) {
1424             return renderRecord;
1425         }
1426     }
1427     return nullptr;
1428 }
1429 
GetRenderRecordMap()1430 std::map<int32_t, std::shared_ptr<RenderRecord>> AppRunningRecord::GetRenderRecordMap()
1431 {
1432     std::lock_guard renderRecordMapLock(renderRecordMapLock_);
1433     return renderRecordMap_;
1434 }
1435 
SetStartMsg(const AppSpawnStartMsg & msg)1436 void AppRunningRecord::SetStartMsg(const AppSpawnStartMsg &msg)
1437 {
1438     startMsg_ = msg;
1439 }
1440 
GetStartMsg()1441 AppSpawnStartMsg AppRunningRecord::GetStartMsg()
1442 {
1443     return startMsg_;
1444 }
1445 
SetDebugApp(bool isDebugApp)1446 void AppRunningRecord::SetDebugApp(bool isDebugApp)
1447 {
1448     HILOG_INFO("SetDebugApp come, value is %{public}d", isDebugApp);
1449     isDebugApp_ = isDebugApp;
1450 }
1451 
IsDebugApp()1452 bool AppRunningRecord::IsDebugApp()
1453 {
1454     return isDebugApp_;
1455 }
1456 
SetNativeDebug(bool isNativeDebug)1457 void AppRunningRecord::SetNativeDebug(bool isNativeDebug)
1458 {
1459     HILOG_DEBUG("SetNativeDebug, value is %{public}d", isNativeDebug);
1460     isNativeDebug_ = isNativeDebug;
1461 }
1462 
SetAppIndex(const int32_t appIndex)1463 void AppRunningRecord::SetAppIndex(const int32_t appIndex)
1464 {
1465     appIndex_ = appIndex;
1466 }
1467 
GetAppIndex() const1468 int32_t AppRunningRecord::GetAppIndex() const
1469 {
1470     return appIndex_;
1471 }
1472 
SetSecurityFlag(bool securityFlag)1473 void AppRunningRecord::SetSecurityFlag(bool securityFlag)
1474 {
1475     securityFlag_ = securityFlag;
1476 }
1477 
GetSecurityFlag() const1478 bool AppRunningRecord::GetSecurityFlag() const
1479 {
1480     return securityFlag_;
1481 }
1482 
SetKilling()1483 void AppRunningRecord::SetKilling()
1484 {
1485     isKilling_ = true;
1486 }
1487 
IsKilling() const1488 bool AppRunningRecord::IsKilling() const
1489 {
1490     return isKilling_;
1491 }
1492 
RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject> & token) const1493 void AppRunningRecord::RemoveTerminateAbilityTimeoutTask(const sptr<IRemoteObject>& token) const
1494 {
1495     auto moduleRecord = GetModuleRunningRecordByToken(token);
1496     if (!moduleRecord) {
1497         HILOG_ERROR("can not find module record");
1498         return;
1499     }
1500     (void)moduleRecord->RemoveTerminateAbilityTimeoutTask(token);
1501 }
1502 
NotifyLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1503 int32_t AppRunningRecord::NotifyLoadRepairPatch(const std::string &bundleName, const sptr<IQuickFixCallback> &callback,
1504     const int32_t recordId)
1505 {
1506     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1507     HILOG_DEBUG("function called.");
1508     if (!appLifeCycleDeal_) {
1509         HILOG_ERROR("appLifeCycleDeal_ is null");
1510         return ERR_INVALID_VALUE;
1511     }
1512     return appLifeCycleDeal_->NotifyLoadRepairPatch(bundleName, callback, recordId);
1513 }
1514 
NotifyHotReloadPage(const sptr<IQuickFixCallback> & callback,const int32_t recordId)1515 int32_t AppRunningRecord::NotifyHotReloadPage(const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1516 {
1517     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1518     HILOG_DEBUG("function called.");
1519     if (!appLifeCycleDeal_) {
1520         HILOG_ERROR("appLifeCycleDeal_ is null");
1521         return ERR_INVALID_VALUE;
1522     }
1523     return appLifeCycleDeal_->NotifyHotReloadPage(callback, recordId);
1524 }
1525 
NotifyUnLoadRepairPatch(const std::string & bundleName,const sptr<IQuickFixCallback> & callback,const int32_t recordId)1526 int32_t AppRunningRecord::NotifyUnLoadRepairPatch(const std::string &bundleName,
1527     const sptr<IQuickFixCallback> &callback, const int32_t recordId)
1528 {
1529     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1530     HILOG_DEBUG("function called.");
1531     if (!appLifeCycleDeal_) {
1532         HILOG_ERROR("appLifeCycleDeal_ is null");
1533         return ERR_INVALID_VALUE;
1534     }
1535     return appLifeCycleDeal_->NotifyUnLoadRepairPatch(bundleName, callback, recordId);
1536 }
1537 
NotifyAppFault(const FaultData & faultData)1538 int32_t AppRunningRecord::NotifyAppFault(const FaultData &faultData)
1539 {
1540     HILOG_DEBUG("called.");
1541     if (!appLifeCycleDeal_) {
1542         HILOG_ERROR("appLifeCycleDeal_ is null");
1543         return ERR_INVALID_VALUE;
1544     }
1545     return appLifeCycleDeal_->NotifyAppFault(faultData);
1546 }
1547 
IsContinuousTask()1548 bool AppRunningRecord::IsContinuousTask()
1549 {
1550     return isContinuousTask_;
1551 }
1552 
SetContinuousTaskAppState(bool isContinuousTask)1553 void AppRunningRecord::SetContinuousTaskAppState(bool isContinuousTask)
1554 {
1555     isContinuousTask_ = isContinuousTask;
1556 }
1557 
GetFocusFlag() const1558 bool AppRunningRecord::GetFocusFlag() const
1559 {
1560     return isFocused_;
1561 }
1562 
GetAppStartTime() const1563 int64_t AppRunningRecord::GetAppStartTime() const
1564 {
1565     return startTimeMillis_;
1566 }
1567 
SetRequestProcCode(int32_t requestProcCode)1568 void AppRunningRecord::SetRequestProcCode(int32_t requestProcCode)
1569 {
1570     requestProcCode_ = requestProcCode;
1571 }
1572 
GetRequestProcCode() const1573 int32_t AppRunningRecord::GetRequestProcCode() const
1574 {
1575     return requestProcCode_;
1576 }
1577 
SetProcessChangeReason(ProcessChangeReason reason)1578 void AppRunningRecord::SetProcessChangeReason(ProcessChangeReason reason)
1579 {
1580     processChangeReason_ = reason;
1581 }
1582 
GetProcessChangeReason() const1583 ProcessChangeReason AppRunningRecord::GetProcessChangeReason() const
1584 {
1585     return processChangeReason_;
1586 }
1587 
IsUpdateStateFromService()1588 bool AppRunningRecord::IsUpdateStateFromService()
1589 {
1590     return isUpdateStateFromService_;
1591 }
1592 
SetUpdateStateFromService(bool isUpdateStateFromService)1593 void AppRunningRecord::SetUpdateStateFromService(bool isUpdateStateFromService)
1594 {
1595     isUpdateStateFromService_ = isUpdateStateFromService;
1596 }
1597 
GetExtensionType() const1598 ExtensionAbilityType AppRunningRecord::GetExtensionType() const
1599 {
1600     return extensionType_;
1601 }
1602 
GetProcessType() const1603 ProcessType AppRunningRecord::GetProcessType() const
1604 {
1605     return processType_;
1606 }
1607 }  // namespace AppExecFwk
1608 }  // namespace OHOS
1609