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