当前位置: 首页 > 科技观察

在OpenHarmony开发板上运行WasmEdge

时间:2023-03-23 10:26:52 科技观察

硬件不统一,但对用户体验要求很高。设备必须能够安全、跨平台(例如应用商店)运行第三方开发者提供的软件应用,因此直接原生编译的软件应用(NativeClient,或NaCl)不是主流。鸿蒙、安卓等主流操作系统一般都会提供基于Java或JavaScript的软件执行沙箱来支持第三方应用。但这样的软件执行沙箱有几大问题:支持的编程语言有限,支持的语言有IP和法律风险,一般资源开销大,不能支持实时系统安全。多语言、跨平台、高性能、轻量级、安全的软件执行环境,让开发者兼顾性能、便携性和安全性。WebAssembly是移动和物联网设备上系统中间件的最佳选择。WasmEdge是由CNCF托管的轻量级、高性能和可扩展的WebAssembly运行时,用于云原生、边缘和去中心化应用程序。WasmEdge可以运行用C/C++、Rust、Swift、AssemblyScript或Kotlin等语言编译的标准WebAssembly字节码程序。OpenHarmony是由OpenAtom基金会孵化和运营的开源项目。其目标是面向全场景、全连接、全智能时代,构建基于开源方式的智能终端设备操作系统框架和平台,推动万物互联产业的繁荣发展。WasmEdge为OpenHarmony提供了与JVM和JS引擎处于同一级别的运行时,但比JVM和JS引擎更安全、更快、更小、更易于管理。通过WasmEdge,第三方开发者用C、C++、Rust等语言编写的Wasm程序可以在设备上安全运行,扩大了OpenHarmony的开发者群体。WasmEdge相当于OpenHarmony的一个完全开源的开发执行环境。社区开发者可以轻松运行编译好的WebAssembly程序,降低门槛。WasmEdge目前支持Linux、macOS、Windows和实时操作系统seL4。添加对OpenHarmony的支持将丰富WasmEdge的生态系统。介绍完了,就进入编程时间了。请参考下面的教程,在OpenHarmony板上从源代码构建和测试WasmEdge。1.完全编译OpenHarmonyOS2。获取WasmEdge源代码3。修改OpenHarmony标准系统配置文件4.构建WasmEdge和OpenHarmony5。环境准备OpenHarmony标准体系OpenHarmony标准体系为开发者提供了一个Docker环境,封装了相应的编译工具链。本文档主要介绍在Docker环境下搭建WasmEdge的步骤。获取并编译OpenHarmony源码,请参考OpenHarmony提供的搭建Ubuntu环境的文档-Docker方式。请注意,为了后续的WasmEdge交叉编译过程,Openharmony需要在构建WasmEdge之前完全编译。#获取docker镜像后$dockerrun-it-v$(pwd):/home/openharmonyopenharmony-docker-standard:0.0.5$./build.sh--product-nameHi3516DV300获取WasmEdge源码OpenHarmony放第三-partylibraryproject是在third_party文件夹下的,所以我们需要在third_party文件夹下获取WasmEdge源码。之后,用户可以根据需要更改路径,修改相关配置文件中的路径。$dockerrun-it-v$(pwd):/home/openharmonyopenharmony-docker-standard:0.0.5$cdthird_party$gitclonehttps://github.com/WasmEdge/WasmEdge.git$cdWasmEdge修改OpenHarmony标准系统配置文件添加WasmEdge子系统配置修改OpenHarmony构建目录下的subsystem_config.json文件,添加wasmedge子系统如下。{..."wasmedge":{"path":"third_party/WasmEdge","name":"wasmedge"},...}添加组件到产品配置修改OpenHarmony产品配置文件,对应的配置标准系统文件为:productdefine/common/products/Hi3516DV300.json。在配置文件中添加“wasmedge:wasmedge”:{},表示产品将wasmedge子系统下的wasmedge模块编译打包成版本。{..."parts":{..."wasmedge:wasmedge":{}}}使用OpenHarmony构建WasmEdge说明在OpenHarmony中构建的WasmEdge目前仅支持wasmedge,wasm的通用运行时。wasmedge可以在解释器模式下执行WASM文件,或者执行由WASM文件的AOT预编译生成的机器代码二进制格式文件。但是,目前还不支持在OpenHarmony中对WASM文件进行AOT预编译。执行构建脚本执行WasmEdge源码下的utils/build_for_ohos.sh命令行脚本,会自动执行以下任务:将OpenHarmony需要的构建配置文件如.gn移动到WasmEdge项目的根目录下;使用OpenHarmony的编译工具链交叉编译WasmEdge;运行OpenHarmony的构建脚本build.sh进行完整编译。此步骤将wasmedge添加到OpenHarmonyOS;$dockerrun-it-v$(pwd):/home/openharmonyopenharmony-docker-standard:0.0.5$cdthird_party/WasmEdge/utils/ohos$./build_for_ohos.sh/home/openharmony当终端显示如下信息时,说明表示编译完成。...post_process=====buildHi3516DV300successful.2021-12-1503:18:50++++++++++++++++++++++++++++++++++++++++++++检查wasmedge是否编译打包到OpenHarmonyOS中。$cd/home/openharmony/out/ohos-arm-release/packages/phone/system/bin$ls当输出文件名中存在wasmedge时,表示WasmEdge已成功导入OpenHarmonyOS。测试刻录图像。将重新编译好的OpenHarmony标准系统镜像烧录到开发板中。详见OpenHarmony提供的Hi3516DV300开发板烧录文档。运行应用程序WasmEdge在tools/wasmedge/examples/文件夹中提供测试示例。在OpenHarmony标准体系中,这些样本是写在系统镜像中的,仍然可以测试。通过串口工具连接开发板并启动OpenHarmony标准系统后,我们可以进行如下测试。#cd/system/usr/wasmedge_example#wasmedgehello.wasm123hello123#wasmedge--reactoradd.wasmadd224#wasmedge--reactorfibonacci.wasmfib834#wasmedge--reactorfactorial.wasmfac12479001600##cdjs#wasmedge--dir2.3.wasmhello接下来,您可以参考WasmEdgeBook使用OpenHarmony标准体系中的WasmEdgeRuntime来运行您自己的WebAssembly应用程序。移植过程中踩过的坑最后,跟大家分享一下WasmEdge移植到OpenHarmonyOS过程中遇到的一些问题和注意事项。交叉编译cmake项目需要配置交叉编译的工具链。官方的交叉编译配置给出了参考,但需要在此基础上细化,比如指定Clang和Clang++的位置。另外,标准版sysroot的路径也有所不相同,具体可以参考WasmEdge中的配置:set(TOOLSCHAIN_PATH"${OHOS_DIR_PATH}/prebuilts/clang/ohos/linux-x86_64/llvm")set(TOOLCHAIN_HOSTAIN"${TOOLSbin")设置(OHOS_SYSROOT_PATH"${OHOS_DIR_PATH}/out/ohos-arm-release/obj/third_party/musl")设置(CMAKE_TOOLCHAIN_PREFIXllvm-)设置(LLVM_PATH“${OHOS_DIR_PATH}/prebuilts/clang/ohos/linux-x86_64/llvm”)include_directories(${LLVM_PATH}/include/c++/v1)include_directories(${OHOS_SYSROOT_PATH}/usr/include/arm-linux-ohosmusl)link_directories(${OHOS_SYSROOT_PATH}/usr/lib/arm-linux-ohosmusl)set(TOOLCHAIN_CC"${TOOLCHAIN_HOST}/clang")set(TOOLCHAIN_CXX"${TOOLCHAIN_HOST}/clang++")set(CMAKE_C_COMPILER${TOOLCHAIN_CC})set(CMAKE_C_FLAGS"--target=arm-linux-ohosmusl-D__clang__-march=armv7-a-mfloat-abi=softfp-mtune=generic-armv7-a-mfpu=neon-mthumb-w--sysroot=${OHOS_SYSROOT_PATH}")set(CMAKE_CXX_COMPILER${TOOLCHAIN_CXX})set(CMAKE_CXX_FLAGS"--target=arm-linux-ohosmusl-D__clang__-march=armv7-a-mfloat-abi=softfp-mtune=generic-armv7-a-mfpu=neon-mthumb-w--sysroot=${OHOS_SYSROOT_PATH}")set(MY_LINK_FLAGS"--target=arm-linux-ohosmusl--sysroot=${OHOS_SYSROOT_PATH}")设置(CMAKE_LINKERclang)设置(CMAKE_CXX_LINKERclang++)设置(CMAKE_C_LINKERclang)设置(CMAKE_C_LINK_EXECUTABLE"${CMAKE_C_LINKER}${MY_LINK_FLAGS}-o")set(CMAKE_CXX_LINK_EXECUTABLE"${CMAKE_CXX_LINKER}${MY_LINK_FLAGS}-o")编译工具链OpenHarmonyOS使用gn+ninja编译对于cmake组织编译的项目,案例官方cmake项目移植文档给出的是基于轻量级系统的,并不完全适合在标准版本系统上移植,将项目写入OpenHarmonyOS编译的镜像中,烧写到开发板上,需要编写gn脚本参与OpenHarmonyOS的编译过程。WasmEdge编译过程中,需要用到spqlog项目。在构建过程中,有一个拉取spdl??og项目并编译生成sqdlog静态库的动作。这意味着仅仅将WasmEdge相关库的编译过程改写成gn脚本是不够的。重写了spdlog的编译过程,大大增加了工作量。那么,对于项目所依赖但不属于OpenHarmonyOS的静态库模块,如何在编译时将此模块导入到OpenHarmonyOS中呢?OpenHarmonyOS提供的gn编写模板包含ohos_copy,可以将生成的静态库移动到生成的目标文件夹中。这样当实际编译需要链接的时候,这个静态库就可以看作是OpenHarmonyOS的一个原生模块,而不是缺少这个库。在WasmEdge的迁移过程中,执行的编译脚本是提前进行一次交叉编译,生成需要拷贝的spdlog静态库,然后执行OpenHarmonyOS的编译脚本,从而按照定义进行组织在项目目录下的BUILD.gn中编译。在WasmEdge的BUILD.gn中,spdlog静态库的描述如下:ohos_copy("spdlog"){sources=["$WASMEDGE_ROOT_DIR/build/_deps/spdlog-build/libspdlog.a",]outputs=[target_out_dir+"/lib/libspdlog.a"]module_install_name=""}标准C库我们平时使用的标准C库是GNU发布的libc库,OpenHarmony中使用的是Musl-libc,所以如果在项目代码中使用glibc那需要移植宏变量的代码,那么一开始就需要在Musl-libc中修改或者重新定义为宏变量。链接条目../../third_party/WasmEdge/lib/system/allocator.cpp:64:40:error:unusedvariable'k4G'[-Werror,-Wunused-const-variable]staticinlineconstexprconstuint64_tk4G=UINT64_C(0x100000000);^../../third_party/WasmEdge/lib/system/allocator.cpp:65:40:error:unusedvariable'k12G'[-Werror,-Wunused-const-variable]staticinlineconstexprconstuint64_tk12G=UINT64_C(0x300000000);^1warningand2errorsgenerated。类错误,在BUILD.gn中使用源代码的模块添加cflags。例如对于上面的错误,可以添加如下cflags:cflags=[..."-Wno-unused-const-variable",...]如果出现如下C++链接编译错误,../../third_party/WasmEdge/lib/host/wasi/inode-linux.cpp:745:3:error:cannotuse'try'withexceptionsdisabledtry{^然后添加cflags_cc:#BUILD.gn使用源码对应模块{...cflags_cc=[..."-fexceptions",...]}在移植过程中,类似这样的编译错误还有很多,这里就不一一列举了。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区

最新推荐
猜你喜欢