diff --git a/adapter/ohos/entrance/BUILD.gn b/adapter/ohos/entrance/BUILD.gn index c26aea5128aa03382fd1654583862471a5b64a69..0737df37dc94d95edc15bf2f400a040a0908963a 100644 --- a/adapter/ohos/entrance/BUILD.gn +++ b/adapter/ohos/entrance/BUILD.gn @@ -144,7 +144,6 @@ template("ace_ohos_standard_source_set") { "relational_store:native_dataability", "relational_store:native_rdb", "resource_management:global_resmgr", - "runtime_core:ani", "safwk:system_ability_fwk", "samgr:samgr_proxy", "window_manager:libdm", diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 1da842ae8d1eabfbfa395d45a1128b8ac8781120..7195a658648dd40a79e622a8d0b0ccda0cd63100 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -15,8 +15,6 @@ #include "adapter/ohos/entrance/ace_container.h" -#include - #include "auto_fill_manager.h" #include "bundlemgr/bundle_mgr_proxy.h" #include "if_system_ability_manager.h" @@ -53,7 +51,7 @@ #include "bridge/common/utils/engine_helper.h" #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_loader.h" #include "core/common/ace_application_info.h" #include "core/common/ace_engine.h" #include "core/common/plugin_manager.h" @@ -357,14 +355,6 @@ void ParseLanguage(ConfigurationChange& configurationChange, const std::string& AceApplicationInfo::GetInstance().SetLocale(language, region, script, ""); } } - -void ReleaseStorageReference(void* sharedRuntime, void* storage) -{ - if (sharedRuntime && storage) { - auto* env = reinterpret_cast(sharedRuntime); - env->GlobalReference_Delete(reinterpret_cast(storage)); - } -} } // namespace AceContainer::AceContainer(int32_t instanceId, FrontendType type, std::shared_ptr aceAbility, @@ -662,7 +652,12 @@ void AceContainer::InitializeFrontend() } } else if (type_ == FrontendType::ARK_TS) { LOGI("Init ARK_TS Frontend"); - frontend_ = MakeRefPtr(sharedRuntime_); + auto arktsFrontend = ArktsFrontendLoader::GetInstance().CreatArkTsFrontend(sharedRuntime_); + if (arktsFrontend == nullptr) { + LOGE("Create arktsFrontend failed."); + return; + } + frontend_ = AceType::Claim(reinterpret_cast(arktsFrontend)); } else if (type_ == FrontendType::STATIC_HYBRID_DYNAMIC) { // initialize after AttachView LOGI("Init STATIC_HYBRID_DYNAMIC Frontend"); @@ -2465,18 +2460,13 @@ void AceContainer::SetAniLocalStorage(void* storage, const std::shared_ptr(sp); - if (!arktsFrontend) { - ReleaseStorageReference(sharedRuntime, storage); + ArktsFrontendLoader::GetInstance().DeleteAniReference(sharedRuntime, storage); return; } if (contextRef->GetBindingObject() && contextRef->GetBindingObject()->Get()) { - arktsFrontend->SetAniContext(id, contextRef->GetBindingObject()->Get()); + sp->SetHostContext(id, contextRef->GetBindingObject()->Get()); } - arktsFrontend->RegisterLocalStorage(id, storage); + sp->RegisterLocalStorage(id, storage); }, TaskExecutor::TaskType::UI, "ArkUISetAniLocalStorage"); } diff --git a/adapter/ohos/entrance/ace_container_hybrid_impl.cpp b/adapter/ohos/entrance/ace_container_hybrid_impl.cpp index fea3cb9119d8ae6a5a922ed2448707ad1a1d8b33..a5c1526be5fcf64e8745777c8b71e7b76bcf2961 100644 --- a/adapter/ohos/entrance/ace_container_hybrid_impl.cpp +++ b/adapter/ohos/entrance/ace_container_hybrid_impl.cpp @@ -15,8 +15,6 @@ #include "adapter/ohos/entrance/ace_container.h" -#include - #include "adapter/ohos/entrance/ace_view_ohos.h" #include "adapter/ohos/entrance/data_ability_helper_standard.h" #include "adapter/ohos/entrance/file_asset_provider_impl.h" @@ -38,7 +36,8 @@ #include "bridge/common/utils/engine_helper.h" #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_loader.h" +#include "interfaces/inner_api/ace/arkts_module_preloader.h" #include "core/common/ace_application_info.h" #include "core/common/ace_engine.h" #include "core/common/plugin_manager.h" @@ -62,9 +61,14 @@ const char* GetDeclarativeSharedLibrary() void AceContainer::InitializeStaticHybridDynamic(std::shared_ptr aceAbility) { // 1.2 initialization - frontend_ = MakeRefPtr(sharedRuntime_); + auto arktsFrontend = ArktsFrontendLoader::GetInstance().CreatArkTsFrontend(sharedRuntime_); + if (arktsFrontend == nullptr) { + LOGE("Create arktsFrontend failed."); + return; + } + frontend_ = AceType::Claim(reinterpret_cast(arktsFrontend)); // open statemanagement interop - DynamicCast(frontend_)->OpenStateMgmtInterop(); + frontend_->OpenStateMgmtInterop(); // 1.1 initialization #ifdef NG_BUILD @@ -106,10 +110,16 @@ void AceContainer::InitializeStaticHybridDynamic(std::shared_ptr aceAbility) { // 1.2 initialization - if (!ArktsFrontend::preloadArkTSRuntime) { + auto preloadArkTSRuntime = ArkTSModulePreloader::GetArkTSRuntime(); + if (!preloadArkTSRuntime) { LOGE("AceContainer::InitializeDynamicHybridStatic: ArktsFrontend::preloadArkTSRuntime is null, preload Fail"); } - subFrontend_ = MakeRefPtr(ArktsFrontend::preloadArkTSRuntime); + auto arktsFrontend = ArktsFrontendLoader::GetInstance().CreatArkTsFrontend(preloadArkTSRuntime); + if (arktsFrontend == nullptr) { + LOGE("Create arktsFrontend failed."); + return; + } + subFrontend_ = AceType::Claim(reinterpret_cast(arktsFrontend)); // 1.1 initialization if (isFormRender_) { #ifdef FORM_SUPPORTED diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 53105ca91d8ae785345f3860f27575f12f7ba098..640f17d28a961526b221047fc287a127c60074eb 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include "ability_context.h" @@ -102,7 +101,7 @@ #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/arkts_frontend/arkts_frontend_loader.h" #include "bridge/card_frontend/form_frontend_declarative.h" #include "core/common/ace_engine.h" #include "core/common/asset_manager_impl.h" @@ -1198,7 +1197,7 @@ void UIContentImpl::PreInitializeForm(OHOS::Rosen::Window* window, const std::st void UIContentImpl::PreInitializeFormAni(OHOS::Rosen::Window* window, const std::string& url, ani_object storage) { - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; // ArkTSCard need no window if (isFormRender_ && !window) { LOGI("[%{public}s][%{public}s][%{public}d]: InitializeForm: %{public}s", bundleName_.c_str(), @@ -1408,13 +1407,10 @@ ani_object UIContentImpl::GetUIAniContext() { auto container = Platform::AceContainer::GetContainer(instanceId_); 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(instanceId_); - return result; + CHECK_NULL_RETURN(frontend, nullptr); + auto result = frontend->GetUIContext(instanceId_); + return static_cast(result); } UIContentErrorCode UIContentImpl::Restore( @@ -1445,7 +1441,7 @@ UIContentErrorCode UIContentImpl::Restore( LOGI("Restore with contentInfo size: %{public}d, ContentInfotype: %{public}d", static_cast(contentInfo.size()), static_cast(type)); auto errorCode = UIContentErrorCode::NO_ERRORS; - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; errorCode = CommonInitialize(window, contentInfo, storageWrapper); CHECK_ERROR_CODE_RETURN(errorCode); RouterRecoverRecord record; @@ -2666,10 +2662,8 @@ UIContentErrorCode UIContentImpl::CommonInitialize( if (!storage) { container->SetAniLocalStorage(nullptr, context); } else { - auto* env = reinterpret_cast(runtime_); - ani_ref ref; - env->GlobalReference_Create(storage, &ref); - container->SetAniLocalStorage(reinterpret_cast(ref), context); + auto ref = ArktsFrontendLoader::GetInstance().CreateAniReference(runtime_, storage); + container->SetAniLocalStorage(ref, context); } } @@ -5930,7 +5924,7 @@ void UIContentImpl::RunIntentPageIfNeeded() UIContentErrorCode UIContentImpl::InitializeWithAniStorage( OHOS::Rosen::Window* window, const std::string& url, ani_object storage) { - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; auto errorCode = InitializeInner(window, url, storageWrapper, false); AddWatchSystemParameter(); return errorCode; @@ -5946,7 +5940,7 @@ UIContentErrorCode UIContentImpl::InitializeWithAniStorage( bundleName_.c_str(), moduleName_.c_str(), instanceId_, startUrl_.c_str()); return errorCode; } - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; errorCode = CommonInitialize(window, url, storageWrapper, focusWindowId); if (errorCode != UIContentErrorCode::NO_ERRORS) { return errorCode; @@ -5980,7 +5974,7 @@ UIContentErrorCode UIContentImpl::InitializeWithAniStorage(OHOS::Rosen::Window* const std::shared_ptr>& content, ani_object storage, const std::string& contentName) { auto errorCode = UIContentErrorCode::NO_ERRORS; - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; errorCode = CommonInitialize(window, "", storageWrapper); CHECK_ERROR_CODE_RETURN(errorCode); AddWatchSystemParameter(); @@ -6004,7 +5998,7 @@ UIContentErrorCode UIContentImpl::InitializeWithAniStorage(OHOS::Rosen::Window* UIContentErrorCode UIContentImpl::InitializeByNameWithAniStorage( OHOS::Rosen::Window* window, const std::string& name, ani_object storage) { - StorageWrapper storageWrapper { .aniStorage_ = storage }; + StorageWrapper storageWrapper { .aniStorage_ = static_cast(storage) }; auto errorCode = InitializeInner(window, name, storageWrapper, true); AddWatchSystemParameter(); return errorCode; diff --git a/adapter/ohos/entrance/ui_content_impl.h b/adapter/ohos/entrance/ui_content_impl.h index c9a4b5780f1ffde2f1591bb87e2c275e73771449..bc5be2fd0711fd1215fdd325b5ca3d2cabafebb4 100644 --- a/adapter/ohos/entrance/ui_content_impl.h +++ b/adapter/ohos/entrance/ui_content_impl.h @@ -53,7 +53,7 @@ class RSSyncTransactionHandler; namespace OHOS::Ace { struct StorageWrapper { std::optional napiStorage_; - std::optional aniStorage_; + std::optional aniStorage_; }; class ACE_FORCE_EXPORT UIContentImpl : public UIContent { diff --git a/build/libace.map b/build/libace.map index 92902b72fae36b6b498e3f3ad6c18b998258ca2e..3892d24498c8f0aa7d8b0f93f1709542810e0940 100644 --- a/build/libace.map +++ b/build/libace.map @@ -225,6 +225,7 @@ OHOS::Ace::Platform::GetTouchEventOriginOffset*; OHOS::Ace::Base64Util::Decode*; OHOS::Ace::Frontend::*; + OHOS::Ace::PluginFrontend*; OHOS::Ace::Component::*; OHOS::Ace::Framework::ManifestParser::*; OHOS::Ace::NG::PipelineContext::*; @@ -284,6 +285,8 @@ OHOS::Ace::ImageCache::ClearCacheImgObj*; OHOS::Ace::PipelineBase::CurrentThemeManager*; OHOS::Ace::PipelineBase::GetCurrentContext*; + OHOS::Ace::ArktsAniUtils::*; + OHOS::Ace::PluginManager::*; OHOS::Ace::NG::ViewAbstract::*; OHOS::Ace::NG::Inspector::*; @@ -334,16 +337,19 @@ "OHOS::Ace::NG::GeometryNode::SetMarginFrameOffset(OHOS::Ace::NG::OffsetT const&)"; "OHOS::Ace::NG::GeometryNode::GetFrameRect(bool) const"; OHOS::Ace::NG::GeometryNode::*; - + OHOS::Ace::NG::PageRouterManagerFactory::*; + OHOS::Ace::NG::PageRouterManager::*; OHOS::Ace::NG::InspectorFilter::*; OHOS::Ace::NG::ServiceCollaborationMenuAceHelper::*; OHOS::Ace::NG::ServiceCollaborationAceCallback::*; OHOS::Ace::DumpLog::*; OHOS::Ace::NG::UIExtensionAdapter::*; + virtual?thunk?to?OHOS::Ace::Animator::~Animator??; virtual?thunk?to?OHOS::Ace::Frontend::MaybeRelease*; virtual?thunk?to?OHOS::Ace::Frontend::~Frontend*; + virtual?thunk?to?OHOS::Ace::PluginFrontend::~PluginFrontend*; virtual?thunk?to?OHOS::Ace::Component::~Component*; vtable?for?OHOS::Ace::AceApplicationInfo; diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index 1bc6cf794cadd8b01ee7c8057cada8c7f054193c..333d1e937a8c9dd4421a469a75a40562527d9b6f 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 bc3fa7181dd37253f9448778c7ffbf332dea43e0..6ad185db539e46e5dec74f5783eb6f9cadcf27ef 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_$platform", "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) { - deps -= [ "arkts_frontend:arkts_frontend_$platform" ] - } - if (defined(config.js_pa_support) && config.js_pa_support) { deps += [ "$ace_root/${config.pa_engine_path}:pa_backend_$platform" ] } @@ -73,7 +68,6 @@ template("framework_bridge_ng") { configs = [ "$ace_root:ace_config" ] deps = [ - "arkts_frontend:arkts_frontend_$platform", "codec:data_codec", "common:bridge_common_ng_$platform", "common/accessibility:bridge_accessibility_$platform", diff --git a/frameworks/bridge/arkts_frontend/BUILD.gn b/frameworks/bridge/arkts_frontend/BUILD.gn index c3dbbf36104aed50a2038e5bc59b33732723ea1e..b2917de8e7712948beb0cd0cb0c5cc63782abb9c 100644 --- a/frameworks/bridge/arkts_frontend/BUILD.gn +++ b/frameworks/bridge/arkts_frontend/BUILD.gn @@ -16,7 +16,10 @@ import("//foundation/arkui/ace_engine/ace_config.gni") import("./link_abc.gni") group("arkts_frontend_native_package") { - deps = [ "koala_projects/arkoala-arkts/arkui-ohos/src/ani/native:ace_ani_native_package" ] + deps = [ + ":arkts_frontend", + "koala_projects/arkoala-arkts/arkui-ohos/src/ani/native:ace_ani_native_package" + ] } group("arkoala_ui2abc") { deps = [ "koala_projects/arkoala-arkts:arkoala" ] @@ -45,21 +48,15 @@ ohos_prebuilt_etc("arkoala_abc_prebuild") { template("arkts_frontend") { forward_variables_from(invoker, "*") - ohos_source_set(target_name) { + ohos_shared_library(target_name) { subsystem_name = ace_engine_subsystem part_name = ace_engine_part defines += invoker.defines configs = [ "$ace_root:ace_config" ] - if (!build_ohos_sdk) { - deps = [ ":ArkoalaNative_ark" ] - } + deps = [ "$ace_root/build:libace_compatible" ] sources = [ "ani_context_module.cpp", - "ani_graphics_module.cpp", - "ani_list_module.cpp", - "ani_water_flow_module.cpp", - "arkts_ani_utils.cpp", "arkts_frontend.cpp", "arkts_plugin_frontend.cpp", "entry/arkts_entry_loader.cpp", @@ -69,24 +66,23 @@ template("arkts_frontend") { "runtime_core:ani", ] - if (current_os == "ohos") { - external_deps += [ "graphic_2d:drawing_ani" ] - } } } foreach(item, ace_platforms) { - arkts_frontend("arkts_frontend_" + item.name) { - defines = [] - config = { - } - - if (defined(item.config)) { - config = item.config - } - - if (defined(config.defines)) { - defines = config.defines + if (item.name == "ohos") { + arkts_frontend("arkts_frontend") { + defines = [] + config = { + } + + if (defined(item.config)) { + config = item.config + } + + if (defined(config.defines)) { + defines = config.defines + } } } } diff --git a/frameworks/bridge/arkts_frontend/arkts_ani_utils.h b/frameworks/bridge/arkts_frontend/arkts_ani_utils.h index 1a89131964cff0359c79b9da7d04f57b95d87cad..c075481e5676762cc03200656971285936f6f94b 100644 --- a/frameworks/bridge/arkts_frontend/arkts_ani_utils.h +++ b/frameworks/bridge/arkts_frontend/arkts_ani_utils.h @@ -19,6 +19,8 @@ #include #include +#include "ui/base/macros.h" + #define ANI_CALL(env, call, onFail...) \ if (env) { \ const char* aniErr[] = { \ @@ -55,7 +57,7 @@ typedef class __ani_ref* ani_ref; typedef struct __ani_vm ani_vm; namespace OHOS::Ace { -class ArktsAniUtils final { +class ACE_FORCE_EXPORT ArktsAniUtils final { public: /** * Create std/core/Boolean. diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp index 1e02883624f99789d320ced309aad714d7e4529f..6a500b1b44ccc7ec671d84fc5d56ce456e5a1304 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp @@ -315,7 +315,7 @@ void ArktsFrontend::AttachPipelineContext(const RefPtr& context) } } -ani_ref ArktsFrontend::GetShared(int32_t id) +void* ArktsFrontend::GetSharedStorage(int32_t id) { int32_t currentInstance = id; if (currentInstance >= MIN_SUBCONTAINER_ID && currentInstance < MIN_PLUGIN_SUBCONTAINER_ID) { @@ -326,7 +326,7 @@ ani_ref ArktsFrontend::GetShared(int32_t id) LOGW("LocalStorage with ID %{public}d not found!", currentInstance); return nullptr; } - return reinterpret_cast(it->second); + return it->second; } void ArktsFrontend::Destroy() @@ -339,27 +339,25 @@ void ArktsFrontend::Destroy() handleMessageMethod_ = nullptr; } -ani_object ArktsFrontend::CallGetUIContextFunc(int32_t instanceId) +void* ArktsFrontend::GetUIContext(int32_t instanceId) { - ani_object result = nullptr; ani_status status; auto* env = ArktsAniUtils::GetAniEnv(vm_); - CHECK_NULL_RETURN(env, result); + CHECK_NULL_RETURN(env, nullptr); ani_class uiContextClass; if ((status = env->FindClass("Larkui/handwritten/UIContextUtil/UIContextUtil;", &uiContextClass)) != ANI_OK) { LOGE("FindClass UIContext failed, %{public}d", status); - return result; + return nullptr; } ani_ref aniRef = nullptr; if ((status = env->Class_CallStaticMethodByName_Ref(uiContextClass, "getOrCreateUIContextById", "I:L@ohos/arkui/UIContext/UIContext;", &aniRef, instanceId)) != ANI_OK) { LOGE("Class_CallStaticMethodByName_Ref failed, %{public}d", status); - return result; + return nullptr; } - result = reinterpret_cast(aniRef); - return result; + return static_cast(aniRef); } void* ArktsFrontend::GetEnv() @@ -531,12 +529,19 @@ bool ArktsFrontend::HandleMessage(void *frameNode, int32_t type, const std::stri return result == ANI_TRUE; } -void ArktsFrontend::SetAniContext(int32_t instanceId, ani_ref* context) +void ArktsFrontend::SetHostContext(int32_t instanceId, ani_ref* context) { std::shared_ptr shared_ptr(context); Framework::AniContextModule::AddAniContext(instanceId, shared_ptr); } +void* ArktsFrontend::GetHostContext() +{ + auto aniContext = Framework::AniContextModule::GetAniContext(); + CHECK_NULL_RETURN(aniContext, nullptr); + return static_cast(aniContext.get()); +} + void* ArktsFrontend::preloadArkTSRuntime = nullptr; void ArktsFrontend::PreloadAceModule(void* aniEnv) { @@ -564,4 +569,52 @@ extern "C" ACE_FORCE_EXPORT void OHOS_ACE_PreloadAceArkTSModule(void* aniEnv) { ArktsFrontend::PreloadAceModule(aniEnv); } + +extern "C" ACE_FORCE_EXPORT void* OHOS_ACE_GetArkTSRuntime() +{ + return ArktsFrontend::preloadArkTSRuntime; +} + +ani_ref CreateStorageReference(void* runtime, void* storage) +{ + ani_ref ref = nullptr; + if (runtime && storage) { + auto* env = reinterpret_cast(runtime); + env->GlobalReference_Create(reinterpret_cast(storage), &ref); + if (!ref) { + return nullptr; + } + } + return ref; +} + +void DeleteStorageReference(void* runtime, void* storage) +{ + if (runtime && storage) { + auto* env = reinterpret_cast(runtime); + env->GlobalReference_Delete(reinterpret_cast(storage)); + } +} + +extern "C" ACE_FORCE_EXPORT void* CreateArktsFrontend(void* runtime) { + if (!runtime) { + LOGE("runtime is nullptr."); + return nullptr; + } + return static_cast(new ArktsFrontend(runtime)); +} + +extern "C" ACE_FORCE_EXPORT void* CreateAniReference(void* runtime, void* storage) { + if (!runtime || !storage) { + return nullptr; + } + return static_cast(CreateStorageReference(runtime, storage)); +} + +extern "C" ACE_FORCE_EXPORT void DeleteAniReference(void* runtime, void* storage) { + if (!runtime || !storage) { + return; + } + DeleteStorageReference(runtime, storage); +} } // namespace OHOS::Ace diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.h b/frameworks/bridge/arkts_frontend/arkts_frontend.h index ddbda6d5ddc1917038b0cb0f8bd6eafd6ca28f1b..057d9911ccab62c1feb0b8d5536794180a104238 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.h +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.h @@ -265,7 +265,7 @@ public: void SetColorMode(ColorMode colorMode) override {} void RebuildAllPages() override {} void NotifyAppStorage(const std::string& key, const std::string& value) override {} - bool HandleMessage(void *frameNode, int32_t type, const std::string& param); + bool HandleMessage(void *frameNode, int32_t type, const std::string& param) override; RefPtr GetEventHandler() override { @@ -306,17 +306,7 @@ 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); - } - - ani_ref GetShared(int32_t id); + void* GetSharedStorage(int32_t id) override; void RegisterLayoutInspectorCallback(const RefPtr& layoutFunc, const std::string& componentId) { @@ -357,9 +347,11 @@ public: mediaUpdateCallback_ = nullptr; } - ani_object CallGetUIContextFunc(int32_t instanceId); + void* GetUIContext(int32_t instanceId) override; + + void SetHostContext(int32_t instanceId, ani_ref* context) override; - void SetAniContext(int32_t instanceId, ani_ref* context); + void* GetHostContext() override; RefPtr GetPageRouterManager() { @@ -369,7 +361,7 @@ public: void* GetEnv() override; static void PreloadAceModule(void* aniEnv); static void* preloadArkTSRuntime; - void OpenStateMgmtInterop(); + void OpenStateMgmtInterop() override; private: RefPtr taskExecutor_; RefPtr pipeline_; @@ -379,7 +371,6 @@ private: bool foregroundFrontend_ = false; RefPtr pageRouterManager_ = nullptr; - std::unordered_map storageMap_; RefPtr accessibilityManager_ = Framework::AccessibilityNodeManager::Create(); diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend_loader.h b/frameworks/bridge/arkts_frontend/arkts_frontend_loader.h new file mode 100644 index 0000000000000000000000000000000000000000..d795678adf6e813209492f03fc798f6aaaf2a73d --- /dev/null +++ b/frameworks/bridge/arkts_frontend/arkts_frontend_loader.h @@ -0,0 +1,150 @@ +/* + * 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_LOADER_H +#define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_LOADER_H + +#include +#include + +#include "macros.h" +#include "ui/base/utils/utils.h" +#include "interfaces/inner_api/ace/utils.h" + +namespace OHOS::Ace { +using CreateArktsFrontendFunc = void* (*)(const void*); +using CreateArktsPluginFrontendFunc = void* (*)(const void*); +using CreateAniReferenceFunc = void* (*)(const void*, const void*); +using DeleteAniReferenceFunc = void (*)(const void*, const void*); +const std::string CREATE_ARKTS_FRONTEND = "CreateArktsFrontend"; +const std::string CREATE_ARKTS_PLUGIN_FRONTEND = "CreateArktsPluginFrontend"; +const std::string CREATE_ANI_REFERENCE = "CreateAniReference"; +const std::string DELETE_ANI_REFERENCE = "DeleteAniReference"; +const std::string ARKTS_FRONTEND_LIB = "libarkts_frontend.z.so"; + +class ACE_FORCE_EXPORT ArktsFrontendLoader { +public: + static ArktsFrontendLoader& GetInstance() + { + static ArktsFrontendLoader instance; + return instance; + } + + void* CreatArkTsFrontend(const void* sharedRuntime) + { + if (!sharedRuntime) { + return nullptr; + } + if (!createArktsFrontendFunc_) { + createArktsFrontendFunc_ = + reinterpret_cast(LoadSymbol(CREATE_ARKTS_FRONTEND.c_str())); + } + CHECK_NULL_RETURN(createArktsFrontendFunc_, nullptr); + + return createArktsFrontendFunc_(sharedRuntime); + } + + void* CreateAniReference(const void* runtime, const void* storage) + { + if (!runtime || !storage) { + return nullptr; + } + + if (!createAniReferenceFunc_) { + createAniReferenceFunc_ = + reinterpret_cast(LoadSymbol(CREATE_ANI_REFERENCE.c_str())); + } + CHECK_NULL_RETURN(createAniReferenceFunc_, nullptr); + + return createAniReferenceFunc_(runtime, storage); + } + + void DeleteAniReference(const void* runtime, const void* storage) + { + if (!runtime || !storage) { + return; + } + + if (!deleteAniReferenceFunc_) { + deleteAniReferenceFunc_ = + reinterpret_cast(LoadSymbol(DELETE_ANI_REFERENCE.c_str())); + } + CHECK_NULL_VOID(deleteAniReferenceFunc_); + + deleteAniReferenceFunc_(runtime, storage); + } + + void* CreateArktsPluginFrontend(const void* sharedRuntime) + { + if (!sharedRuntime) { + return nullptr; + } + if (!createArktsPluginFrontendFunc_) { + createArktsPluginFrontendFunc_ = + reinterpret_cast(LoadSymbol(CREATE_ARKTS_PLUGIN_FRONTEND.c_str())); + } + CHECK_NULL_RETURN(createArktsPluginFrontendFunc_, nullptr); + + return createArktsPluginFrontendFunc_(sharedRuntime); + } + +private: + ArktsFrontendLoader() + { + DynamicLoadLibrary(); + } + + ~ArktsFrontendLoader() + { + CloseLibrary(); + } + + void CloseLibrary() + { + if (dlclose(handle_) != 0) { + return; + } + handle_ = nullptr; + createArktsFrontendFunc_ = nullptr; + createAniReferenceFunc_ = nullptr; + deleteAniReferenceFunc_ = nullptr; + createArktsPluginFrontendFunc_ = nullptr; + } + + void* LoadSymbol(const char* symName) + { + CHECK_NULL_RETURN(handle_, nullptr); + return dlsym(handle_, symName); + } + + bool DynamicLoadLibrary() + { + if (!handle_) { + handle_ = dlopen(ARKTS_FRONTEND_LIB.c_str(), RTLD_LAZY); + CHECK_NULL_RETURN(handle_, false); + } + return true; + } + + LIBHANDLE handle_ = nullptr; + CreateArktsFrontendFunc createArktsFrontendFunc_ = nullptr; + CreateAniReferenceFunc createAniReferenceFunc_ = nullptr; + DeleteAniReferenceFunc deleteAniReferenceFunc_ = nullptr; + CreateArktsPluginFrontendFunc createArktsPluginFrontendFunc_ = nullptr; +}; + +} // namespace OHOS::Ace + +#endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_LODER_H diff --git a/frameworks/bridge/arkts_frontend/arkts_plugin_frontend.cpp b/frameworks/bridge/arkts_frontend/arkts_plugin_frontend.cpp index 0012464333ee697fc7e362e68cb327cf2a2e30c1..1fb363955cc9ec4eec9f0a7e7902acc04236d2e1 100644 --- a/frameworks/bridge/arkts_frontend/arkts_plugin_frontend.cpp +++ b/frameworks/bridge/arkts_frontend/arkts_plugin_frontend.cpp @@ -188,4 +188,11 @@ void ArktsPluginFrontend::Destroy() app_ = nullptr; } +extern "C" ACE_FORCE_EXPORT void* CreateArktsPluginFrontend(void* runtime) { + if (!runtime) { + LOGE("runtime is nullptr."); + return nullptr; + } + return static_cast(new ArktsPluginFrontend(runtime)); +} } // namespace OHOS::Ace diff --git a/frameworks/bridge/declarative_frontend/ng/page_router_manager.h b/frameworks/bridge/declarative_frontend/ng/page_router_manager.h index 9926b65e9a2da6205ea82dee11ed42d8f7bf1cc7..33a9f852d5e50dd6fef58bc638f7fe5be949074a 100644 --- a/frameworks/bridge/declarative_frontend/ng/page_router_manager.h +++ b/frameworks/bridge/declarative_frontend/ng/page_router_manager.h @@ -89,7 +89,7 @@ struct RouterPageInfo { bool isUseIntent = false; }; -class PageRouterManager : public AceType { +class ACE_FORCE_EXPORT PageRouterManager : public AceType { DECLARE_ACE_TYPE(PageRouterManager, AceType) public: PageRouterManager() = default; diff --git a/frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h b/frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h index ea309d245aba23fa05929843f149d8bbef78075e..dbe5b2df2bdf7bbb1a3926122c3e94ddca75398c 100644 --- a/frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h +++ b/frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h @@ -19,7 +19,7 @@ #include "frameworks/bridge/declarative_frontend/ng/page_router_manager.h" namespace OHOS::Ace::NG { -class PageRouterManagerFactory { +class ACE_FORCE_EXPORT PageRouterManagerFactory { public: static RefPtr CreateManager(); }; diff --git a/frameworks/bridge/plugin_frontend/plugin_frontend.h b/frameworks/bridge/plugin_frontend/plugin_frontend.h index c38e09c8a2cdb2e2f405d7cd1561f2f50d037f7a..cdc69f414f544e050c391b8e1a7b635c9efaad0a 100644 --- a/frameworks/bridge/plugin_frontend/plugin_frontend.h +++ b/frameworks/bridge/plugin_frontend/plugin_frontend.h @@ -36,7 +36,7 @@ namespace OHOS::Ace { // - Load pages of a JS app, and parse the manifest.json before loading main page. // - Maintain the page stack of JS app by PluginFrontendDelegate. // - Lifecycle of JS app (also AceActivity). -class PluginFrontend : public Frontend { +class ACE_FORCE_EXPORT PluginFrontend : public Frontend { DECLARE_ACE_TYPE(PluginFrontend, Frontend); public: diff --git a/frameworks/core/common/frontend.h b/frameworks/core/common/frontend.h index d9acd4ea152ea97e4bb2e2d2f2f839087c0dab9b..82bfd2a0f95f71aa9b5908f1479300ffde42472b 100644 --- a/frameworks/core/common/frontend.h +++ b/frameworks/core/common/frontend.h @@ -31,6 +31,8 @@ using FrontendDialogCallback = std::function; typedef struct napi_value__* napi_value; +typedef struct __ani_env ani_env; +typedef class __ani_ref* ani_ref; namespace OHOS::Ace { @@ -386,6 +388,40 @@ public: } virtual void* GetEnv() { return nullptr; } + void RegisterLocalStorage(int32_t id, void* storage) + { + storageMap_.emplace(id, storage); + } + + void UnRegisterLocalStorage(int32_t id) + { + storageMap_.erase(id); + } + + virtual void* GetUIContext(int32_t instanceId) + { + return nullptr; + } + + virtual void* GetSharedStorage(int32_t id) + { + return nullptr; + } + + virtual void SetHostContext(int32_t instanceId, ani_ref* context) {} + + virtual void* GetHostContext() + { + return nullptr; + } + + virtual bool HandleMessage(void *frameNode, int32_t type, const std::string& param) + { + return false; + } + + virtual void OpenStateMgmtInterop() {} + protected: virtual bool MaybeRelease() override; FrontendType type_ = FrontendType::JS; @@ -395,6 +431,7 @@ protected: State state_ = State::UNDEFINE; mutable std::recursive_mutex mutex_; mutable std::mutex destructMutex_; + std::unordered_map storageMap_; }; } // namespace OHOS::Ace diff --git a/frameworks/core/common/plugin_manager.h b/frameworks/core/common/plugin_manager.h index c3e0219b9bd8633cc33c3c7d4ebb56058d0bf0f6..6664d39fd23c8ee600c31fc96ef39a306b7d354d 100644 --- a/frameworks/core/common/plugin_manager.h +++ b/frameworks/core/common/plugin_manager.h @@ -26,7 +26,7 @@ #include "core/components/plugin/plugin_sub_container.h" namespace OHOS::Ace { -class ACE_EXPORT PluginManager final : public Singleton { +class ACE_FORCE_EXPORT PluginManager final : public Singleton { DECLARE_SINGLETON(PluginManager); public: diff --git a/frameworks/core/components/plugin/plugin_sub_container.cpp b/frameworks/core/components/plugin/plugin_sub_container.cpp index e69355cc34346501ac79afa384ffd39418a22fcc..65ca6f65f017dc95408fe2e504315c1eb013ca7a 100644 --- a/frameworks/core/components/plugin/plugin_sub_container.cpp +++ b/frameworks/core/components/plugin/plugin_sub_container.cpp @@ -15,19 +15,20 @@ #include "core/components/plugin/plugin_sub_container.h" +#include "ability_info.h" + #include "adapter/ohos/entrance/ace_application_info.h" +#include "adapter/ohos/entrance/file_asset_provider_impl.h" +#include "bridge/arkts_frontend/arkts_frontend_loader.h" #include "bridge/common/utils/engine_helper.h" #include "core/common/ace_engine.h" #include "core/common/container_scope.h" #include "core/common/plugin_manager.h" #include "core/common/resource/resource_manager.h" -#include "adapter/ohos/entrance/file_asset_provider_impl.h" #include "core/components/plugin/hap_asset_provider_impl.h" #include "core/components/plugin/plugin_element.h" #include "core/components/plugin/plugin_window.h" #include "core/components/plugin/render_plugin.h" -#include "bridge/arkts_frontend/arkts_plugin_frontend.h" -#include "ability_info.h" namespace OHOS::Ace { namespace { @@ -74,7 +75,13 @@ void PluginSubContainer::Initialize(const std::string& codeLanguage) codeLanguage.c_str(), outSidePipelineContext->GetFrontendType()); return; } - frontend_ = AceType::MakeRefPtr(container->GetSharedRuntime()); + auto arktsPluginFrontend = + ArktsFrontendLoader::GetInstance().CreateArktsPluginFrontend(container->GetSharedRuntime()); + if (arktsPluginFrontend == nullptr) { + LOGE("Create arktsPluginFrontend failed."); + return; + } + frontend_ = AceType::Claim(reinterpret_cast(arktsPluginFrontend)); frontend_->Initialize(FrontendType::ARK_TS, taskExecutor_); TAG_LOGI(AceLogTag::ACE_PLUGIN_COMPONENT, "PluginSubContainer initialize end."); return; diff --git a/frameworks/core/components_ng/syntax/static/detached_free_root_proxy_node.h b/frameworks/core/components_ng/syntax/static/detached_free_root_proxy_node.h index 7a95d4a50af1a5656a3fb68a5c76cb813c6860e8..393c406b4d2623de6fc7b629a381605bc74ed341 100644 --- a/frameworks/core/components_ng/syntax/static/detached_free_root_proxy_node.h +++ b/frameworks/core/components_ng/syntax/static/detached_free_root_proxy_node.h @@ -22,8 +22,8 @@ #include "ui/base/referenced.h" #include "ui/base/utils/utils.h" -#include "bridge/arkts_frontend/arkts_frontend.h" #include "core/common/container.h" +#include "core/common/frontend.h" #include "core/components_ng/base/ui_node.h" #include "core/pipeline/base/element_register.h" @@ -38,7 +38,7 @@ public: { const auto& container = Container::GetContainer(instanceId); CHECK_NULL_VOID(container); - frontend_ = AceType::DynamicCast(container->GetFrontend()); + frontend_ = container->GetFrontend(); } ~DetachedFreeRootProxyNode() override @@ -57,7 +57,7 @@ public: } private: - WeakPtr frontend_; + WeakPtr frontend_; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/interfaces/native/BUILD.gn b/frameworks/core/interfaces/native/BUILD.gn index a766b0533aa90882e51e1698d5e156dde75b8f57..3f9dff632245f8dd9d6b52387d02aea8f517b495 100644 --- a/frameworks/core/interfaces/native/BUILD.gn +++ b/frameworks/core/interfaces/native/BUILD.gn @@ -169,6 +169,10 @@ template("ace_core_interfaces_native_node") { "ani/xcomponent_ani_modifier.cpp", "ani/list_ani_modifier.cpp", "ani/condition_scope_ani_modifier.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_water_flow_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_list_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/arkts_ani_utils.cpp", ] if (build_ohos_sdk) { sources -= [ @@ -182,6 +186,10 @@ template("ace_core_interfaces_native_node") { "ani/list_ani_modifier.cpp", "ani/drag_controller_ani_modifier.cpp", "ani/drag_controller_utils.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_water_flow_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/ani_list_module.cpp", + "${ace_root}/frameworks/bridge/arkts_frontend/arkts_ani_utils.cpp", ] } @@ -255,6 +263,11 @@ template("ace_core_interfaces_native_node") { "napi:ace_napi", "runtime_core:ani", ] + + if (current_os == "ohos") { + external_deps += [ "graphic_2d:drawing_ani" ] + } + if (defined(config.pixel_map_support)) { external_deps += [ "image_framework:image", @@ -269,6 +282,7 @@ template("ace_core_interfaces_native_node") { } if (build_ohos_sdk) { external_deps -= [ + "graphic_2d:drawing_ani", "runtime_core:ani", ] } diff --git a/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp b/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp index 6e273ab300861d3c1578046728e14836a79f5242..28367123bfaae49c4423a3ff63b02ca22b0cf40a 100644 --- a/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp @@ -50,9 +50,19 @@ static thread_local std::vector restoreInstanceIds_; ani_ref* GetHostContext() { - auto contextValue = OHOS::Ace::Framework::AniContextModule::GetAniContext(); + auto context = NG::PipelineContext::GetCurrentContextSafely(); + if (context == nullptr) { + TAG_LOGE(AceLogTag::ACE_LAYOUT_INSPECTOR, "GetHostContext-ani can not get current context."); + return nullptr; + } + auto frontend = context->GetFrontend(); + if (frontend == nullptr) { + TAG_LOGE(AceLogTag::ACE_LAYOUT_INSPECTOR, "GetHostContext-ani can not get current frontend."); + return nullptr; + } + auto contextValue = frontend->GetHostContext(); if (contextValue) { - return contextValue.get(); + return reinterpret_cast(contextValue); } return nullptr; } @@ -114,15 +124,10 @@ ani_ref GetSharedLocalStorage() TAG_LOGE(AceLogTag::ACE_LAYOUT_INSPECTOR, "GetSharedLocalStorage-ani can not get current frontend."); return nullptr; } - auto arkTsFrontend = AceType::DynamicCast(frontend); - if (arkTsFrontend == nullptr) { - TAG_LOGE(AceLogTag::ACE_LAYOUT_INSPECTOR, "GetSharedLocalStorage-ani can not convert to arkts frontend."); - return nullptr; - } int32_t currentInstance = Container::CurrentIdSafely(); - auto storage = arkTsFrontend->GetShared(currentInstance); + auto storage = frontend->GetSharedStorage(currentInstance); if (storage) { - return storage; + return reinterpret_cast(storage); } return nullptr; } diff --git a/interfaces/inner_api/ace/arkts_module_preloader.cpp b/interfaces/inner_api/ace/arkts_module_preloader.cpp index 661873ff84bf3f2ec77b5d93971ea36e9def3a69..43ae0b8e56747f98868f4b4da4efc3fc2ef69cd3 100644 --- a/interfaces/inner_api/ace/arkts_module_preloader.cpp +++ b/interfaces/inner_api/ace/arkts_module_preloader.cpp @@ -22,11 +22,14 @@ namespace OHOS::Ace { using CreateFunc = void (*)(void*); +using GetArkTSRuntimeFunc = void* (*)(); constexpr char PRE_INIT_ACE_ARKTS_MODULE_FUNC[] = "OHOS_ACE_PreloadAceArkTSModule"; +constexpr char GET_ARKTS_RUNTIME_FUNC[] = "OHOS_ACE_GetArkTSRuntime"; +const std::string ARKTS_FRONTEND_LIB = "libarkts_frontend.z.so"; void InitAceArkTSModule(void* runtime) { - LIBHANDLE handle = LOADLIB(AceForwardCompatibility::GetAceLibName()); + LIBHANDLE handle = LOADLIB(ARKTS_FRONTEND_LIB.c_str()); if (handle == nullptr) { return; } @@ -46,4 +49,20 @@ void ArkTSModulePreloader::Preload(void* aniEnv) InitAceArkTSModule(reinterpret_cast(aniEnv)); } +void* ArkTSModulePreloader::GetArkTSRuntime() +{ + LIBHANDLE handle = LOADLIB(ARKTS_FRONTEND_LIB.c_str()); + if (handle == nullptr) { + return nullptr; + } + + auto entry = reinterpret_cast(LOADSYM(handle, GET_ARKTS_RUNTIME_FUNC)); + if (entry == nullptr) { + FREELIB(handle); + return nullptr; + } + + return entry(); +} + } // namespace OHOS::Ace diff --git a/interfaces/inner_api/ace/arkts_module_preloader.h b/interfaces/inner_api/ace/arkts_module_preloader.h index 97ca9320d5be4595b629d975968d1fd9b6edd36b..c7c300be8ac741de81d66e13d20d9b8dc94ac4e7 100644 --- a/interfaces/inner_api/ace/arkts_module_preloader.h +++ b/interfaces/inner_api/ace/arkts_module_preloader.h @@ -28,6 +28,7 @@ class ACE_FORCE_EXPORT ArkTSModulePreloader { public: static void Preload(void* aniEnv); + static void* GetArkTSRuntime(); };