Protobuf 模块

构建系统支持通过 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 文件的相对路径列表。基本文件名在 protosgrpc_protos 中必须是唯一的。

grpc_protos

grpc_protos 由定义 grpcs 以生成 protobuf 接口的 protobuf 文件的相对路径列表组成。基本文件名在 protosgrpc_protos 中必须是唯一的。

source_stem

source_stem 是可包含的生成的源文件的文件名。这是一个必填字段定义,即使您将绑定用作 crate,因为 stem 属性仅控制生成的库变体的输出文件名。与其他源生成器不同,文件名以 mod_ 为前缀,使最终文件名为 mod_<stem>。这可以防止与每个 proto 生成的源发生名称冲突。

此外,与 bindgen 绑定模块类似,整套库属性也可用于控制库编译,尽管这些属性很少需要定义或更改。