构建系统支持通过 rust_protobuf 模块类型生成 protobuf 接口。
基本 protobuf 代码的生成是通过 rust-protobuf crate 执行的。如需查看有关此用法的文档,请参阅包含相应 protobuf 示例的 GitHub 项目页面。
构建系统还支持 gRPC protobuf,其代码的生成由 grpc-rs crate 提供。如需查看有关此用法的文档,请参阅相应 gRPC 的 GitHub 项目页面上的文档。
基本 rust_protobuf build 用法
下面的示例展示了如何定义一个 protobuf 模块并将该模块用作 crate。如需详细了解重要属性及其用法,请参阅定义 rust_protobuf 部分。
如果您需要通过 include!() 宏使用 protobuf 生成的代码(例如为了包含第三方代码),请参阅源代码生成器页面的示例。(该示例使用的是 rust_bindgen 模块,但所有源代码生成器用于包含源代码的方式都是一样的。)
定义 rust_protobuf Android.bp 模块
假定某些 proto 相对于您的 Android.bp 的位置是 src/protos/my.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 结构
在 crate 中,每个 protobuf 文件都被整理为其自己的模块,并采用 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