Rust开发实战:从命令行到Web应用
立即解锁
发布时间: 2025-09-04 01:52:05 阅读量: 146 订阅数: 13 AIGC 


Rust编程核心概念精讲
# Rust开发实战:从命令行到Web应用
## 1. Rust在Android开发中的应用
### 1.1 Fuzz配置与示例
Fuzz配置可用于在模糊测试基础设施上运行目标,其属性与cc_fuzz的fuzz_config相同。以下是一个简单的fuzzer示例:
```rust
fuzz_config: {
fuzz_on_haiku_device: true,
fuzz_on_haiku_host: false,
}
fuzz_target!(|data: &[u8]| {
if data.len() == 4 {
panic!("panic situation…");
}
println!("{}", data.len());
});
```
在这个示例中,当数据长度为4时,代码会触发panic。libFuzzer引擎会快速定位到这个有问题的长度,因为它发现长度为4会产生新的执行路径。
### 1.2 rust_bindgen模块
rust_bindgen模块用于生成bindgen绑定,它能为C(和部分C++)库生成Rust FFI绑定。具体步骤如下:
1. **定义C头文件**:创建`libbind.h`文件,定义结构体`st`和函数`foo`。
```c
typedef struct st {
int x;
} st;
void foo(int i, st* s);
```
2. **实现C函数**:在`libbind.c`文件中实现`foo`函数。
```c
#include <stdio.h>
#include "libbind.h"
void foo(int i, st* s) {
printf("i = %i, s.x = %i\n", i, s->x);
}
```
3. **定义rust_bindgen模块**:首先创建包装头文件`libbind_wrapper.h`,包含所有生成绑定时所需的头文件。
```c
#include "libbind.h"
```
然后定义`Android.bp`文件。
```
cc_library {
name: "libbind",
srcs: ["libbind.c"],
}
rust_bindgen {
name: "libbind_bindgen",
crate_name: "crate_bindgen",
wrapper_src: "libbind_wrapper.h",
source_stem: "bindings",
shared_libs: ["libbind"],
}
```
在上述代码中,`crate_name`指定用于生成rust_library变体的crate名称,`wrapper_src`指定包装源文件的路径,`source_stem`控制输出文件名,这里生成的是`bindings.rs`。
4. **使用绑定作为crate**:创建`Android.bp`文件。
```
rust_binary {
name: "hello_bindgen",
srcs: ["main.rs"],
rustlibs: ["libbind_bindgen"],
}
```
创建`main.rs`文件来测试bindgen绑定。
```rust
fn main() {
let mut x = crate_bindgen::st { x: 2 };
unsafe { crate_bindgen::foo(1, &mut x as *mut crate_bindgen::st) }
}
```
5. **构建二进制文件**:执行`m hello_bindgen`命令来构建二进制文件。
### 1.3 开发Hello Rust模块
构建一个依赖于Rust库的Rust二进制文件,为避免修改允许列表,使用`external/rust`目录。具体步骤如下:
1. **创建目录**:
```bash
mkdir -p external/rust/hello_rust/src/
mkdir -p external/rust/libhello_world/src/
```
2. **创建`hello_rust.rs`文件**:
```rust
use hello_world;
fn main() {
hello_world::hello_rust();
}
```
3. **创建`lib.rs`文件**:
```rust
pub fn hello_rust() {
println!("Hello Rust!");
}
```
4. **创建`Android.bp`文件**:
```
rust_binary {
name: "hello_rust",
srcs: ["src/hello_rust.rs"],
rustlibs: ["libhello_world"],
}
rust_library {
name: "libhello_world",
crate_name: "hello_world",
srcs: ["src/lib.rs"],
}
```
5. **构建模块**:
```bash
source build/envsetup.sh
lunch aosp_arm64-eng
m hello_rust
```
### 1.4 关键要点总结
| 要点 | 详情 |
| --- | --- |
| 内存安全问题 | C和C++中的内存安全漏洞是最难解决的错误来源 |
| 系统编程 | 用于开发为其他软件提供服务的软件和软件平台,通常对性能有要求 |
| Android底层 | 需要C、C++和Rust等系统编程语言 |
| AOSP | 开源项目,提供开发自定义Android OS变体的信息和源代码 |
| Rust使用限制 | 通过路径列表管理,若要在新路径使用Rust模块,需添加到允许列表 |
| 模块属性 | 名称属性唯一,srcs属性包含模块入口点的源文件 |
| 模块类型 | 包括rust_binary、rust_library、rust_ffi等 |
### 1.5 开发流程mermaid图
```mermaid
graph LR
A[定义C头文件] --> B[实现C函数]
B --> C[定义rust_bindgen模块]
C --> D[使用绑定作为crate]
D --> E[构建二进制文件]
F[创建目录] --> G[创建hello_rust.rs文件]
G --> H[创建lib.rs文件]
H --> I[创建Android.bp文件]
I --> J[构建模块]
```
## 2. 构建Rust命令行应用 - To-do列表
### 2.1 项目概述
构建一个命令行界面(CLI)应用程序——To-do列表,该应用可以保存要执行的任务列表,并可选择跟踪任务进度。每个任务有三种状态:To do、In progress和Done。应用程序通过命令行参数接收任务状态和任务名称。
### 2.2 实现步骤
#### 2.2.1 创建项目
使用以下命令创建名为`todo-list`的项目:
```bash
cargo new todo-list
```
该命令会创建一个简单的Hello World项目,包含`Cargo.toml`和`src/main.rs`文件。运行`cargo run`命令,会在控制台输出`Hello World!!`。
#### 2.2.2 捕获命令行参数
修改`main`函数以捕获命令行参数。
```rust
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 3 {
panic!("Too less arguments passed…");
}
let action = args[1].clone();
let task = args[2].clone();
}
```
在上述代码中,期望用户在运行`cargo run`时输入两个命令行参数,第一个参数表示操作(如`add`、`start`或`done`),第二个参数表示要添加到To-do列表的任务。
#### 2.2.3 定义To-do结构
定义
0
0
复制全文
相关推荐








