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