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 di protobuf corrispondenti.

Sono supportati anche i protobuf gRPC, con la generazione fornita dalla cassa grpc-rs. Per visualizzare la documentazione su questo utilizzo, consulta la documentazione nella pagina del progetto GitHub gRPC corrispondente.

Utilizzo di base della build 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. (nell'esempio viene utilizzato un modulo rust_bindgen, ma le modalità di inclusione delle fonti sono le stesse per tutti i generatori di codice sorgente).

Definisci un modulo Android.bp rust_protobuf

Supponi di eseguire un protocollo in src/protos/my.proto rispetto ad Android.bp; il modulo è 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 della cassa 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 file di base del protocollo devono essere univoci. Ad esempio, prendi in considerazione un valore 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 Protobuf Rust o presentano un comportamento univoco specifico per il tipo di modulo rust_protobuf.

stem, name, crate_name

rust_protobuf produce varianti della libreria, pertanto per queste tre proprietà esistono gli stessi requisiti che hanno per i moduli rust_library. Per informazioni dettagliate, consulta le proprietà rust_library.

proto

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, il nome del file viene preceduto da mod_, il che rende il nome file finale mod_<stem>. In questo modo si evitano conflitti di nomi con le origini generate da ciascun protocollo.

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.