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