Protobuf 模块

构建系统支持通过rust_protobuf模块类型生成 protobuf 接口。

使用rust-protobuf crate 执行基本的 protobuf 代码生成。要查看有关此用法的文档,请参阅带有相应 protobuf示例GitHub 项目页面

还支持 gRPC protobufs,生成由grpc-rs crate 提供。要查看有关此用法的文档,请参阅相应 gRPC GitHub 项目页面上的文档。

基本的 rust_protobuf 构建使用

下面提供了一个定义 protobuf 模块并将该模块用作 crate 的示例。有关重要属性及其使用方式的更多详细信息,请参见定义rust_protobuf部分。

如果您需要通过include!()宏使用 protobuf 生成的代码,例如用于第三方代码,请参阅Source Generators页面以获取示例。 (该示例使用rust_bindgen模块,但源包含的方式对于所有源生成器都是相同的。)

定义一个 rust_protobuf Android.bp 模块

假设src/protos/my.proto中的一些 proto 相对于您的 Android.bp;然后模块定义如下:

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 模块的板条箱结构

每个 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模块类型的独特行为。

茎,名称,箱子名称

rust_protobuf生成库变体,因此这三个属性存在与rust_library模块相同的要求。有关详细信息,请参阅rust_library属性。

原型

这是用于生成 protobuf 接口的 protobuf 文件的相对路径列表。基本文件名在protosgrpc_protos中必须是唯一的。

grpc_protos

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

源干

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

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