OpenHarmony开发者论坛

标题: OpenHarmony4.0的Rust开发 [打印本页]

作者: 深开鸿_王石    时间: 2024-1-19 09:18
标题: OpenHarmony4.0的Rust开发
[md]### 背景

**Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C++代码和提升编译速度,使用了GN + Ninja的编译构建系统。GN的构建语言简洁易读,Ninja的汇编级编译规则直接高效。 为了在OpenHarmony中集成Rust代码,并最大程度发挥Rust和OpenHarmony中原有C/C++代码的交互性,采用GN作为统一构建工具,即通过GN构建Rust源码文件(xxx.rs),并增加与C/C++互操作、编译时lint、测试、IDL转换、三方库集成、IDE等功能。同时扩展gn框架,支持接口自动化转换,最大程度简化开发。**

---

#### 基本概念

| **术语**  | **描述**                                                                                       |
| --------------- | ---------------------------------------------------------------------------------------------------- |
| **Cargo** | **Cargo是Rust官方使用的构建工具,允许Rust项目声明其各种依赖项,并确保您始终获得可重复的构建。** |
| **crate** | **crate是一个独立的可编译单元。**                                                              |
| **Lint**  | **Lint是指出常见编程错误、错误、样式错误和可疑结构的工具。可以对程序进行更加广泛的错误分析。** |

#### 配置规则

**OpenHarmony提供了用于Rust代码编译构建的各类型GN模板,可以用于编译Rust可执行文件,动态库和静态库等。各类型模板说明如下:**

| **GN模板**                      | **功能**              | **输出**                                            |
| ------------------------------------- | --------------------------- | --------------------------------------------------------- |
| **ohos\_rust\_executable**      | **rust可执行文件**    | **rust可执行文件,不带后缀**                        |
| **ohos\_rust\_shared\_library** | **rust动态库**        | **rust dylib动态库,默认后缀.dylib.so**             |
| **ohos\_rust\_static\_library** | **rust静态库**        | **rust rlib静态库,默认后缀.rlib**                  |
| **ohos\_rust\_proc\_macro**     | **rust proc\_macro**  | **rust proc\_macro库, 默认后缀.so**                |
| **ohos\_rust\_shared\_ffi**     | **rust FFI动态库**    | **rust cdylib动态库,给C/C++模块调用,默认后缀.so** |
| **ohos\_rust\_static\_ffi**     | **rust FFI静态库**    | **rust staticlib库,给C/C++模块调用,默认后缀.a**   |
| **ohos\_rust\_cargo\_crate**    | **三方包Cargo crate** | **rust三方crate,支持rlib、dylib、bin**             |
| **ohos\_rust\_systemtest**      | **rust系统测试用例**  | **rust可执行系统测试用例,不带后缀**                |
| **ohos\_rust\_unittest**        | **rust单元测试用例**  | **rust可执行单元测试用例,不带后缀**                |
| **ohos\_rust\_fuzztest**        | **rust Fuzz测试用例** | **rust可执行Fuzz测试用例,不带后缀**                |

#### 配置Rust静态库示例

**该示例用于测试Rust可执行bin文件和静态库rlib文件的编译,以及可执行文件对静态库的依赖,使用模板ohos\_rust\_executable和ohos\_rust\_static\_library。操作步骤如下:**

1. **创建build/rust/tests/test\_rlib\_crate/src/simple\_printer.rs,如下所示:**
   ```
   //! simple_printer

   /// struct RustLogMessage

   pub struct RustLogMessage {
       /// i32: id
       pub id: i32,
       /// String: msg
       pub msg: String,
   }

   /// function rust_log_rlib
   pub fn rust_log_rlib(msg: RustLogMessage) {
       println!("id:{} message:{:?}", msg.id, msg.msg)
   }
   ```
2. **创建build/rust/tests/test\_rlib\_crate/src/main.rs,如下所示:**
   ```
   //! rlib_crate example for Rust.

   extern crate simple_printer_rlib;

   use simple_printer_rlib::rust_log_rlib;
   use simple_printer_rlib::RustLogMessage;

   fn main() {
       let msg: RustLogMessage = RustLogMessage {
           id: 0,
           msg: "string in rlib crate".to_string(),
       };
       rust_log_rlib(msg);
   }
   ```
3. **配置gn脚本build/rust/tests/test\_rlib\_crate/BUILD.gn,如下所示:**
   ```
   import("//build/ohos.gni")

   ohos_rust_executable("test_rlib_crate") {
     sources = [ "src/main.rs" ]
     deps = [ ":simple_printer_rlib" ]
   }

   ohos_rust_static_library("simple_printer_rlib") {
     sources = [ "src/simple_printer.rs" ]
     crate_name = "simple_printer_rlib"
     crate_type = "rlib"
     features = [ "std" ]
   }
   ```
4. **执行编译得到的可执行文件,运行结果如下:**
   ```
   ./build.sh --product-name rk3568 --build-target build/rust/tests:tests  --no-prebuilt-sdk
   hdc_std.exe shell mount -o rw,remount /
   hdc_std.exe shell file send test_dylib_crate /data/local/tmp
   hdc_std.exe file send libsimple_printer_dylib.dylib.so /system/lib

   hdc_std.exe shell
   # cd /data/local/tmp
   # chmod +x test_dylib_crate
   # ./test_dylib_crate
   id:0 message:"string in rlib crate"
   ```

#### 配置Rust应用系统库示例

1. **增加依赖**
   ```
   // GN 里增加依赖
   ohos_rust_executable("test_dylib_crate") {
     sources = [ "src/main.rs" ]
     deps = [ ":simple_printer_dylib" ]
     # 增加外部依赖
     external_deps = [ "hilog:hilog_rust" ]
   }

   // bundle.json 里增加依赖
   "components": [
     "hilog"
   ],
   ```
2. **增加调用**
   ```
   extern crate simple_printer_dylib;

   use simple_printer_dylib::rust_log_dylib;
   use simple_printer_dylib::RustLogMessage;
   //! 增加引用
   use std::ffi::{ c_char, CString };
   use hilog_rust::{hilog, info, HiLogLabel, LogType};

   const LOG_LABEL: HiLogLabel = HiLogLabel {
       log_type: LogType:ogCore,
       domain: 0xD002220,
       tag: "TEST_RUST",
   };

   fn main() {
       let msg: RustLogMessage = RustLogMessage {
           id: 0,
           msg: "string in rlib crate".to_string(),
       };
       rust_log_dylib(msg);
       //! 增加调用
       info!(LOG_LABEL, "Fnished enable all keys.");
   }
   ```
3. **运行测试**
   ```
   // 运行
   # ./test_dylib_crate
   id:0 message:"string in rlib crate"

   // 查看hilog
   # hilog | grep Fnished
   08-17 05:14:18.121 29293 29293 I C02220/TEST_RUST: Fnished enable all keys.
   ```

---

**注意:rust和openharmony其他开源代码可以混合使用,如rust可以生成C/C++库,给其他C/C++应用使用,反之C/C++库也可以给rust应用调用**

### 总结

* **OpenHarmony已经全面支持的rust开发,一些工具部件如hilog也有对应的rust版本;**
*
* **社区文档:**[https://gitee.com/openharmony/do ... rust-compilation.md](https://gitee.com/openharmony/do ... native-api-intro.md)。
* **社区样例:**[https://gitee.com/openharmony/build](https://gitee.com/openharmony/build) rust目录下有各种样例
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5