From 2d2ad8d71a8f076f6ca6303163cc56fe1bb49e47 Mon Sep 17 00:00:00 2001 From: kangchongtao Date: Sat, 12 Jul 2025 10:04:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8B=AC=E7=AB=8Bso?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kangchongtao Change-Id: I2b209e60ba134f1b43cd53b6f47d66c003d0f6d7 --- adapter/ohos/build/BUILD.gn | 1 + adapter/ohos/entrance/ace_container.cpp | 15 ++-- adapter/ohos/entrance/ui_content_impl.cpp | 9 +- frameworks/base/subwindow/subwindow_manager.h | 2 +- frameworks/bridge/BUILD.gn | 9 -- frameworks/bridge/arkts_frontend/BUILD.gn | 3 +- .../bridge/arkts_frontend/arkts_frontend.cpp | 12 ++- .../bridge/arkts_frontend/arkts_frontend.h | 14 +-- .../arkts_frontend/arkts_frontend_helper.h | 89 +++++++++++++++++++ frameworks/core/common/frontend.h | 16 ++++ 10 files changed, 132 insertions(+), 38 deletions(-) create mode 100644 frameworks/bridge/arkts_frontend/arkts_frontend_helper.h diff --git a/adapter/ohos/build/BUILD.gn b/adapter/ohos/build/BUILD.gn index b70e40698a6..b5e349a3cd5 100644 --- a/adapter/ohos/build/BUILD.gn +++ b/adapter/ohos/build/BUILD.gn @@ -31,6 +31,7 @@ group("ace_packages") { "$ace_root/interfaces/inner_api/ace:ace_uicontent", "$ace_root/interfaces/napi/kits:napi_group", "$ace_root/interfaces/native:ace_packages_ndk", + "$ace_root/frameworks/bridge/arkts_frontend:arkts_frontend", ] if (is_asan) { diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 0c7f590e6c3..fc1f3973668 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -54,6 +54,7 @@ #include "bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h" #include "bridge/js_frontend/js_frontend.h" #include "bridge/arkts_frontend/arkts_frontend.h" +#include "bridge/arkts_frontend/arkts_frontend_helper.h" #include "core/common/ace_application_info.h" #include "core/common/ace_engine.h" #include "core/common/plugin_manager.h" @@ -650,7 +651,12 @@ void AceContainer::InitializeFrontend() return; } } else if (type_ == FrontendType::ARK_TS) { - frontend_ = MakeRefPtr(sharedRuntime_); + auto arkts_frontend = ArktsFrontendHelper::GetInstance().CreatArkTsFrontend(sharedRuntime_); + if (arkts_frontend == nullptr) { + LOGE("Create arkts frontend failed."); + return; + } + frontend_ = AceType::Claim(reinterpret_cast(arkts_frontend)); } else { LOGE("Frontend type not supported"); EventReport::SendAppStartException(AppStartExcepType::FRONTEND_TYPE_ERR); @@ -2451,12 +2457,7 @@ void AceContainer::SetAniLocalStorage(void* storage, const std::shared_ptr(sp); - if (!arktsFrontend) { - ReleaseStorageReference(sharedRuntime, storage); - return; - } - arktsFrontend->RegisterLocalStorage(id, storage); + sp->RegisterLocalStorage(id, storage); }, TaskExecutor::TaskType::UI, "ArkUISetAniLocalStorage"); } diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 24a9a068a55..ca56bb4bd3b 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -103,7 +103,6 @@ #include "base/perfmonitor/perf_monitor.h" #include "base/subwindow/subwindow_manager.h" #include "base/utils/system_properties.h" -#include "bridge/arkts_frontend/arkts_frontend.h" #include "bridge/card_frontend/form_frontend_declarative.h" #include "core/common/ace_engine.h" #include "core/common/asset_manager_impl.h" @@ -128,6 +127,7 @@ #include "core/components_ng/render/adapter/rosen_render_context.h" #include "core/image/image_file_cache.h" #include "core/pipeline_ng/pipeline_context.h" +#include "bridge/arkts_frontend/arkts_frontend_helper.h" #ifdef FORM_SUPPORTED #include "core/common/form_manager.h" #endif @@ -1425,10 +1425,9 @@ ani_object UIContentImpl::GetUIAniContext() ContainerScope scope(instanceId_); ani_object result = nullptr; auto frontend = container->GetFrontend(); - CHECK_NULL_RETURN(frontend, result); - auto arktsFrontend = AceType::DynamicCast(frontend); - CHECK_NULL_RETURN(arktsFrontend, result); - result = arktsFrontend->CallGetUIContextFunc(); + CHECK_NULL_RETURN(frontend, nullptr); + result = static_cast(frontend->CallGetUIContextFunc()); + CHECK_NULL_RETURN(result, nullptr); return result; } diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index b128821c08a..a58ab773bf3 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -85,7 +85,7 @@ public: void AddParentContainerId(int32_t containerId, int32_t parentContainerId); void RemoveParentContainerId(int32_t containerId); - int32_t GetParentContainerId(int32_t containerId); + ACE_FORCE_EXPORT int32_t GetParentContainerId(int32_t containerId); int32_t GetSubContainerId(int32_t parentContainerId); const std::vector GetAllSubContainerId(int32_t parentContainerId); diff --git a/frameworks/bridge/BUILD.gn b/frameworks/bridge/BUILD.gn index 81b0e47f5a6..c19819267c7 100644 --- a/frameworks/bridge/BUILD.gn +++ b/frameworks/bridge/BUILD.gn @@ -34,7 +34,6 @@ template("framework_bridge") { "declarative_frontend:declarative_frontend_$platform", # bridge source - "arkts_frontend:arkts_frontend", "card_frontend:card_frontend_$platform", "codec:data_codec", "common:bridge_common_$platform", @@ -43,10 +42,6 @@ template("framework_bridge") { "plugin_frontend:plugin_frontend_$platform", ] - if (build_ohos_sdk || is_arkui_x) { - deps -= [ "arkts_frontend:arkts_frontend" ] - } - if (defined(config.js_pa_support) && config.js_pa_support) { deps += [ "$ace_root/${config.pa_engine_path}:pa_backend_$platform" ] } @@ -73,15 +68,11 @@ template("framework_bridge_ng") { configs = [ "$ace_root:ace_config" ] deps = [ - "arkts_frontend:arkts_frontend", "codec:data_codec", "common:bridge_common_ng_$platform", "common/accessibility:bridge_accessibility_$platform", "declarative_frontend:declarative_frontend_$platform", ] - if (is_arkui_x) { - deps -= [ "arkts_frontend:arkts_frontend" ] - } if (defined(config.js_pa_support) && config.js_pa_support) { deps += [ "$ace_root/${config.pa_engine_path}:pa_backend_$platform" ] } diff --git a/frameworks/bridge/arkts_frontend/BUILD.gn b/frameworks/bridge/arkts_frontend/BUILD.gn index 7ebc64e2510..5760965799f 100644 --- a/frameworks/bridge/arkts_frontend/BUILD.gn +++ b/frameworks/bridge/arkts_frontend/BUILD.gn @@ -13,13 +13,14 @@ import("//foundation/arkui/ace_engine/ace_config.gni") -ohos_source_set("arkts_frontend") { +ohos_shared_library("arkts_frontend") { subsystem_name = ace_engine_subsystem part_name = ace_engine_part configs = [ "$ace_root:ace_config" ] deps = [ ":ArkoalaNative_ark", "arkoala:arkoala_prebuild", + "$ace_root/build:libace_compatible", ] if (build_ohos_sdk) { diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp index f2c787e4d5b..8754b289736 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp @@ -245,7 +245,7 @@ void ArktsFrontend::Destroy() env_->GlobalReference_Delete(app_); } -ani_object ArktsFrontend::CallGetUIContextFunc() +void* ArktsFrontend::CallGetUIContextFunc() { ani_object result = nullptr; ani_status status; @@ -265,6 +265,14 @@ ani_object ArktsFrontend::CallGetUIContextFunc() LOGE("New UIContext object failed, %{public}d", status); return result; } - return result; + return static_cast(result); +} + +extern "C" ACE_FORCE_EXPORT void* CreateArktsFrontend(void* runtime) { + if (!runtime) { + LOGE("runtime is nullptr."); + return nullptr; + } + return static_cast(new ArktsFrontend(runtime)); } } // namespace OHOS::Ace diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.h b/frameworks/bridge/arkts_frontend/arkts_frontend.h index b612d7a7e7c..c327ec4c889 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.h +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.h @@ -238,16 +238,6 @@ public: void FlushReload() override {} void HotReload() override {} - void RegisterLocalStorage(int32_t id, void* storage) - { - storageMap_.emplace(id, storage); - } - - void UnRegisterLocalStorage(int32_t id) - { - storageMap_.erase(id); - } - void* GetShared(int32_t id); void RegisterLayoutInspectorCallback(const RefPtr& layoutFunc, const std::string& componentId) @@ -270,7 +260,7 @@ public: drawCallbacks_.erase(componentId); } - ani_object CallGetUIContextFunc(); + void* CallGetUIContextFunc() override; bool IsDrawChildrenCallbackFuncExist(const std::string& componentId) override { return false; } void OnDrawChildrenCompleted(const std::string& componentId) override {} @@ -281,8 +271,6 @@ private: ani_ref app_; bool foregroundFrontend_ = false; - std::unordered_map storageMap_; - ACE_DISALLOW_COPY_AND_MOVE(ArktsFrontend); std::map> layoutCallbacks_; diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h b/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h new file mode 100644 index 00000000000..fcdca9a5c0a --- /dev/null +++ b/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H +#define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H + +#include +#include +#include +#include + +#include "interfaces/inner_api/ace/utils.h" +#include "base/utils/macros.h" +#include "base/utils/noncopyable.h" + +namespace OHOS::Ace { +using ArkTsFrontendHandle = void*; +using CreateArktsFrontendFunc = void* (*)(const void*); +using GetANIContextFunc = void* (*)(const void*); + +const std::string ARKTS_FRONTEND_LIB = "libarkts_frontend.z.so"; +const std::string CREATE_FRONTEND = "CreatArkTsFrontend"; + +class ACE_EXPORT ArktsFrontendHelper final { +public: + static ArktsFrontendHelper& GetInstance() + { + static ArktsFrontendHelper instance; + return instance; + } + void* CreatArkTsFrontend(void* sharedRuntime) + { + if (!createArktsFrontendFunc_) { + createArktsFrontendFunc_ = + reinterpret_cast(LoadSymbol(CREATE_FRONTEND.c_str())); + } + + CHECK_NULL_RETURN(createArktsFrontendFunc_, nullptr); + return createArktsFrontendFunc_(sharedRuntime); + } +private: + ArktsFrontendHelper() { + DynamicLoadLibrary(); + } + + ~ArktsFrontendHelper() + { + CloseLibrary(); + } + + bool DynamicLoadLibrary() + { + if (!arkTsFrontendHandle_) { + arkTsFrontendHandle_ = dlopen(ARKTS_FRONTEND_LIB.c_str(), RTLD_LAZY); + CHECK_NULL_RETURN(arkTsFrontendHandle_, false); + } + return true; + } + void CloseLibrary() + { + if (dlclose(arkTsFrontendHandle_) != 0) { + return; + } + arkTsFrontendHandle_ = nullptr; + createArktsFrontendFunc_ = nullptr; + } + void* LoadSymbol(const char* symName) + { + CHECK_NULL_RETURN(arkTsFrontendHandle_, nullptr); + return dlsym(arkTsFrontendHandle_, symName); + } + + ArkTsFrontendHandle arkTsFrontendHandle_ = nullptr; + CreateArktsFrontendFunc createArktsFrontendFunc_ = nullptr; +}; +} // namespace OHOS::Ace +#endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H diff --git a/frameworks/core/common/frontend.h b/frameworks/core/common/frontend.h index 8f31fdd01b2..57b67cf80f9 100644 --- a/frameworks/core/common/frontend.h +++ b/frameworks/core/common/frontend.h @@ -360,6 +360,21 @@ public: return ""; } + virtual void RegisterLocalStorage(int32_t id, void* storage) + { + storageMap_.emplace(id, storage); + } + + void UnRegisterLocalStorage(int32_t id) + { + storageMap_.erase(id); + } + + virtual void* CallGetUIContextFunc() + { + return nullptr; + } + protected: virtual bool MaybeRelease() override; FrontendType type_ = FrontendType::JS; @@ -369,6 +384,7 @@ protected: State state_ = State::UNDEFINE; mutable std::recursive_mutex mutex_; mutable std::mutex destructMutex_; + std::unordered_map storageMap_; }; } // namespace OHOS::Ace -- Gitee