Moduli Protobuf

Il sistema di compilazione supporta la generazione di interfacce protobuf tramite il rust_protobuf tipo di modulo.

La generazione di codice protobuf di base viene eseguita con il crate rust-protobuf. Per visualizzare la documentazione su questo utilizzo, consulta la pagina del progetto GitHub con gli esempi protobuf corrispondenti.

Sono supportati anche i protobuf di gRPC, la cui generazione è fornita dal crate grpc-rs. Per visualizzare la documentazione su questo utilizzo, consulta la documentazione nella pagina del progetto GitHub gRPC corrispondente.

Utilizzo di base della compilazione di rust_protobuf

Di seguito è riportato un esempio di definizione di un modulo protobuf e dell'utilizzo di questo modulo come crate. Ulteriori dettagli sulle proprietà importanti e sul loro utilizzo sono disponibili nella sezione Definire un rust_protobuf.

Se devi utilizzare il codice generato da protobuf tramite una macro include!(), ad esempio per il codice di terze parti, consulta la pagina Generatori di codice sorgente per un esempio. L'esempio utilizza un modulo rust_bindgen, ma i mezzi di inclusione delle origini sono gli stessi per tutti i generatori di origini.

Definire un modulo Android.bp rust_protobuf

Supponiamo che esista un file proto in src/protos/my.proto rispetto al file Android.bp. Il modulo viene quindi definito come segue:

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

Una libreria che utilizza questo crate viene definita facendovi riferimento come se fosse qualsiasi altra dipendenza della libreria:

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

Struttura del crate dei moduli rust_protobuf

Ogni file protobuf è organizzato come modulo all'interno della cassetta, assumendo il nome del file protobuf. Ciò significa che tutti i nomi di file di base proto devono essere univoci. Ad esempio, prendi un rust_protobuf definito come segue:

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

I diversi proto all'interno di questa cassetta verrebbero acceduti come segue:

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

Proprietà rust_protobuf importanti

Le proprietà definite di seguito si aggiungono alle proprietà comuni importanti che si applicano a tutti i moduli. Questi sono particolarmente importanti per i moduli rust_protobuf Protobuf di Rust o presentano un comportamento unico specifico per il tipo di modulo.

stem, name, crate_name

rust_protobuf produce varianti di librerie, pertanto per queste tre proprietà esistono gli stessi requisiti previsti per i moduli rust_library. Per maggiori dettagli, consulta le proprietà rust_library.

protos

Questo è un elenco di percorsi relativi ai file protobuf per generare l'interfaccia protobuf. I nomi file di base devono essere univoci in protos e grpc_protos.

grpc_protos

grpc_protos è costituito da un elenco di percorsi relativi ai file protobuf che definiscono grpcs per generare l'interfaccia protobuf. I nomi file di base devono essere univoci in protos e grpc_protos.

source_stem

source_stem è il nome del file di origine generato che può essere incluso. Questa è una definizione di campo obbligatoria, anche se utilizzi le associazioni come crate, poiché la proprietà stem controlla solo il nome file di output per le varianti della raccolta generate. A differenza di altri generatori di codice sorgente, al nome del file viene preposto il prefisso mod_, in modo che il nome finale del file sia mod_<stem>. In questo modo si evitano collisioni di nomi con le origini generate da ogni proto.

Inoltre, come per il modulo delle associazioni bindgen, è disponibile anche l'intero insieme di proprietà della libreria per controllare la compilazione della libreria, anche se raramente è necessario definirle o modificarle.