From 24121a05ff0edb8a897f3a7f65839ae3db739089 Mon Sep 17 00:00:00 2001 From: c30013956 Date: Thu, 11 Sep 2025 17:18:10 +0800 Subject: [PATCH 1/4] fix(wms-layout): resolve windowSizeChange/windowRectChange crash Signed-off-by: c30013956 --- .../include/ani_window_listener.h | 5 ++-- .../src/ani_window_listener.cpp | 24 ++++++++++++++----- .../src/ani_window_register_manager.cpp | 8 ++++++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h index 1f460261af..88852da2cd 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h @@ -55,8 +55,8 @@ class AniWindowListener : public IWindowChangeListener, public IDisplayIdChangeListener, public IWindowRotationChangeListener { public: - AniWindowListener(ani_env* env, ani_ref callback, CaseType caseType) - : env_(env), aniCallback_(callback), caseType_(caseType), + AniWindowListener(ani_env* env, ani_ref callback, CaseType caseType, ani_vm* vm) + : env_(env), aniCallback_(callback), caseType_(caseType), vm_(vm), weakRef_(wptr (this)) {} ~AniWindowListener(); ani_ref GetAniCallback() const { return aniCallback_; } @@ -111,6 +111,7 @@ private: ani_env* env_ = nullptr; ani_ref aniCallback_; CaseType caseType_ = CaseType::CASE_WINDOW; + ani_vm* vm_ = nullptr; wptr weakRef_ = nullptr; std::shared_ptr eventHandler_ = nullptr; DEFINE_VAR_DEFAULT_FUNC_SET(bool, IsDeprecatedInterface, isDeprecatedInterface, false) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp index 1ed9addea4..524cd1c982 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp @@ -56,14 +56,20 @@ void AniWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason reason, } currRect_ = rect; - auto task = [self = weakRef_, rect, eng = env_] () { + auto task = [self = weakRef_, rect, eng = vm_] () { auto thisListener = self.promote(); if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, eng or callback is nullptr"); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowSizeCallback", - nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniSize(eng, rect.width_, rect.height_)); + ani_env* env = nullptr; + ani_status ret = eng->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get env failed, ret:%{public}d", ret); + return; + } + AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowSizeCallback", + nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniSize(env, rect.width_, rect.height_)); }; if (!eventHandler_) { TLOGE(WmsLogTag::DEFAULT, "get main event handler failed!"); @@ -486,14 +492,20 @@ void AniWindowListener::OnRectChange(Rect rect, WindowSizeChangeReason reason) TLOGD(WmsLogTag::WMS_LAYOUT, "drag end change to move event"); rectChangeReason = RectChangeReason::MOVE; } - auto task = [self = weakRef_, rect, rectChangeReason, eng = env_] () { + auto task = [self = weakRef_, rect, rectChangeReason, eng = vm_] () { auto thisListener = self.promote(); if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]this listener, eng or callback is nullptr"); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowRectChangeCallback", - nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniRect(eng, rect), + ani_env* env = nullptr; + ani_status ret = eng->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]Get env failed, ret:%{public}d", ret); + return; + } + AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowRectChangeCallback", + nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniRect(env, rect), static_cast(rectChangeReason)); }; if (!eventHandler_) { diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp index dbb753a597..8be14a85b3 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp @@ -442,7 +442,13 @@ WmErrorCode AniWindowRegisterManager::RegisterListener(sptr window, cons TLOGE(WmsLogTag::DEFAULT, "[ANI]create global ref fail"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; }; - sptr windowManagerListener = new AniWindowListener(env, cbRef, caseType); + ani_vm* vm = nullptr; + ani_status aniRet = env->GetVM(&vm); + if (aniRet != ANI_OK || vm == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get VM failed"); + return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; + } + sptr windowManagerListener = new AniWindowListener(env, cbRef, caseType, vm); if (windowManagerListener == nullptr) { TLOGE(WmsLogTag::DEFAULT, "[ANI]New AniWindowListener failed"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; -- Gitee From 66d717aabddd0114e57a3f7ffdf798829765b927 Mon Sep 17 00:00:00 2001 From: kaicui Date: Thu, 11 Sep 2025 18:30:11 +0800 Subject: [PATCH 2/4] Fix multit thread env sharing and optimize impl Signed-off-by: kaicui --- .../include/ani_window_listener.h | 6 +-- .../window_stage_ani/src/ani_window.cpp | 12 ++--- .../src/ani_window_listener.cpp | 45 +++++++++++-------- .../src/ani_window_register_manager.cpp | 8 ++-- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h index 88852da2cd..d058cdf77b 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h @@ -55,8 +55,8 @@ class AniWindowListener : public IWindowChangeListener, public IDisplayIdChangeListener, public IWindowRotationChangeListener { public: - AniWindowListener(ani_env* env, ani_ref callback, CaseType caseType, ani_vm* vm) - : env_(env), aniCallback_(callback), caseType_(caseType), vm_(vm), + AniWindowListener(ani_env* env, ani_vm* vm, ani_ref callback, CaseType caseType) + : env_(env), vm_(vm), aniCallback_(callback), caseType_(caseType), weakRef_(wptr (this)) {} ~AniWindowListener(); ani_ref GetAniCallback() const { return aniCallback_; } @@ -109,9 +109,9 @@ private: void LifeCycleCallback(LifeCycleEventType eventType); int64_t noInteractionTimeout_ = 0; ani_env* env_ = nullptr; + ani_vm* vm_ = nullptr; ani_ref aniCallback_; CaseType caseType_ = CaseType::CASE_WINDOW; - ani_vm* vm_ = nullptr; wptr weakRef_ = nullptr; std::shared_ptr eventHandler_ = nullptr; DEFINE_VAR_DEFAULT_FUNC_SET(bool, IsDeprecatedInterface, isDeprecatedInterface, false) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp index eaa798e567..7f617a846d 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp @@ -1698,27 +1698,27 @@ void AniWindow::RegisterWindowCallback(ani_env* env, ani_object obj, ani_long na void AniWindow::RegisterNoInteractionDetectedCallback(ani_env* env, ani_object obj, ani_long nativeObj, ani_string type, ani_long timeOut, ani_ref callback) { - TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); AniWindow* aniWindow = reinterpret_cast(nativeObj); if (aniWindow != nullptr) { aniWindow->OnRegisterWindowCallback(env, type, callback, timeOut); } else { - TLOGE(WmsLogTag::DEFAULT, "[ANI] aniWindow is nullptr"); + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]aniWindow is nullptr!"); } } void AniWindow::OnRegisterWindowCallback(ani_env* env, ani_string type, ani_ref callback, ani_long timeOut) { - TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); auto window = GetWindow(); if (window == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI] window is nullptr"); + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]window is nullptr!"); AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY); return; } std::string cbType; AniWindowUtils::GetStdString(env, type, cbType); - TLOGI(WmsLogTag::DEFAULT, "[ANI] type:%{public}s", cbType.c_str()); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI] type:%{public}s", cbType.c_str()); WmErrorCode ret = registerManager_->RegisterListener(window, cbType, CaseType::CASE_WINDOW, env, callback, timeOut); if (ret != WmErrorCode::WM_OK) { AniWindowUtils::AniThrowError(env, ret); @@ -2874,7 +2874,7 @@ ani_status OHOS::Rosen::ANI_Window_Constructor(ani_vm *vm, uint32_t *result) reinterpret_cast(AniWindow::KeepKeyboardOnFocus)}, ani_native_function {"setWindowTouchableSync", "JZ:V", reinterpret_cast(AniWindow::SetWindowTouchable)}, - ani_native_function {"onNoInteractionDetected", nullptr, + ani_native_function {"onNoInteractionDetected", "lC{std.core.String}lC{std.core.Object}:", reinterpret_cast(AniWindow::RegisterNoInteractionDetectedCallback)}, ani_native_function {"opacity", "JD:V", reinterpret_cast(AniWindow::Opacity)}, diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp index 524cd1c982..8447b0c16b 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp @@ -27,8 +27,11 @@ using namespace AbilityRuntime; AniWindowListener::~AniWindowListener() { - ani_status ret = env_->GlobalReference_Delete(aniCallback_); - TLOGI(WmsLogTag::DEFAULT, "[ANI]~AniWindowListener ret:%{public}d", static_cast(ret)); + ani_status ret = ANI_OK; + if (env_ != nullptr && aniCallback_ != nullptr) { + ret = env_->GlobalReference_Delete(aniCallback_); + } + TLOGI(WmsLogTag::DEFAULT, "[ANI]~AniWindowListener ret: %{public}u", ret); } void AniWindowListener::OnLastStrongRef(const void *) @@ -56,16 +59,16 @@ void AniWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason reason, } currRect_ = rect; - auto task = [self = weakRef_, rect, eng = vm_] () { + auto task = [self = weakRef_, rect, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, eng or callback is nullptr"); + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, vm or callback is nullptr"); return; } ani_env* env = nullptr; - ani_status ret = eng->GetEnv(ANI_VERSION_1, &env); + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); if (ret != ANI_OK || env == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]Get env failed, ret:%{public}d", ret); + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get env failed, ret:%{public}u", ret); return; } AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowSizeCallback", @@ -395,18 +398,24 @@ int64_t AniWindowListener::GetTimeout() const void AniWindowListener::OnWindowNoInteractionCallback() { - TLOGI(WmsLogTag::DEFAULT, "[ANI] diaglogtargettouch"); - auto task = [self = weakRef_, eng = env_] () { + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); + auto task = [self = weakRef_, vm = vm_] () { auto thisListener = self.promote(); if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, eng or callback is nullptr"); + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]thisListener, vm or callback is nullptr!"); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowNoInteractionCallback", - nullptr, thisListener->aniCallback_); + ani_env* env = nullptr; + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]Get env failed, ret: %{public}u", ret); + return; + } + AniWindowUtils::CallAniFunctionVoid(env, "@ohos.window.window", "runWindowNoInteractionCallback", + "C{std.core.Object}:", thisListener->aniCallback_); }; if (!eventHandler_) { - TLOGE(WmsLogTag::DEFAULT, "get main event handler failed!"); + TLOGE(WmsLogTag::WMS_EVENT, "Get main event handler failed!"); return; } eventHandler_->PostTask(task, "wms:AniWindowListener::WindowNoInteractionCallback", 0, @@ -492,16 +501,16 @@ void AniWindowListener::OnRectChange(Rect rect, WindowSizeChangeReason reason) TLOGD(WmsLogTag::WMS_LAYOUT, "drag end change to move event"); rectChangeReason = RectChangeReason::MOVE; } - auto task = [self = weakRef_, rect, rectChangeReason, eng = vm_] () { + auto task = [self = weakRef_, rect, rectChangeReason, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]this listener, eng or callback is nullptr"); + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { + TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]this listener, vm or callback is nullptr"); return; } ani_env* env = nullptr; - ani_status ret = eng->GetEnv(ANI_VERSION_1, &env); + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); if (ret != ANI_OK || env == nullptr) { - TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]Get env failed, ret:%{public}d", ret); + TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]Get env failed, ret:%{public}u", ret); return; } AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowRectChangeCallback", diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp index 8be14a85b3..5ba2b4f1bf 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp @@ -325,12 +325,12 @@ WmErrorCode AniWindowRegisterManager::ProcessWindowNoInteractionRegister(sptr noInteractionMax)) { - TLOGE(WmsLogTag::DEFAULT, "invalid parameter: no-interaction-timeout %{public}" PRId64 " is not in " + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]invalid parameter: no-interaction-timeout %{public}" PRId64 " is not in " "(0s~%{public}" PRId64, timeout, noInteractionMax); return WmErrorCode::WM_ERROR_INVALID_PARAM; } thisListener->SetTimeout(timeout * secToMicrosecRatio); - return WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowNoInteractionListener(thisListener)); + return AniWindowUtils::ToErrorCode(window->RegisterWindowNoInteractionListener(thisListener)); } WmErrorCode AniWindowRegisterManager::ProcessScreenshotRegister(sptr listener, @@ -445,10 +445,10 @@ WmErrorCode AniWindowRegisterManager::RegisterListener(sptr window, cons ani_vm* vm = nullptr; ani_status aniRet = env->GetVM(&vm); if (aniRet != ANI_OK || vm == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]Get VM failed"); + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get VM failed, ret: %{public}u", aniRet); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; } - sptr windowManagerListener = new AniWindowListener(env, cbRef, caseType, vm); + sptr windowManagerListener = new AniWindowListener(env, vm, cbRef, caseType); if (windowManagerListener == nullptr) { TLOGE(WmsLogTag::DEFAULT, "[ANI]New AniWindowListener failed"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; -- Gitee From 328608f8ff3d111608f41276f9e04b33edcde3a8 Mon Sep 17 00:00:00 2001 From: kaicui Date: Thu, 11 Sep 2025 19:07:46 +0800 Subject: [PATCH 3/4] Fix typo Signed-off-by: kaicui --- .../window_runtime/window_stage_ani/src/ani_window_listener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp index 8447b0c16b..3e76d61149 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp @@ -401,7 +401,7 @@ void AniWindowListener::OnWindowNoInteractionCallback() TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); auto task = [self = weakRef_, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { TLOGE(WmsLogTag::WMS_EVENT, "[ANI]thisListener, vm or callback is nullptr!"); return; } -- Gitee From e963f2711a9ac7d722867fdde0f2a769213e8f38 Mon Sep 17 00:00:00 2001 From: c30013956 Date: Thu, 11 Sep 2025 20:30:06 +0800 Subject: [PATCH 4/4] fix(wms-layout):use MakeSptr Signed-off-by: c30013956 --- .../window_stage_ani/src/ani_window_register_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp index 5ba2b4f1bf..d7a74f2b02 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp @@ -448,7 +448,7 @@ WmErrorCode AniWindowRegisterManager::RegisterListener(sptr window, cons TLOGE(WmsLogTag::DEFAULT, "[ANI]Get VM failed, ret: %{public}u", aniRet); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; } - sptr windowManagerListener = new AniWindowListener(env, vm, cbRef, caseType); + auto windowManagerListener = sptr::MakeSptr(env, vm, cbRef, caseType); if (windowManagerListener == nullptr) { TLOGE(WmsLogTag::DEFAULT, "[ANI]New AniWindowListener failed"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; -- Gitee