自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
库模块
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
Rust 库模块有两种类型:一种生成 Rust 库,另一种生成 C 兼容库。此外,对于构建系统来说,可将 Rust 过程宏 (proc-macros
) 视为一种特殊类型的库。
rust_library
rust_library
模块会生成供其他 Rust 模块使用的 Rust 库。
除了 _host
变体外,Rust 库还有用于控制可用关联的模块类型。
Rust 库模块类型 |
定义 |
rust_library |
提供两种库变体:rlib 和 dylib 。AOSP 推荐使用此模块类型的 Rust 库,因为它可以让模块在列为 rustlibs 属性下的依赖项时正常工作 |
rust_library_rlib |
仅提供 Rust 库的 rlib 变体;仅提供 rlib 变体的模块不能保证可与 rustlibs 属性搭配使用。 |
rust_library_dylib |
仅提供 Rust 库的 dylib 变体;仅提供 dylib 变体的模块不能保证可与 rustlibs 属性搭配使用。 |
rust_ffi
rust_ffi
模块会生成用于与 CC 模块互操作的 C 兼容库。
除了 _host
变体外,Rust FFI 库还有用于控制可用关联的模块类型,如下表所示。
Rust FFI 库模块类型 |
定义 |
rust_ffi |
提供两种 C 库变体:静态库变体和共享库变体。 |
rust_ffi_shared |
仅提供 C 共享库变体。 |
rust_ffi_static |
仅提供 C 静态库变体。 |
如需查看使用 rust_ffi
从 C 调用 Rust 的基本示例,请参阅 Android Rust 模式页面。
如需了解更高级的用法,请访问官方 Rust 文档。
rust_proc_macro
Rust 过程宏 (proc-macros) 可用于扩展编译器,以执行源代码转换或提供新属性。如需了解详情,请参阅 Rust 官方文档的过程宏页面。
对于构建系统来说,rust_proc_macro
模块的工作方式与 rust_library
模块类似。对于依赖于 rust_proc_macros
的模块,请将模块名称添加到 proc_macros
属性中。
由于 proc_macros
是编译器插件,它们必然是以主机为目标,而且不会生成任何会在设备上运行的代码。
重要的 Rust 库属性
除了适用于所有模块的重要的通用属性之外,还有下表中定义的一些属性。这些属性要么对 Rust 库模块特别重要,要么具有特定于 rust_library
模块类型的独有行为。
Rust 库属性 |
定义 |
stem/name |
stem 属性用于控制输出库文件名,此文件名原本默认为 name 。
Rust 编译器对库文件名规定了一些要求,因此构建系统会强制执行这些要求以避免出现编译问题。输出文件名必须符合 lib<crate_name><suffix> 格式。(此处有一个对 crate_name 属性的依赖项)。 |
crate_name |
对于会生成库的模块,这是必需属性;此外,它与输出文件名也存在关系。(请参阅 stem 定义。) |
export_include_dirs |
对于 rust_ffi 模块,此属性会定义一个字符串列表,列出表示相对包含路径的字符串。相对包含路径是包含相关 cc 模块可以使用的头文件的路径。 |
rust_library 或 rust_ffi 的关联
默认情况下,以设备为目标的 Rust 库模块始终动态关联到 libstd
。但是,主机模块始终静态关联到 libstd
。
用于 rustlibs
依赖项的关联根据根模块的关联偏好设置而定。(例如,具有 prefer_rlib: true
设置的 rust_binary
所使用的 Rust 库变体将关联 rustlibs
作为 rlibs
。)
为了允许生成不依赖于任何动态 Rust 库的根依赖项模块(例如静态可执行文件),rlibs
同时提供动态和静态 libstd
关联变体。Soong 会自动关联正确的变体。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-04-04。
[null,null,["最后更新时间 (UTC):2025-04-04。"],[],[],null,["# Library modules\n\nThere are two types of Rust library modules, one that produces Rust libraries and\none that produces C-compatible libraries. Additionally, for build system\npurposes you can consider Rust procedural macros (`proc-macros`) as a special\ntype of library.\n\n### rust_library\n\nThe `rust_library` module produces Rust libraries for use by other Rust modules.\n\nIn addition to the `_host` variants, Rust libraries have module types that control\nthe available linkage.\n\n| Rust Library Module Type | Definition |\n|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **rust_library** | Provides both library variants, `rlib` and `dylib`. AOSP recommends this module type for Rust libraries, as it allows modules to work correctly when listed as a dependency under the `rustlibs` property |\n| **rust_library_rlib** | Provides only the `rlib` variant of a Rust library; modules providing only `rlib` variants can't be guaranteed to work with the `rustlibs` property. |\n| **rust_library_dylib** | Provides only the `dylib` variant of a Rust library; modules providing only `dylib` variants can't be guaranteed to work with the `rustlibs` property. |\n\n### rust_ffi\n\nThe `rust_ffi` module produces C-compatible libraries to interop with CC modules.\n\nIn addition to the `_host` variants, Rust FFI libraries have module types that\ncontrol the available linkage, shown in the following table.\n\n| Rust FFI Library Module Type | Definition |\n|------------------------------|------------------------------------------------------|\n| **rust_ffi** | Provides both C library variants: static and shared. |\n| **rust_ffi_shared** | Provides only the C shared library variant. |\n| **rust_ffi_static** | Provides only the C static library variant. |\n\nFor a basic example of using `rust_ffi` for calling Rust from C, see the\n[Android Rust Patterns](/docs/setup/build/rust/building-rust-modules/android-rust-patterns) page.\n\nFor information on more advanced usage, visit the [official Rust documentation](https://doc.rust-lang.org/nomicon/ffi.html#calling-rust-code-from-c).\n\n### rust_proc_macro\n\nRust procedural macros (proc-macros) can be useful for extending the compiler to\nperform source code transformations or providing new attributes. More information\ncan be found on these in the [Procedural Macros](https://doc.rust-lang.org/reference/procedural-macros.html)\npage of the official Rust documentation.\n\nFor the purposes of the build system, the `rust_proc_macro` module works similarly\nto the `rust_library` modules. For modules that depend on `rust_proc_macros`,\nadd the module name to the `proc_macros` property.\n\nAs `proc_macros` are compiler plugins, they necessarily target the host and don't\nproduce any code that would run on a device.\n\nNotable Rust library properties\n-------------------------------\n\nThe properties defined in the table below are in addition to the [Important common properties](/docs/setup/build/rust/building-rust-modules/android-rust-modules#important-common-properties)\nthat apply to all modules. These are either particularly important to Rust\nlibrary modules, or exhibit unique behavior specific to the `rust_library` module type.\n\n| Rust Library Properties | Definition |\n|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **stem / name** | The `stem` property controls the output library filename, which otherwise defaults to `name`. The Rust compiler imposes certain requirements on library filenames, and as a result the build system enforces these requirements to avoid compilation issues. The output filename must conform to the format `lib\u003ccrate_name\u003e\u003csuffix\u003e`. (There's a dependency here on the [`crate_name`](/docs/setup/build/rust/building-rust-modules/android-rust-modules#crate-name) property). |\n| **crate_name** | This is a required property for library-producing modules; it additionally has a relationship to the output filename. (See the [`stem`](/docs/setup/build/rust/building-rust-modules/android-rust-modules#stem) definition.) |\n| **export_include_dirs** | For `rust_ffi` modules, this property defines a list of strings representing relative include paths: paths which contain headers that dependent `cc` modules can use. |\n\nLinkage of rust_library or rust_ffi\n-----------------------------------\n\nBy default, Rust library modules targeting devices are always linked dynamically\nagainst `libstd`. Host modules, however, are always linked statically\nagainst `libstd`.\n\nThe linkage used for `rustlibs` dependencies depends on the root module's\nlinkage preferences. (For example, a `rust_binary` with `prefer_rlib: true` will\nuse Rust library variants that link `rustlibs` as `rlibs`.)\n\nTo allow production of root dependency modules that don't rely on any dynamic\nrust libraries (such as static executables), `rlibs` provides both dynamic and\nstatic `libstd` linkage variants. The correct variant is automatically linked by\nSoong."]]