Android14之Android Rust模块编译语法(一百八十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中...... 】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中......】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
更多原创,欢迎关注:Android系统攻城狮

1.前言

本篇目的:Android14之Android Rust模块编译语法

2.Android Rust介绍

  • Android Rust是一个开源项目,旨在将Rust编程语言集成到Android应用开发中。Rust是一种系统编程语言,注重安全、性能和并发性,而Android是一个广泛使用的移动操作系统,主要由Java和Kotlin编程语言支持。Android Rust项目的目标是为Android开发者提供一种新的编程选择,以提高应用的安全性和性能。
  • Rust编程语言具有许多优点,例如零成本抽象、内存安全、所有权模型和异步编程。这些特性使得Rust成为Android应用开发的理想选择,因为它们可以帮助开发者编写更安全、更高效的代码。零成本抽象意味着Rust提供了高级抽象,而不需要牺牲性能。内存安全是指Rust编译器会检查内存使用,以防止内存泄漏和越界访问等问题。所有权模型可以帮助开发者更好地管理内存和资源,而异步编程可以提高应用的响应性和性能。
  • Android Rust项目提供了一套工具和库,以支持在Android平台上使用Rust编程语言。这些工具和库包括Rust编译器、Android NDK(Native Development Kit)集成、CMake构建系统和Rust交叉编译工具链。这些工具和库可以帮助开发者轻松地将Rust代码集成到Android应用中。
  • 为了使用Android Rust进行开发,首先需要安装Rust和Android SDK。然后,可以使用Rust编译器交叉编译Android平台上的Rust代码。接下来,可以使用Android NDK将Rust代码与C/C++代码集成,以便在Android应用中使用原生代码。最后,可以使用CMake构建系统来配置和构建Android应用。
  • Android Rust项目还提供了一些示例和教程,以帮助开发者开始使用Rust进行Android应用开发。这些示例涵盖了各种不同的场景,例如渲染图像、处理音频和网络通信等。通过这些示例和教程,开发者可以更好地了解如何使用Rust编程语言在Android平台上实现不同的功能。
  • 总之,Android Rust是一个令人兴奋的新项目,它将Rust编程语言引入Android应用开发领域。通过使用Rust,Android开发者可以编写更安全、更高效的代码,并充分利用Rust的各种特性。随着Android Rust项目的不断发展,我们期待看到更多使用Rust编写的Android应用出现。

Android Rust模块编译语法实例

3.Rust 二进制文件的模块定义示例

复制代码
rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

4.基本模块类型

5.重要的通用属性

name

复制代码
name 是模块的名称。与其他 Soong 模块一样,此名称必须在大多数 Android.bp 模块类型中具有唯一性。
默认情况下,name 被用作输出文件名。如果输出文件名必须与模块名称不同,使用 stem 属性定义输出文件名。

stem

复制代码
stem(可选)直接控制输出文件名(不包括文件扩展名和其他后缀)。
例如,stem 值为 libfoo 的 rust_library_rlib 库会生成一个 libfoo.rlib 文件。如果没有为 stem 属性提供值,输出文件名将默认采用模块名称。

无法将模块名称设置为所需的输出文件名时,请使用 stem 函数。
举例而言,假设因为已经存在一个 liblog cc_library,log crate 的 rust_library 被命名为 liblog_rust。
在这种情况下,使用 stem 属性可以确保输出文件被命名为 liblog.* 而不是 liblog_rust.*。

srcs

复制代码
srcs 包含代表模块入口点的单个源代码文件(通常是 main.rs 或 lib.rs)。
rustc 负责解析和发现编译所需的所有其他源代码文件,生成的 deps 文件中将列举这些文件。

crate_name

复制代码
crate_name 通过 rustc --crate_name 标志设置 crate 名称元数据。
对于会生成库的模块,此属性必须与源代码中预期使用的 crate 名称相匹配。
例如,如果源代码中以 extern crate foo_bar 的形式引用模块 libfoo_bar,那么此属性就必须为 crate_name: "foo_bar"。

此属性对所有 rust_* 模块都是通用的,但是对于会生成 Rust 库的模块(例如 rust_library、rust_ffi、rust_bindgen、rust_protobuf 和 rust_proc_macro)是必需的。这些模块强制执行有关 rustc 与输出文件名之间关系的 crate_name 要求。

lints

复制代码
默认情况下,系统会针对除源代码生成器外的所有模块类型运行 rustc linter。目前定义了一些 lint 集,并用其验证模块源代码。此类 lint 集可能的值如下所示:

default(默认的 lint 集,具体视模块位置而定)
android(应用于所有 Android 平台代码的最严格的 lint 集)
vendor(应用于供应商代码的宽松 lint 集)
none(用于忽略所有 lint 警告和错误)

clippy_lints

复制代码
默认情况下,系统还会针对除源代码生成器外的所有模块类型运行 clippy linter。目前定义了几个 lint 集,用于验证模块源代码。下面列出了一些可能的值:

default(默认的 lint 集,具体视模块位置而定)
android(应用于所有 Android 平台代码的最严格的 lint 集)
vendor(应用于供应商代码的宽松 lint 集)
none(用于忽略所有 lint 警告和错误)

edition

复制代码
edition 定义用于编译此代码的 Rust 版本。此属性与 C 和 C++ 标准的版本类似。有效的值为 2015 和 2018(默认值)。

flags

复制代码
flags 包含一个字符串列表,列出了要在编译期间传递给 rustc 的标志。

ld_flags

复制代码
ld-flags 包含一个字符串列表,列出了要在编译源代码时传递给链接器的标志。
这些标志通过 -C linker-args rustc 标志传递。clang 用作链接器前端,为实际链接调用 lld。

features

复制代码
features 是在编译期间必须启用的功能的字符串列表。此属性通过 --cfg 'feature="foo"' 传递给 rustc。
由于大多数功能可以累加使用,因此在许多情况下,此属性包括所有相关模块所需的全套功能。
过,如果功能互斥,请在任何提供了冲突功能的构建文件中定义其他模块。

cfgs

复制代码
cfgs 包含一个字符串列表,列出了要在编译期间启用的 cfg 标志。此属性通过 --cfg foo 和 --cfg "fizz=buzz" 传递给 rustc。

构建系统会在特定情况下自动设置某些 cfg 标志,如下所列:

作为 dylib 构建的模块将设置 android_dylib cfg。
将使用 VNDK 的模块将设置 android_vndk cfg。这类似于 C++ 中的 __ANDROID_VNDK__ 定义。

strip

复制代码
strip 用于控制是否剥离以及如何剥离输出文件中的内容(如果适用)。
如果未设置此属性,设备模块将默认剥离除 mini debuginfo 外的所有内容。
默认情况下,主机模块不会剥离任何符号。有效值包括用于停用剥离的 none,以及用于剥离所有内容(包括 mini debuginfo)的 all

host_supported

复制代码
对于设备模块,host_supported 参数用于指示该模块是否也应该提供主机变体。

``

6.定义库依赖项

关联到 Rust 库时,除非有特定原因,否则最佳做法是使用 rustlibs 属性而不是使用 rlibs 或 dylibs。这样,构建系统就可以根据根模块所需选择正确的关联,而且依赖项树同时包含库的 rlib 和 dylib 版本(这种情况会导致编译失败)的可能性也会降低。

7.不支持和支持有限的构建功能

复制代码
Soong 的 Rust 对 vendor 和 vendor_ramdisk 映像与快照提供有限支持,但支持 staticlibs、cdylibs、rlibs 和 binaries。
对于供应商映像构建目标,已设置了 android_vndk cfg 属性。如果系统目标和供应商目标之间存在差异,您可以在代码中使用此属性。
rust_proc_macros 不会作为供应商快照的一部分捕获;如果依赖于这些宏,请确保对其进行适当的版本控制。

不支持产品映像、VNDK 和恢复映像。

8.增量构建

  • 开发者可以通过将 SOONG_RUSTC_INCREMENTAL 环境变量设置为 true 来启用 Rust 源代码的增量编译。
相关推荐
sayornottt3 分钟前
Rust中的动态分发
后端·rust
YiSLWLL8 小时前
使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总
python·rust·sqlite·matplotlib·visual studio code
yu4106218 小时前
Rust 语言使用场景分析
开发语言·后端·rust
朝阳58112 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
朝阳58112 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
红尘散仙16 小时前
六、WebGPU 基础入门——Vertex 缓冲区和 Index 缓冲区
前端·rust·gpu
苏近之16 小时前
深入浅出 Rust 异步运行时原理
rust·源码
红尘散仙17 小时前
四、WebGPU 基础入门——Uniform 缓冲区与内存对齐
前端·rust·gpu
大卫小东(Sheldon)20 小时前
魔方求解器桌面版(层先法,基于Tauri实现)
rust
景天科技苑1 天前
【Rust结构体】Rust结构体详解:从基础到高级应用
开发语言·后端·rust·结构体·关联函数·rust结构体·结构体方法