Rust+HarmonyOS: 交叉编译纯血鸿蒙openssl

1,741 阅读3分钟

DALL·E 2024-05-09 21.23.02 - A visually appealing horizontal illustration representing the concept of using Rust programming language to develop native libraries for OpenHarmony. .webp

使用 Rust 编写原生库 —— 比 C++ 更具优势

近年来,Rust 以其卓越的性能和安全性,逐渐成为替代 C++ 的新兴编程语言。尤其是在编写高效、可靠的原生库方面,Rust 展现出了更为强大的竞争力。在本教程中,我们将基于华为开源操作系统 OpenHarmony(OHOS),探索如何利用 Rust 构建高性能原生库,并逐步配置相关环境,使其适用于 OpenHarmony 系统。

快速开始

为了充分利用 Rust 开发原生库的优势,我们首先需要确保 Rust 的版本处于最新状态,并且具备对 OHOS 支持的架构。本文将带你逐步配置 Rust 开发环境,为开发 OpenHarmony 原生库做好准备。

1. 切换至 nightly 版本
  1. 安装 nightly 版本的 Rust:

    rustup install nightly
    
  2. 切换到 nightly 版本:

    rustup default nightly
    
  3. 确认安装是否成功:

    rustc --version
    # 若输出类似以下内容,则说明安装成功:
    # rustc 1.80.0-nightly (faefc618c 2024-05-07)
    
2. 添加 rust-src 组件

确保安装 rust-src 组件。如果提示 Not Found,请执行 rustup update 进行更新:

rustup component add rust-src
3. 添加 OHOS 支持的架构
  1. 使用以下命令检查当前 Rust 默认使用的版本:

    rustup show
    # 输出示例:
    # nightly-x86_64-apple-darwin (default)
    
  2. 查询支持的架构:

    rustc --print target-list | grep ohos
    # 应该输出以下内容,若没有则需更新 Rust:
    # aarch64-unknown-linux-ohos
    # armv7-unknown-linux-ohos
    # x86_64-unknown-linux-ohos
    
  3. 添加架构支持:

    rustup target add aarch64-unknown-linux-ohos
    rustup target add armv7-unknown-linux-ohos
    rustup target add x86_64-unknown-linux-ohos
    
4. 配置 OHOS openssl-sys
  1. 添加环境变量至 ~/.zshrc 或相应的 Shell 配置文件中:
export AARCH64_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/arm64-v8a/
export ARMV7_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/armeabi-v7a/
export X86_64_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/x86_64/
export AARCH64_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
export ARMV7_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
export X86_64_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
  1. 注意NO_VENDOR=1 目前鸿蒙暂不支持 vendored, Cargo.toml 文件中不要添加 features
    [dependencies.openssl]
    version = "=0.10.57"
    # features = ["vendored"]

至此,我们已经完成了 Rust 环境的设置。接下来,你可以开始使用 Rust 构建 OpenHarmony 支持的原生库,在接下来的篇章中,我们将深入探讨如何利用 Rust 打造更为高效、安全的原生库。

撰写不易,请给个赞👍吧


补充(24/09/27)

纯血鸿蒙使用 openssl-111

项目不支持3.x可以使用111版本进行替代

ohos-openssl

openssl-111

git 执行命令直接添加补丁 patchs/openssl.patch,如果执行不成功可以手动添加

diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
index cba57b4127..5257f89755 100644
--- a/Configurations/10-main.conf
+++ b/Configurations/10-main.conf
@@ -907,7 +907,21 @@ my %targets = (
         perlasm_scheme   => "elf32",
         multilib         => "x32",
     },
-
+    "ohos-aarch64" => {
+        inherit_from     => [ "linux-aarch64" ],
+        shared_extension => ".so"
+    },
+    "ohos-arm" => {
+        inherit_from     => [ "linux-generic32" ],
+        asm_arch         => 'armv4',
+        perlasm_scheme   => "linux32",
+        ex_libs          => add(threads("-lclang_rt.builtins")),
+        shared_extension => ".so"
+    },
+    "ohos-x86_64" => {
+        inherit_from     => [ "linux-x86_64" ],
+        shared_extension => ".so"
+    },
     "linux-ia64" => {
         inherit_from     => [ "linux-generic64" ],
         bn_ops           => "SIXTY_FOUR_BIT_LONG",