Protobuf-Module

Das Build-System unterstützt die Generierung von Protobuf-Schnittstellen über den Modultyp rust_protobuf.

Die grundlegende Protobuf-Codegenerierung erfolgt mit dem rust-protobuf-Crate. Die Dokumentation zu dieser Verwendung finden Sie auf der GitHub-Projektseite mit den entsprechenden Protobuf-Beispielen.

gRPC-Protobufs werden ebenfalls unterstützt. Die Generierung erfolgt über das grpc-rs-Crate. Die Dokumentation zu dieser Verwendung finden Sie auf der entsprechenden GitHub-Projektseite für gRPC.

Grundlegende Verwendung von rust_protobuf-Builds

Im Folgenden finden Sie ein Beispiel für die Definition eines Protobuf-Moduls und die Verwendung dieses Moduls als Crate. Weitere Informationen zu wichtigen Attributen und deren Verwendung finden Sie im Abschnitt rust_protobuf definieren.

Wenn Sie über ein include!()-Makro generierten Protobuf-Code verwenden müssen, z. B. für Drittanbietercode, finden Sie ein Beispiel auf der Seite Source Generators. Im Beispiel wird ein rust_bindgen-Modul verwendet, aber die Art der Quellcodeeinbindung ist für alle Quellcodegeneratoren dieselbe.

rust_protobuf-Modul in Android.bp definieren

Angenommen, es gibt ein Proto unter src/protos/my.proto relativ zu Ihrem Android.bp. Das Modul wird dann so definiert:

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

Eine Bibliothek, die dieses Crate verwendet, wird definiert, indem darauf verwiesen wird, als wäre es eine andere Bibliotheksabhängigkeit:

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

Crate-Struktur von rust_protobuf-Modulen

Jede Protobuf-Datei ist als eigenes Modul innerhalb des Crate organisiert und trägt den Namen der Protobuf-Datei. Das bedeutet, dass alle Proto-Basisdateinamen eindeutig sein müssen. Nehmen Sie beispielsweise eine rust_protobuf, die so definiert ist:

rust_protobuf {
    name: "libfoo",
    crate_name: "foo",
    protos: ["a.proto", "b.proto"],
    grpc_protos: ["c.proto"],
    source_stem: "my_proto_source",
}

Auf die verschiedenen Protos in diesem Crate wird so zugegriffen:

// 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

Wichtige rust_protobuf-Attribute

Die unten definierten Properties gelten zusätzlich zu den wichtigen gemeinsamen Properties, die für alle Module gelten. Diese sind entweder besonders wichtig für Rust-Protobuf-Module oder weisen ein einzigartiges Verhalten auf, das spezifisch für den Modultyp rust_protobuf ist.

stem, name, crate_name

rust_protobuf generiert Bibliotheksvarianten. Daher gelten für diese drei Attribute dieselben Anforderungen wie für die rust_library-Module. Weitere Informationen finden Sie in den Attributen rust_library.

Protos

Dies ist eine Liste mit relativen Pfaden zu den Protobuf-Dateien, aus denen die Protobuf-Schnittstelle generiert werden soll. Die Basisdateinamen müssen für protos und grpc_protos eindeutig sein.

grpc_protos

grpc_protos besteht aus einer Liste relativer Pfade zu den Protobuf-Dateien, die grpcs definieren, um die Protobuf-Schnittstelle zu generieren. Die Basisdateinamen müssen für protos und grpc_protos eindeutig sein.

source_stem

source_stem ist der Dateiname für die generierte Quelldatei, die eingefügt werden kann. Dies ist eine erforderliche Felddefinition, auch wenn Sie die Bindungen als Crate verwenden, da die stem-Property nur den Ausgabedateinamen für die generierten Bibliotheksvarianten steuert. Im Gegensatz zu anderen Quellgeneratoren wird dem Dateinamen das Präfix „mod_“ vorangestellt, sodass der endgültige Dateiname mod_<stem> lautet. Dadurch werden Namenskollisionen mit generierten Quellen aus den einzelnen Protos verhindert.

Wie beim Bindgen-Bindungsmodul ist auch der vollständige Satz von Bibliothekseigenschaften verfügbar, um die Bibliothekskompilierung zu steuern. Diese müssen jedoch selten definiert oder geändert werden.