From 05cdcf7798e3367414f54ce784e328ea9d60b280 Mon Sep 17 00:00:00 2001 From: zhoujun62 Date: Tue, 8 Mar 2022 21:28:59 +0800 Subject: [PATCH] IssueNo:#I4WXIG:launcher cannot restart when it was killed Description:launcher cannot restart when it was killed Sig:SIG_ApplicationFramework Feature or Bugfix:Bugfix Binary Source:No Signed-off-by: zhoujun62 Change-Id: I0d43107c20a73e515dab5e307451b6a639d7da7c --- .../include/ability_connect_manager.h | 2 + .../abilitymgr/include/data_ability_manager.h | 1 + .../src/ability_connect_manager.cpp | 32 ++++---- .../abilitymgr/src/data_ability_manager.cpp | 76 ++++++++++--------- 4 files changed, 63 insertions(+), 48 deletions(-) diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index 99fa6b0c8f..166c225ae1 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -411,6 +411,8 @@ private: */ void PostTimeOutTask(const std::shared_ptr &abilityRecord, uint32_t messageId); + bool IsAbilityNeedRestart(const std::shared_ptr &abilityRecord); + private: const std::string TASK_ON_CALLBACK_DIED = "OnCallbackDiedTask"; const std::string TASK_ON_ABILITY_DIED = "OnAbilityDiedTask"; diff --git a/services/abilitymgr/include/data_ability_manager.h b/services/abilitymgr/include/data_ability_manager.h index f1ac566670..c6ba4d46bb 100644 --- a/services/abilitymgr/include/data_ability_manager.h +++ b/services/abilitymgr/include/data_ability_manager.h @@ -58,6 +58,7 @@ private: private: DataAbilityRecordPtr LoadLocked(const std::string &name, const AbilityRequest &req); void DumpLocked(const char *func, int line); + void RestartDataAbility(const std::shared_ptr &abilityRecord); private: std::mutex mutex_; diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 23dc94bc42..cd9281a6ed 100755 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -910,23 +910,15 @@ void AbilityConnectManager::OnAbilityDied(const std::shared_ptr & } } -void AbilityConnectManager::HandleAbilityDiedTask(const std::shared_ptr &abilityRecord) +bool AbilityConnectManager::IsAbilityNeedRestart(const std::shared_ptr &abilityRecord) { - HILOG_INFO("Handle ability died task."); - std::lock_guard guard(Lock_); - CHECK_POINTER(abilityRecord); - if (!GetServiceRecordByToken(abilityRecord->GetToken())) { - HILOG_ERROR("Died ability record is not exist in service map."); - return; - } - auto bms = AbilityUtil::GetBundleManager(); - CHECK_POINTER(bms); + CHECK_POINTER_AND_RETURN(bms, false); std::vector bundleInfos; bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD); if (!getBundleInfos) { HILOG_ERROR("Handle ability died task, get bundle infos failed"); - return; + return false; } auto GetKeepAliveAbilities = [&bundleInfos](std::vector &keepAliveAbilities) -> void { @@ -955,13 +947,27 @@ void AbilityConnectManager::HandleAbilityDiedTask(const std::shared_ptrGetAbilityInfo().name == AbilityConfig::PHONE_SERVICE_ABILITY_NAME || abilityRecord->GetAbilityInfo().name == AbilityConfig::CONTACTS_ABILITY_NAME || abilityRecord->GetAbilityInfo().name == AbilityConfig::MMS_ABILITY_NAME || - abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME); + abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME || + abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME); }; std::vector keepAliveAbilities; GetKeepAliveAbilities(keepAliveAbilities); auto findIter = find_if(keepAliveAbilities.begin(), keepAliveAbilities.end(), findKeepAliveAbility); - if (findIter != keepAliveAbilities.end()) { + return (findIter != keepAliveAbilities.end()); +} + +void AbilityConnectManager::HandleAbilityDiedTask(const std::shared_ptr &abilityRecord) +{ + HILOG_INFO("Handle ability died task."); + std::lock_guard guard(Lock_); + CHECK_POINTER(abilityRecord); + if (!GetServiceRecordByToken(abilityRecord->GetToken())) { + HILOG_ERROR("Died ability record is not exist in service map."); + return; + } + + if (IsAbilityNeedRestart(abilityRecord)) { HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str()); AbilityRequest requestInfo; requestInfo.want = abilityRecord->GetWant(); diff --git a/services/abilitymgr/src/data_ability_manager.cpp b/services/abilitymgr/src/data_ability_manager.cpp index 22a45ea6dc..c930a6d0de 100644 --- a/services/abilitymgr/src/data_ability_manager.cpp +++ b/services/abilitymgr/src/data_ability_manager.cpp @@ -315,41 +315,7 @@ void DataAbilityManager::OnAbilityDied(const std::shared_ptr &abi } } - auto bms = AbilityUtil::GetBundleManager(); - CHECK_POINTER(bms); - std::vector bundleInfos; - bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD); - if (!getBundleInfos) { - HILOG_ERROR("Handle ability died task, get bundle infos failed"); - return; - } - - for (size_t i = 0; i < bundleInfos.size(); i++) { - if (!bundleInfos[i].isKeepAlive) { - continue; - } - for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) { - if (hapModuleInfo.isModuleJson) { - // new application model, it cannot be a data ability - continue; - } - // old application model, it maybe a data ability - std::string mainElement = hapModuleInfo.mainAbility; - if (abilityRecord->GetAbilityInfo().name != mainElement) { - continue; - } - std::string uriStr; - bool getDataAbilityUri = OHOS::DelayedSingleton::GetInstance()->GetDataAbilityUri( - hapModuleInfo.abilityInfos, mainElement, uriStr); - if (getDataAbilityUri) { - HILOG_INFO("restart data ability: %{public}s, uri: %{public}s", - abilityRecord->GetAbilityInfo().name.c_str(), uriStr.c_str()); - Uri uri(uriStr); - OHOS::DelayedSingleton::GetInstance()->AcquireDataAbility(uri, true, nullptr); - return; - } - } - } + RestartDataAbility(abilityRecord); } void DataAbilityManager::OnAppStateChanged(const AppInfo &info) @@ -618,5 +584,45 @@ void DataAbilityManager::GetAbilityRunningInfos(std::vector std::for_each(dataAbilityRecordsLoading_.begin(), dataAbilityRecordsLoading_.end(), queryInfo); std::for_each(dataAbilityRecordsLoaded_.begin(), dataAbilityRecordsLoaded_.end(), queryInfo); } + +void DataAbilityManager::RestartDataAbility(const std::shared_ptr &abilityRecord) +{ + // restart data ability if necessary + auto bms = AbilityUtil::GetBundleManager(); + CHECK_POINTER(bms); + std::vector bundleInfos; + bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD); + if (!getBundleInfos) { + HILOG_ERROR("Handle ability died task, get bundle infos failed"); + return; + } + + for (size_t i = 0; i < bundleInfos.size(); i++) { + if (!bundleInfos[i].isKeepAlive) { + continue; + } + for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) { + if (hapModuleInfo.isModuleJson) { + // new application model, it cannot be a data ability + continue; + } + // old application model, it maybe a data ability + std::string mainElement = hapModuleInfo.mainAbility; + if (abilityRecord->GetAbilityInfo().name != mainElement) { + continue; + } + std::string uriStr; + bool getDataAbilityUri = OHOS::DelayedSingleton::GetInstance()->GetDataAbilityUri( + hapModuleInfo.abilityInfos, mainElement, uriStr); + if (getDataAbilityUri) { + HILOG_INFO("restart data ability: %{public}s, uri: %{public}s", + abilityRecord->GetAbilityInfo().name.c_str(), uriStr.c_str()); + Uri uri(uriStr); + OHOS::DelayedSingleton::GetInstance()->AcquireDataAbility(uri, true, nullptr); + return; + } + } + } +} } // namespace AAFwk } // namespace OHOS