构建系统支持通过 rust_protobuf
模块类型生成 protobuf 接口。
基本 protobuf 代码生成通过 rust-protobuf
crate 执行。要查看有关此用法的文档,请参阅 GitHub 项目页面 以及相应的 protobuf 示例。
grpc-rs
crate 也支持 gRPC protobuf 的生成。要查看有关此用法的文档,请参阅相应的 gRPC GitHub 项目页面 上的文档。
基本的 rust_protobuf 构建用法
以下示例演示了如何定义 protobuf 模块并将该模块用作 crate。有关重要属性及其使用方式的更多详细信息,请参阅定义 rust_protobuf
部分。
如果您需要通过 include!()
宏使用 protobuf 生成的代码(例如用于第三方代码),请参阅源生成器页面以获取示例。(该示例使用 rust_bindgen
模块,但源包含方式对于所有源生成器都是相同的。)
定义 rust_protobuf Android.bp 模块
假设在相对于 Android.bp 的 src/protos/my.proto
中有一些 proto;则模块定义如下
rust_protobuf {
name: "libmy_proto",
// Crate name that's used to generate the rust_library variants.
crate_name: "my_proto",
// Relative paths to the protobuf source files
protos: ["src/protos/my.proto"],
// If protobufs define gRPCs, then they should go in grpc_protos
// instead.
// grpc_protos: ["src/protos/my.proto"],
// 'source_stem' controls the output filename.
// This is the filename that's used in an include! macro.
source_stem: "my_proto_source",
}
使用此 crate 的库通过引用它来定义,就像它是任何其他库依赖项一样
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
rust_protobuf 模块的 Crate 结构
每个 protobuf 文件都组织为 crate 内的自有模块,并采用 protobuf 文件的名称。这意味着所有 proto 基本文件名都必须是唯一的。例如,采用如下定义的 rust_protobuf
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
此 crate 中的不同 proto 将按如下方式访问
// use <crate_name>::<proto_filename>
use foo::a; // protobuf interface defined in a.proto
use foo::b; // protobuf interface defined in b.proto
use foo::c; // protobuf interface defined in c.proto
use foo::c_grpc; // grpc interface defined in c.proto
值得注意的 rust_protobuf 属性
以下定义的属性是对适用于所有模块的重要的通用属性的补充。这些属性对于 Rust protobuf 模块尤其重要,或者表现出 rust_protobuf
模块类型特有的行为。
stem、name、crate_name
rust_protobuf
生成库变体,因此这三个属性的要求与 rust_library
模块的要求相同。有关详细信息,请参阅 rust_library
属性。
protos
这是要生成 protobuf 接口的 protobuf 文件的相对路径列表。基本文件名在 protos
和 grpc_protos
中必须是唯一的。
grpc_protos
grpc_protos
由定义 grpcs
以生成 protobuf 接口的 protobuf 文件的相对路径列表组成。基本文件名在 protos
和 grpc_protos
中必须是唯一的。
source_stem
source_stem
是可包含的生成的源文件的文件名。这是一个必填字段定义,即使您将绑定用作 crate,因为 stem
属性仅控制生成的库变体的输出文件名。与其他源生成器不同,文件名以 mod_ 为前缀,使最终文件名为 mod_<stem>。这可以防止与每个 proto 生成的源发生名称冲突。
此外,与 bindgen 绑定模块类似,整套库属性也可用于控制库编译,尽管这些属性很少需要定义或更改。