Módulos Protobuf

El sistema de compilación admite la generación de interfaces protobuf a través del tipo de módulo rust_protobuf .

La generación de código protobuf básico se realiza con la caja rust-protobuf . Para ver la documentación sobre este uso, consulte la página del proyecto de GitHub con los ejemplos de protobuf correspondientes.

Los protobufs gRPC también son compatibles, con generación proporcionada por la caja grpc-rs . Para ver la documentación sobre este uso, consulte la documentación en la página del proyecto gRPC GitHub correspondiente.

Uso básico de compilación de rust_protobuf

Lo siguiente proporciona un ejemplo de cómo definir un módulo protobuf y usar ese módulo como caja. Más detalles sobre propiedades importantes y cómo se usan están en la sección Definición de un rust_protobuf .

Si necesita usar código generado por protobuf a través de una macro include!() , como para código de terceros, consulte la página Generadores de código fuente para ver un ejemplo. (El ejemplo usa un módulo rust_bindgen , pero el medio de inclusión de fuentes es el mismo para todos los generadores de fuentes).

Definición de un módulo rust_protobuf Android.bp

Asuma algún prototipo en src/protos/my.proto relativo a su Android.bp; el módulo se define entonces como sigue:

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 biblioteca que usa esta caja se define haciendo referencia a ella como si fuera cualquier otra dependencia de la biblioteca:

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

Estructura de cajas de módulos rust_protobuf

Cada archivo protobuf está organizado como su propio módulo dentro de la caja, tomando el nombre del archivo protobuf. Esto significa que todos los nombres de archivo base de prototipos deben ser únicos. Por ejemplo, tome un rust_protobuf definido de la siguiente manera:

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

Se accedería a los diferentes prototipos dentro de esta caja de la siguiente manera:

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

Propiedades notables de rust_protobuf

Las propiedades definidas a continuación se suman a las propiedades comunes importantes que se aplican a todos los módulos. Estos son particularmente importantes para los módulos Rust protobuf o exhiben un comportamiento único específico para el tipo de módulo rust_protobuf .

vástago, nombre, crate_name

rust_protobuf produce variantes de biblioteca, por lo que existen los mismos requisitos para estas tres propiedades que para los módulos rust_library . Vea las propiedades de rust_library para más detalles.

prototipos

Esta es una lista de rutas relativas a los archivos protobuf para generar la interfaz protobuf. Los nombres de archivo base deben ser únicos entre protos y grpc_protos .

grpc_protos

grpc_protos consta de una lista de rutas relativas a los archivos protobuf que definen grpcs para generar la interfaz protobuf. Los nombres de archivo base deben ser únicos entre protos y grpc_protos .

source_stem

source_stem es el nombre de archivo del archivo fuente generado que se puede incluir. Esta es una definición de campo obligatoria, incluso si está utilizando los enlaces como una caja, ya que la propiedad stem solo controla el nombre del archivo de salida para las variantes de biblioteca generadas. A diferencia de otros generadores de código fuente, el nombre de archivo tiene el prefijo mod_ , lo que hace que el nombre de archivo final sea mod_<stem> . Esto evita colisiones de nombres con las fuentes generadas de cada prototipo.

Además, al igual que el módulo de enlaces bindgen, el conjunto completo de propiedades de la biblioteca también está disponible para controlar la compilación de la biblioteca, aunque rara vez es necesario definirlas o cambiarlas.