From de2ffd6e46fecb37fc8a17ed1641eef785449f39 Mon Sep 17 00:00:00 2001 From: yuwenze Date: Mon, 6 Feb 2023 09:42:02 +0000 Subject: [PATCH] fix appfreeze Signed-off-by: yuwenze Change-Id: I54b51b103880f70c3ddb599d456ca36d209f41ec --- .../native/ability/native/ability_impl.cpp | 33 ++++++++-------- .../ability/native/new_ability_impl.cpp | 4 ++ .../ability_manager/include/ability_state.h | 1 + .../include/lifecycle_state_info.h | 1 + .../kits/native/ability/native/ability_impl.h | 3 +- .../abilitymgr/include/mission_list_manager.h | 10 +++-- services/abilitymgr/src/ability_record.cpp | 3 ++ .../abilitymgr/src/mission_list_manager.cpp | 38 +++++++++++-------- .../missionlistmanagersecond_fuzzer.cpp | 6 +-- .../missionlistmanagerthird_fuzzer.cpp | 2 +- .../ability_impl_test.cpp | 31 ++++++++------- .../mission_list_manager_test.cpp | 18 +++------ 12 files changed, 82 insertions(+), 68 deletions(-) diff --git a/frameworks/native/ability/native/ability_impl.cpp b/frameworks/native/ability/native/ability_impl.cpp index 68d8220a20b..ba44f321f50 100644 --- a/frameworks/native/ability/native/ability_impl.cpp +++ b/frameworks/native/ability/native/ability_impl.cpp @@ -656,27 +656,28 @@ void AbilityImpl::WindowLifeCycleImpl::AfterUnfocused() HILOG_DEBUG("%{public}s end.", __func__); } -void AbilityImpl::WindowLifeCycleImpl::ForegroundFailed() +void AbilityImpl::WindowLifeCycleImpl::ForegroundFailed(int32_t type) { HILOG_DEBUG("%{public}s begin.", __func__); PacMap restoreData; - AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, - AbilityLifeCycleState::ABILITY_STATE_FOREGROUND_FAILED, restoreData); -} + if (type == static_cast(OHOS::Rosen::WMError::WM_ERROR_INVALID_OPERATION)) { + HILOG_DEBUG("window was freezed."); + AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, + AbilityLifeCycleState::ABILITY_STATE_WINDOW_FREEZED, restoreData); + } else if (type == static_cast(OHOS::Rosen::WMError::WM_ERROR_INVALID_WINDOW_MODE_OR_SIZE)) { + auto owner = owner_.lock(); + if (owner == nullptr || !owner->IsStageBasedModel()) { + HILOG_ERROR("Not stage mode ability or abilityImpl is nullptr."); + return; + } -void AbilityImpl::WindowLifeCycleImpl::ForegroundInvalidMode() -{ - HILOG_DEBUG("%{public}s begin.", __func__); - auto owner = owner_.lock(); - if (owner == nullptr || !owner->IsStageBasedModel()) { - HILOG_ERROR("Not stage mode ability or abilityImpl is nullptr."); - return; + HILOG_DEBUG("The ability is stage mode, schedule foreground invalid mode."); + AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, + AbilityLifeCycleState::ABILITY_STATE_INVALID_WINDOW_MODE, restoreData); + } else { + AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, + AbilityLifeCycleState::ABILITY_STATE_FOREGROUND_FAILED, restoreData); } - - HILOG_DEBUG("The ability is stage mode, schedule foreground invalid mode."); - PacMap restoreData; - AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, - AbilityLifeCycleState::ABILITY_STATE_INVALID_WINDOW_MODE, restoreData); } void AbilityImpl::Foreground(const Want &want) diff --git a/frameworks/native/ability/native/new_ability_impl.cpp b/frameworks/native/ability/native/new_ability_impl.cpp index bc65478ac01..5634277d2c6 100644 --- a/frameworks/native/ability/native/new_ability_impl.cpp +++ b/frameworks/native/ability/native/new_ability_impl.cpp @@ -109,6 +109,10 @@ bool NewAbilityImpl::AbilityTransaction(const Want &want, const AAFwk::LifeCycle ability_->RequestFocus(want); } } else { + { + std::lock_guard lock(notifyForegroundLock_); + notifyForegroundByWindow_ = false; + } Foreground(want); std::lock_guard lock(notifyForegroundLock_); ret = notifyForegroundByWindow_; diff --git a/interfaces/inner_api/ability_manager/include/ability_state.h b/interfaces/inner_api/ability_manager/include/ability_state.h index e325524e3d8..5c569dcd426 100644 --- a/interfaces/inner_api/ability_manager/include/ability_state.h +++ b/interfaces/inner_api/ability_manager/include/ability_state.h @@ -43,6 +43,7 @@ enum AbilityState { BACKGROUNDING, FOREGROUND_FAILED, FOREGROUND_INVALID_MODE, + FOREGROUND_WINDOW_FREEZED, }; } // namespace AAFwk } // namespace OHOS diff --git a/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h b/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h index 097990e2fde..8c4b2650496 100644 --- a/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h +++ b/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h @@ -40,6 +40,7 @@ enum AbilityLifeCycleState { ABILITY_STATE_STOPED_NEW, ABILITY_STATE_FOREGROUND_FAILED, ABILITY_STATE_INVALID_WINDOW_MODE, + ABILITY_STATE_WINDOW_FREEZED, }; /** diff --git a/interfaces/kits/native/ability/native/ability_impl.h b/interfaces/kits/native/ability/native/ability_impl.h index 3fa0b7ee505..c4030a0dd24 100644 --- a/interfaces/kits/native/ability/native/ability_impl.h +++ b/interfaces/kits/native/ability/native/ability_impl.h @@ -491,8 +491,7 @@ public: void AfterBackground() override; void AfterFocused() override; void AfterUnfocused() override; - void ForegroundFailed() override; - void ForegroundInvalidMode() override; + void ForegroundFailed(int32_t type) override; private: sptr token_ = nullptr; std::weak_ptr owner_; diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 163437bea70..4674b64f3d0 100644 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -408,7 +408,7 @@ private: int DispatchState(const std::shared_ptr &abilityRecord, int state); int DispatchForeground(const std::shared_ptr &abilityRecord, bool success, - bool isInvalidMode = false); + AbilityState state = AbilityState::INITIAL); int DispatchTerminate(const std::shared_ptr &abilityRecord); int DispatchBackground(const std::shared_ptr &abilityRecord); void CompleteForegroundSuccess(const std::shared_ptr &abilityRecord); @@ -438,14 +438,16 @@ private: // handle timeout event void HandleLoadTimeout(const std::shared_ptr &ability); - void HandleForegroundTimeout(const std::shared_ptr &ability, bool isInvalidMode = false); - void HandleTimeoutAndResumeAbility(const std::shared_ptr &ability, bool isInvalidMode = false); + void HandleForegroundTimeout(const std::shared_ptr &ability, + AbilityState state = AbilityState::INITIAL); + void HandleTimeoutAndResumeAbility(const std::shared_ptr &ability, + AbilityState state = AbilityState::INITIAL); void MoveToTerminateList(const std::shared_ptr &ability); void DelayedResumeTimeout(const std::shared_ptr &callerAbility); void BackToCaller(const std::shared_ptr &callerAbility); // new version for call inner function. - void CompleteForegroundFailed(const std::shared_ptr &abilityRecord, bool isInvalidMode); + void CompleteForegroundFailed(const std::shared_ptr &abilityRecord, AbilityState state); int ResolveAbility(const std::shared_ptr &targetAbility, const AbilityRequest &abilityRequest); std::shared_ptr GetAbilityRecordByName(const AppExecFwk::ElementName &element); int CallAbilityLocked(const AbilityRequest &abilityRequest); diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index c6b66a1642e..6ea2a3968e3 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -78,6 +78,7 @@ const std::map AbilityRecord::stateToStrMap = { std::map::value_type(BACKGROUNDING, "BACKGROUNDING"), std::map::value_type(FOREGROUND_FAILED, "FOREGROUND_FAILED"), std::map::value_type(FOREGROUND_INVALID_MODE, "FOREGROUND_INVALID_MODE"), + std::map::value_type(FOREGROUND_WINDOW_FREEZED, "FOREGROUND_WINDOW_FREEZED"), }; const std::map AbilityRecord::appStateToStrMap_ = { std::map::value_type(AppState::BEGIN, "BEGIN"), @@ -98,6 +99,8 @@ const std::map AbilityRecord::convertStateM std::map::value_type(ABILITY_STATE_FOREGROUND_FAILED, FOREGROUND_FAILED), std::map::value_type(ABILITY_STATE_INVALID_WINDOW_MODE, FOREGROUND_INVALID_MODE), + std::map::value_type(ABILITY_STATE_WINDOW_FREEZED, + FOREGROUND_WINDOW_FREEZED), }; Token::Token(std::weak_ptr abilityRecord) : abilityRecord_(abilityRecord) diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index 3b839b37621..c3f5d128ded 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -1013,11 +1013,10 @@ int MissionListManager::DispatchState(const std::shared_ptr &abil case AbilityState::FOREGROUND: { return DispatchForeground(abilityRecord, true); } - case AbilityState::FOREGROUND_FAILED: { - return DispatchForeground(abilityRecord, false); - } - case AbilityState::FOREGROUND_INVALID_MODE: { - return DispatchForeground(abilityRecord, false, true); + case AbilityState::FOREGROUND_FAILED: + case AbilityState::FOREGROUND_INVALID_MODE: + case AbilityState::FOREGROUND_WINDOW_FREEZED: { + return DispatchForeground(abilityRecord, false, static_cast(state)); } default: { HILOG_WARN("Don't support transiting state: %{public}d", state); @@ -1027,7 +1026,7 @@ int MissionListManager::DispatchState(const std::shared_ptr &abil } int MissionListManager::DispatchForeground(const std::shared_ptr &abilityRecord, bool success, - bool isInvalidMode) + AbilityState state) { auto handler = DelayedSingleton::GetInstance()->GetEventHandler(); CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler."); @@ -1060,13 +1059,20 @@ int MissionListManager::DispatchForeground(const std::shared_ptr }; handler->PostTask(task); } else { - auto task = [self, abilityRecord, isInvalidMode]() { + auto task = [self, abilityRecord, state]() { + if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) { + HILOG_INFO("Window was freezed."); + if (abilityRecord != nullptr) { + DelayedSingleton::GetInstance()->MoveToBackground(abilityRecord->GetToken()); + } + return; + } auto selfObj = self.lock(); if (!selfObj) { HILOG_WARN("Mission list mgr is invalid."); return; } - selfObj->CompleteForegroundFailed(abilityRecord, isInvalidMode); + selfObj->CompleteForegroundFailed(abilityRecord, state); }; handler->PostTask(task); } @@ -1842,7 +1848,7 @@ void MissionListManager::HandleLoadTimeout(const std::shared_ptr HandleTimeoutAndResumeAbility(ability); } -void MissionListManager::HandleForegroundTimeout(const std::shared_ptr &ability, bool isInvalidMode) +void MissionListManager::HandleForegroundTimeout(const std::shared_ptr &ability, AbilityState state) { if (ability == nullptr) { HILOG_ERROR("MissionListManager on time out event: ability record is nullptr."); @@ -1867,13 +1873,13 @@ void MissionListManager::HandleForegroundTimeout(const std::shared_ptr &abilityRecord, - bool isInvalidMode) + AbilityState state) { - HILOG_DEBUG("CompleteForegroundFailed come, isInvalidMode: %{public}d.", isInvalidMode); + HILOG_DEBUG("CompleteForegroundFailed come, state: %{public}d.", static_cast(state)); std::lock_guard guard(managerLock_); if (abilityRecord == nullptr) { HILOG_ERROR("CompleteForegroundFailed, ability is nullptr."); @@ -1881,7 +1887,7 @@ void MissionListManager::CompleteForegroundFailed(const std::shared_ptrSetStartingWindow(false); } if (abilityRecord->IsStartingWindow()) { @@ -1889,13 +1895,13 @@ void MissionListManager::CompleteForegroundFailed(const std::shared_ptr &timeOutAbilityRecord, - bool isInvalidMode) + AbilityState state) { HILOG_DEBUG("HandleTimeoutAndResumeTopAbility start"); if (timeOutAbilityRecord == nullptr) { @@ -1921,7 +1927,7 @@ void MissionListManager::HandleTimeoutAndResumeAbility(const std::shared_ptrOnTimeOut(uint32Param, int64Param); missionListManager->HandleLoadTimeout(abilityRecord); - missionListManager->HandleForegroundTimeout(abilityRecord, boolParam); - missionListManager->CompleteForegroundFailed(abilityRecord, boolParam); - missionListManager->HandleTimeoutAndResumeAbility(abilityRecord, boolParam); + missionListManager->HandleForegroundTimeout(abilityRecord); + missionListManager->CompleteForegroundFailed(abilityRecord, OHOS::AAFwk::AbilityState::INITIAL); + missionListManager->HandleTimeoutAndResumeAbility(abilityRecord); missionListManager->DelayedResumeTimeout(abilityRecord); missionListManager->BackToCaller(abilityRecord); missionListManager->MoveToTerminateList(abilityRecord); diff --git a/test/fuzztest/missionlistmanagerthird_fuzzer/missionlistmanagerthird_fuzzer.cpp b/test/fuzztest/missionlistmanagerthird_fuzzer/missionlistmanagerthird_fuzzer.cpp index 287b893317f..1964246644a 100755 --- a/test/fuzztest/missionlistmanagerthird_fuzzer/missionlistmanagerthird_fuzzer.cpp +++ b/test/fuzztest/missionlistmanagerthird_fuzzer/missionlistmanagerthird_fuzzer.cpp @@ -107,7 +107,7 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size) PacMap pacMap; missionListManager->AbilityTransactionDone(token, intParam, pacMap); missionListManager->DispatchState(abilityRecord, intParam); - missionListManager->DispatchForeground(abilityRecord, boolParam, boolParam); + missionListManager->DispatchForeground(abilityRecord, boolParam); missionListManager->CompleteForegroundSuccess(abilityRecord); missionListManager->TerminatePreviousAbility(abilityRecord); missionListManager->DispatchBackground(abilityRecord); diff --git a/test/unittest/frameworks_kits_ability_native_test/ability_impl_test.cpp b/test/unittest/frameworks_kits_ability_native_test/ability_impl_test.cpp index 5653a95baa2..4750d2d6ac6 100644 --- a/test/unittest/frameworks_kits_ability_native_test/ability_impl_test.cpp +++ b/test/unittest/frameworks_kits_ability_native_test/ability_impl_test.cpp @@ -3059,46 +3059,49 @@ HWTEST_F(AbilityImplTest, AaFwk_AbilityImpl_ForegroundFailed_0100, TestSize.Leve auto abilityImpl = std::make_shared(); sptr impl = new (std::nothrow) AbilityImpl::WindowLifeCycleImpl(token, abilityImpl); - impl->ForegroundFailed(); + auto wmErrNoMem = 2; + impl->ForegroundFailed(wmErrNoMem); GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundFailed_0100 end"; } /** - * @tc.number: AaFwk_AbilityImpl_ForegroundInvalidMode_0100 - * @tc.name: ForegroundInvalidMode + * @tc.number: AaFwk_AbilityImpl_ForegroundFailed_0200 + * @tc.name: ForegroundFailed * @tc.desc: Verify ForegroundFailed failed. */ -HWTEST_F(AbilityImplTest, AaFwk_AbilityImpl_ForegroundInvalidMode_0100, TestSize.Level1) +HWTEST_F(AbilityImplTest, AaFwk_AbilityImpl_ForegroundFailed_0200, TestSize.Level1) { - GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundInvalidMode_0100 start"; + GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundFailed_0200 start"; sptr token = sptr(new (std::nothrow) MockAbilityToken()); sptr impl = new (std::nothrow) AbilityImpl::WindowLifeCycleImpl(token, nullptr); - impl->ForegroundInvalidMode(); + auto wmErrInvalidWindowModeOrSize = 5; + impl->ForegroundFailed(wmErrInvalidWindowModeOrSize); auto abilityImpl = std::make_shared(); abilityImpl->isStageBasedModel_ = false; sptr impl1 = new (std::nothrow) AbilityImpl::WindowLifeCycleImpl(token, abilityImpl); - impl1->ForegroundInvalidMode(); - GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundInvalidMode_0100 end"; + impl1->ForegroundFailed(wmErrInvalidWindowModeOrSize); + GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundFailed_0200 end"; } /** - * @tc.number: AaFwk_AbilityImpl_ForegroundInvalidMode_0200 - * @tc.name: ForegroundInvalidMode + * @tc.number: AaFwk_AbilityImpl_ForegroundFailed_0300 + * @tc.name: ForegroundFailed * @tc.desc: Verify ForegroundFailed succeeded. */ -HWTEST_F(AbilityImplTest, AaFwk_AbilityImpl_ForegroundInvalidMode_0200, TestSize.Level1) +HWTEST_F(AbilityImplTest, AaFwk_AbilityImpl_ForegroundFailed_0300, TestSize.Level1) { - GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundInvalidMode_0200 start"; + GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundFailed_0300 start"; sptr token = sptr(new (std::nothrow) MockAbilityToken()); auto abilityImpl = std::make_shared(); abilityImpl->isStageBasedModel_ = true; sptr impl = new (std::nothrow) AbilityImpl::WindowLifeCycleImpl(token, abilityImpl); - impl->ForegroundInvalidMode(); - GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundInvalidMode_0200 end"; + auto wmErrInvalidWindowModeOrSize = 5; + impl->ForegroundFailed(wmErrInvalidWindowModeOrSize); + GTEST_LOG_(INFO) << "AaFwk_AbilityImpl_ForegroundFailed_0300 end"; } /** diff --git a/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp b/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp index d9abbdc50ec..e895dedb26e 100644 --- a/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp +++ b/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp @@ -1837,8 +1837,7 @@ HWTEST_F(MissionListManagerTest, DispatchForeground_001, TestSize.Level1) std::shared_ptr abilityRecord = InitAbilityRecord(); abilityRecord->currentState_ = AbilityState::FOREGROUNDING; bool success = true; - bool isInvalidMode = true; - int res = missionListManager->DispatchForeground(abilityRecord, success, isInvalidMode); + int res = missionListManager->DispatchForeground(abilityRecord, success); EXPECT_EQ(res, ERR_OK); missionListManager.reset(); } @@ -1858,8 +1857,7 @@ HWTEST_F(MissionListManagerTest, DispatchForeground_002, TestSize.Level1) std::shared_ptr abilityRecord = InitAbilityRecord(); abilityRecord->currentState_ = AbilityState::FOREGROUNDING; bool success = false; - bool isInvalidMode = false; - int res = missionListManager->DispatchForeground(abilityRecord, success, isInvalidMode); + int res = missionListManager->DispatchForeground(abilityRecord, success); EXPECT_EQ(res, ERR_OK); missionListManager.reset(); } @@ -3779,8 +3777,7 @@ HWTEST_F(MissionListManagerTest, CompleteForegroundFailed_001, TestSize.Level1) { int userId = 3; auto missionListManager = std::make_shared(userId); - bool isInvalidMode = true; - missionListManager->CompleteForegroundFailed(nullptr, isInvalidMode); + missionListManager->CompleteForegroundFailed(nullptr, OHOS::AAFwk::AbilityState::FOREGROUND_INVALID_MODE); missionListManager.reset(); } @@ -3797,8 +3794,7 @@ HWTEST_F(MissionListManagerTest, CompleteForegroundFailed_002, TestSize.Level1) int userId = 3; auto missionListManager = std::make_shared(userId); std::shared_ptr abilityRecord = InitAbilityRecord(); - bool isInvalidMode = true; - missionListManager->CompleteForegroundFailed(abilityRecord, isInvalidMode); + missionListManager->CompleteForegroundFailed(abilityRecord, OHOS::AAFwk::AbilityState::FOREGROUND_WINDOW_FREEZED); missionListManager.reset(); } @@ -3816,8 +3812,7 @@ HWTEST_F(MissionListManagerTest, CompleteForegroundFailed_003, TestSize.Level1) auto missionListManager = std::make_shared(userId); std::shared_ptr abilityRecord = InitAbilityRecord(); abilityRecord->SetStartingWindow(true); - bool isInvalidMode = false; - missionListManager->CompleteForegroundFailed(abilityRecord, isInvalidMode); + missionListManager->CompleteForegroundFailed(abilityRecord, OHOS::AAFwk::AbilityState::FOREGROUND_FAILED); missionListManager.reset(); } @@ -3833,8 +3828,7 @@ HWTEST_F(MissionListManagerTest, HandleTimeoutAndResumeAbility_001, TestSize.Lev { int userId = 3; auto missionListManager = std::make_shared(userId); - bool isInvalidMode = true; - missionListManager->HandleTimeoutAndResumeAbility(nullptr, isInvalidMode); + missionListManager->HandleTimeoutAndResumeAbility(nullptr); missionListManager.reset(); } -- Gitee