docs/development/ohos-integration-guidelines.md
这篇教程,讲述了如何将 Hippy SDK 集成到一个现有的 Ohos 工程。
注:以下文档都是假设您已经具备一定的 Ohos 开发经验。
注:一定是打开 Hippy 项目根目录,不是 Demo 的根目录
依赖远程 ohpm 上 Har 包:
"dependencies": {
"hippy": "3.3.2"
}
或者依赖本地 Har 包:
"dependencies": {
"hippy": "file:./libs/hippy.har"
}
获取 libhippy.so 接口对象和 UIAbility context
import libHippy from 'libhippy.so' // libhippy.so下面可能会有红线提示,可忽略
AppStorage.setOrCreate("libHippy", libHippy)
AppStorage.setOrCreate("abilityContext", this.context)
AppStorage.setOrCreate("mainWindow", mainWindow)
注:App 直接集成 Hippy,context 使用 UIAbility context;如果 App 在一个模块里集成 Hippy,js 等资源也集成在模块里,context 使用 getContext().createModuleContext("moduleName"),否则会找不到 js 等资源。
创建 HippyEngine、初始化 HippyEngine、加载业务 bundle
this.hippyEngine = createHippyEngine(params)
this.hippyEngine.initEngine()
this.hippyEngine?.loadModule()
注:loadModule 需要在 initEngine 成功后调用,即回调结果返回 EngineInitStatus.STATUS_OK 后
HippyRoot({
hippyEngine: this.hippyEngine,
rootViewWrapper: this.rootViewWrapper,
onRenderException: (exception: HippyException) => {
this.exception = `${exception.message}\n${exception.stack}`
},
})
注:确保这里 this.hippyEngine 和 this.rootViewWrapper 是有效值
Hippy页面退出时,需要释放资源。 destroyModule 用来释放对应 loadModule 的页面资源,destroyEngine 用来释放对应 initEngine 的引擎环境资源。 一定要先 destroyModule,返回后再 destroyEngine。
hippyEngine?.destroyModule(rootId, () => {
hippyEngine?.destroyEngine();
});
具体可以参考 Har Demo 工程中 EntryAbility.ets Index.ets 实现
源码接入主要为了方便在 App 项目里直接调试 Hippy 代码(c++ 和 ets 代码)。
"dependencies": {
"hippy": "file:../Hippy/framework/ohos/"
}
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "",
"cppFlags": "",
},
cmake_minimum_required(VERSION 3.14)
project(hippy)
set(BIZ_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../")
set(HIPPY_ROOT_DIR "${BIZ_ROOT_DIR}/Hippy_src/framework/ohos/")
set(HIPPY_IMPL_CPP_DIR "${HIPPY_ROOT_DIR}/src/main/cpp/impl")
add_subdirectory("${HIPPY_IMPL_CPP_DIR}" ./hippy_impl)
add_library(${PROJECT_NAME} SHARED
)
target_link_libraries(${PROJECT_NAME} PUBLIC hippy_impl)
set(SOURCE_SET
)
set(PUBLIC_SOURCE_SET
)
target_sources(${PROJECT_NAME} PRIVATE ${SOURCE_SET} PUBLIC ${PUBLIC_SOURCE_SET})
获取 libhippy.so 接口对象和 UIAbility context
import libHippy from 'libhippy.so'
AppStorage.setOrCreate("libHippy", libHippy)
AppStorage.setOrCreate("abilityContext", this.context)
AppStorage.setOrCreate("mainWindow", mainWindow)
创建 HippyEngine、初始化 HippyEngine、加载业务 bundle
this.hippyEngine = createHippyEngine(params)
this.hippyEngine.initEngine()
this.hippyEngine?.loadModule()
组装 HippyRoot 组件
HippyRoot({
hippyEngine: this.hippyEngine,
rootViewWrapper: this.rootViewWrapper,
onRenderException: (exception: HippyException) => {
this.exception = `${exception.message}\n${exception.stack}`
},
})
Hippy页面退出时,需要释放资源。 destroyModule 用来释放对应 loadModule 的页面资源,destroyEngine 用来释放对应 initEngine 的引擎环境资源。 一定要先 destroyModule,返回后再 destroyEngine。
hippyEngine?.destroyModule(rootId, () => {
hippyEngine?.destroyEngine();
});
具体可以参考 Demo 工程中 EntryAbility.ets 等实现
CMakeLists.txt 说明构建的 Har 包较大说明: 为了方便定位crash,配置了debugSymbol strip为false,构建的har包里so带详细符号,所以size较大,App集成后会自动strip掉符号变小。 比如:har包有3.8M,其中解压后libhippy.so大小为13.9M,strip符号变小后har包大小为1.9M,解压后so大小为6.2M。