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