Protobuf モジュール

ビルドシステムは、rust_protobuf モジュール タイプによる protobuf インターフェースの生成をサポートしています。

基本的な protobuf コード生成は rust-protobuf のクレートを使用して行われます。 この使用法についてのドキュメントは、GitHub プロジェクト ページで、対応する protobuf のをご覧ください。

gRPC protobuf もサポートされており、生成は grpc-rs のクレートによって行われます。この使用法についてのドキュメントは、対応する gRPC の GitHub プロジェクト ページをご覧ください。

rust_protobuf ビルドの基本的な使用方法

以下に、protobuf モジュールを定義し、そのモジュールをクレートとして使用する例を示します。重要なプロパティと使用方法の詳細については、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",
}

このクレートを使用するライブラリは、他のライブラリ依存関係と同じように参照することで定義されます。

rust_binary {
    name: "hello_rust_proto",
    srcs: ["src/main.rs"],
    rustlibs: ["libmy_proto"],
}

rust_protobuf モジュールのクレート構造

各 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",
}

このクレート内の異なる protos には、次のようにアクセスします。

// 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 はライブラリ バリアントを生成するため、この 3 つのプロパティには rust_library モジュールと同じ要件があります。詳細については、rust_library プロパティをご覧ください。

protos

これは、protobuf インターフェースを生成する protobuf ファイルへの相対パスのリストです。ベースファイル名は protosgrpc_protos の間で一意にする必要があります。

grpc_protos

grpc_protos は、protobuf インターフェースを生成する grpcs を定義する protobuf ファイルへの相対パスのリストで構成されています。ベースファイル名は protosgrpc_protos の間で一意にする必要があります。

source_stem

source_stem は、インクルード可能な生成されるソースファイルのファイル名です。バインディングをクレートとして使用する場合でも、stem プロパティは生成されるライブラリ バリアントの出力ファイル名のみを制御するため、これは必須のフィールド定義です。他のソース生成ツールとは異なり、ファイル名の先頭には mod_ が付加され、最終的なファイル名は mod_<stem> になります。これにより、各 proto から生成されたソースと名前の競合を防ぎます。

さらに、bindgen バインディング モジュールと同様に、ライブラリ プロパティのフルセットを使用してライブラリのコンパイルを制御することもできますが、定義や変更が必要になることはほとんどありません。