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 綁定模塊一樣,全套庫屬性也可用於控制庫編譯,儘管很少需要定義或更改這些屬性。