HarmonyOS RUST 应用开发指导

尚未崩坏  论坛元老 | 2024-6-24 07:03:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1876|帖子 1876|积分 5628

HarmonyOS RUST 应用开发指导

1 前言

1.1 简介

本文用于指导以Rust作为应用开发语言进行鸿蒙应用开发以及 OpenHarmony 对于Rust语言的支持说明
1.2 范围

本指导适用以下范围:


  • 构建OpenHarmony设备可运行的 Rust 模块。
  • 使用 DevEco Studio 集成开发情况进行应用开发并调用 Rust 模块能力。
2 背景介绍

2.1 技术适用场景介绍

开发者在进行鸿蒙应用开发时,盼望用 Rust 构建部分应用模块以得到应用在运行性能、安全等方面的提升,大概开发者盼望将三方 Rust 模块进行鸿蒙化。
虽然Rust主线版本已经支持 OpenHarmony,但当前Rust对于 OpenHarmony 为 tier3 支持,无法使用 rustup 下载到 OpenHarmony 对应的 std 尺度库。所以保举使用 rust nightly 版本-Z build-std实时构建std尺度库,此方式会默认将 OpenHarmony 的 std 和 Rust 模块静态链接。后续也将会升级为 Tier2 支持。
2.2 技术使用场景介绍

使用Rust开发鸿蒙应用
目前OpenHarmony 对应用只开放了ArkTS API 和 C API(NDK), 没有 Rust API。
应用使用 Rust 开发的程序,通常使用 Rust 语言实现,并导出 C 函数接口,最终编译成一个 C动态链接库,即 Rust 中的cdylib。在体系看来这个Rust语言编写的 动态库和 C/C++ 实现的动态库没有区别。
应用使用 Rust 语言的依赖限制和使用 C/C++ 语言开发也很雷同,即最终只可以依赖包括 libc 在在内的 NDK 库的范围。 例如 Rust 程序可以直接通过 nix crate 和 libc crate 访问 C库中的 posix 接口, 但是不能通过 openssl-sys crates 访问到体系中的 openssl, 和 C/C++ 代码一样, 须要自行交叉编译 openssl 和应用一起部署。
3 团体解决方案介绍

3.1 鸿蒙团体实现方案介绍

基于当前Rust社区对OpenHarmony 的支持和IDE开发现状,提供一个使用Rust官方工具链编译天生可以在 OpenHarmony 运行程序的简朴示例,Rust编译平台为 linux 体系,应用开发平台为 Windows 版本 DevEco Studio。
下载Rust工具链和std源码

  • 下载安装 rustup:
  1. $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
复制代码

  • 下载安装 toolchain 和 std 源码
  1. rustup toolchain install nightly
  2. rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
复制代码

  • 下载设置 ohos-ndk
您可以从OpenHarmony社区下载站点获取最新的release版本(当前为4.0-Release)的Public SDK包
  1. # 下载SDK包
  2. wget https://repo.huaweicloud.com/openharmony/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz
  3. # 解压SDK包
  4. tar -xvzf ohos-sdk-windows_linux-public.tar.gz
  5. # 解压ndk压缩包
  6. cd /path/to/ohos-sdk/linux
  7. unzip native-linux-*
复制代码

  • 新建 clang wrapper 文件
创建 aarch64-unknown-linux-ohos-clang.sh,并编辑文件内容为(注意:需修改文件中的路径信息!):
  1. #!/bin/sh
  2. exec /path/to/ohos-sdk/linux/native/llvm/bin/clang \
  3.   -target aarch64-linux-ohos \
  4.   --sysroot=/path/to/ohos-sdk/linux/native/sysroot \
  5.   -D__MUSL__ \
  6.   "$@"
复制代码

  • 新增cargo交叉编译设置
编辑~/.cargo/config
  1. [target.aarch64-unknown-linux-ohos]
  2. ar = "/path/to/ohos-sdk/linux/native/llvm/bin/llvm-ar"
  3. linker = "/path/to/aarch64-unknown-linux-ohos-clang.sh"
复制代码

  • 创建项目
  1. cargo init --lib mylib
复制代码
该项目会自动创建一个src/lib.rs文件,该文件中定义了一个add()函数,为了可以或许支持FFI跨语言调用,我们对其做如下修改:
  1. // add is a function
  2. #[no_mangle]
  3. pub extern "C" fn rust_add(left: usize, right: usize) -> usize {
  4.     left + right
  5. }
复制代码

  • 指定编译目标范例为cdylib
在Cargo工程设置文件Cargo.toml中修改[lib]字段
  1. [lib]
  2. crate-type=["cdylib"]
复制代码

  • 编译
使用下面下令天生debug版本,如需天生release版本,在下令行中添加--release选项
  1. cargo +nightly build -Z build-std --target aarch64-unknown-linux-ohos
复制代码
至此我们使用Rust语言开发了一个可以运行在 OpenHarmony 上的动态库,现在可以在 App 工程的Cmake文件中引用这个天生的so文件

  • 创建并设置应用demo
我们将Rust接口函数通过FFI转换为对应C接口调用。并进一步将该接口注册到NAPI中。


  • 打开IDE(DevEco Studio), 选择创建一个native工程。将我们编译好的libmylib.so放置到entry/libs/arm64-v8a目录下(没有该目录,利市动创建)
  • 修改entry/build-profile.json5,对externalNativeOptions字段添加对于abi的过滤,只编译一种arm64-v8a一种目标架构。
  1. "externalNativeOptions": {
  2.     "path": "./src/main/cpp/CMakeLists.txt",
  3.     "arguments": "",
  4.     "cppFlags": "",
  5.     "abiFilters": [
  6.         "arm64-v8a"
  7.     ]
  8. }
复制代码


  • 修改entry/src/main/cpp/CMakeLists.txt, 添加对于libmylib.so的链接。
  1. # the minimum version of CMake.
  2. cmake_minimum_required(VERSION 3.4.1)
  3. project(MyApplication11)
  4. set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
  5. include_directories(${NATIVERENDER_ROOT_PATH}
  6.                     ${NATIVERENDER_ROOT_PATH}/include)
  7. add_library(entry SHARED hello.cpp)
  8. target_link_libraries(entry PUBLIC libace_napi.z.so ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libmylib.so)
复制代码


  • 在entry/src/main/cpp/hello.cpp中,添加rust_add()函数声明和函数调用。
  1. #include "napi/native_api.h"
  2. extern "C" {
  3.     unsigned rust_add(unsigned left, unsigned right);
  4. }
  5. ...
  6. // napi_create_double(env, value0 + value1, &sum);
  7.    napi_create_double(env, rust_add(value0, value1), &sum)
  8. ...
复制代码

  • 应用测试
接入真机设备或模拟器,打开应用并点击页面中的 Hello World 字符,在IDE的 Log 选项卡查看到字样:"Test NAPI 2+3 =5" 完成测试。
3.2 DevEco Studio Rust集成开发解决方案

当前的DevEco Studio并不直接支持Rust开发、编译、调试,但是可以通过安装三方插件和调试工具,调用三方rust库来实现rust的集成开发和arkts与rust的交互。下面是一个在IDE中开发rust代码的例子(windows):

  • 安装Rust三方插件:
    下载地址:Rust

下载得到一个zip格式的压缩包,在IDE中可以通过从磁盘手动安装该插件


  • 安装cidr 插件
    该插件由android studio提供,将本仓库的cidr-debugger-plugin文件夹拷贝到deveco studio的插件目录


  • 安装windows Rustup
截止 2024/4/1,Rust已经在nightly版本对OpenHarmony达成tier2支持。不再须要使用-Zbuild-std选项。

  • 新建windows的clang wrapper文件
假设文件位于C:\Users\{username}\.cargo\aarch64-unknown-linux-ohos-clang.cmd:
  1. C:\Users\{username}\AppData\Local\OpenHarmony\Sdk\10\native\llvm\bin\clang.exe ^
  2. -target aarch64-linux-ohos ^
  3. --sysroot=C:\Users\{username}\AppData\Local\OpenHarmony\Sdk\10\native\sysroot ^
  4. -D__MUSL__ %*
复制代码

  • 新增cargo交叉编译设置
编辑C:\Users\{username}\.cargo\config.toml,新增下面内容(注意路径使用“/”):
  1. [target.aarch64-unknown-linux-ohos]
  2. ar = "C:/Users/{username}/AppData/Local/OpenHarmony/Sdk/10/native/llvm/bin/llvm-ar.exe"
  3. linker = "C:/Users/{username}/.cargo/aarch64-unknown-linux-ohos-clang.cmd"
  4. [profile.debug]
  5. opt-level=0
  6. debug = true
  7. debug-assertions = true
复制代码

  • 新建cargo工程, 与arkts直接交互


  • 在IDE中新建native工程后,并在IDE终端通过cargo 创建工程:
  1. cargo new mylib --lib
复制代码


  • 在Cargo.toml中增长下面内容:
  1. [lib]
  2. crate-type = ["cdylib"]
  3. [dependencies]
  4. napi-ohos        = { version = "*" }
  5. napi-derive-ohos = { version = "*" }
  6. [build-dependencies]
  7. cc = "1.0"
  8. napi-build-ohos = { version = "*" }
复制代码


  • 新建build.rs文件:
  1. use napi_build_ohos;
  2. fn main() {
  3.   napi_build_ohos::setup();
  4. }
复制代码


  • 修改src/lib.rs 内容为:
  1. use napi_derive_ohos::napi;
  2. #[napi]
  3. pub fn rust_add(left: u32, right: u32) -> u32 {
  4.     left + right
  5. }
复制代码


  • 交叉编译鸿蒙对应的动态库:
  1. cargo build --target=aarch64-unknown-linux-ohos
复制代码

  • 为IDE工程导入Rust动态库


  • 将我们编译好的libmylib.so放置到entry/libs/arm64-v8a目录下(没有该目录,利市动创建)
  • 在entry\src\main\cpp\types\libentry\index.d.ts新增Rust的映射接口:
  1. export const rustAdd: (a: number, b: number) => number;
复制代码


  • 在entry\src\main\ets\pages\Index.ets文件中导入该动态库:
  1. import rustlib from 'libmylib.so'
  2. ...
  3. hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', rustlib.rustAdd(2, 3));
  4. ...
复制代码

  • 应用测试
接入真机设备或模拟器,打开应用并点击页面中的 Hello World 字符,在IDE的 Log 选项卡查看到字样:"Test NAPI 2+3 =5" 完成测试。

  • 关于rust代码开发与调试
安装Rust插件和debugger插件后,可以在IDE中直接运行和调试Rust代码, 并支持ArkTS和rust的跨语言调试。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表