Módulos Protobuf

O sistema de construção suporta a geração de interfaces protobuf por meio do tipo de módulo rust_protobuf .

A geração básica do código protobuf é realizada com a caixa rust-protobuf . Para visualizar a documentação sobre esse uso, consulte a página do projeto GitHub com exemplos de protobuf correspondentes.

protobufs gRPC também são suportados, com geração fornecida pela caixa grpc-rs . Para visualizar a documentação sobre esse uso, consulte a documentação na página do projeto gRPC GitHub correspondente.

Uso básico de build Rust_protobuf

A seguir é fornecido um exemplo de definição de um módulo protobuf e uso desse módulo como uma caixa. Mais detalhes sobre propriedades importantes e como elas são usadas estão na seção Definindo um rust_protobuf .

Se você precisar usar o código gerado pelo protobuf por meio de uma include!() , como para código de terceiros, consulte a página Geradores de código-fonte para ver um exemplo. (O exemplo usa um módulo rust_bindgen , mas o meio de inclusão de fonte é o mesmo para todos os geradores de fonte.)

Defina um módulo Rust_protobuf Android.bp

Suponha algum proto em src/protos/my.proto relativo ao seu Android.bp; o módulo é então definido como o seguinte:

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

Uma biblioteca que usa esta caixa é definida referenciando-a como se fosse qualquer outra dependência de biblioteca:

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

Estrutura da caixa dos módulos ferrugem_protobuf

Cada arquivo protobuf é organizado como seu próprio módulo dentro da caixa, levando o nome do arquivo protobuf. Isso significa que todos os nomes de arquivos proto base devem ser exclusivos. Por exemplo, pegue um rust_protobuf definido como segue:

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

Os diferentes protos dentro desta caixa seriam acessados ​​da seguinte forma:

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

Propriedades notáveis ​​de ferrugem_protobuf

As propriedades definidas abaixo são adicionais às propriedades comuns importantes que se aplicam a todos os módulos. Eles são particularmente importantes para os módulos Rust protobuf ou exibem um comportamento exclusivo específico para o tipo de módulo rust_protobuf .

caule, nome, crate_name

rust_protobuf produz variantes de biblioteca, portanto, existem os mesmos requisitos para essas três propriedades e para os módulos rust_library . Consulte as propriedades rust_library para obter detalhes.

protos

Esta é uma lista de caminhos relativos para os arquivos protobuf para gerar a interface protobuf. Os nomes de arquivos básicos devem ser exclusivos entre protos e grpc_protos .

grpc_protos

O grpc_protos consiste em uma lista de caminhos relativos para os arquivos protobuf que definem grpcs para gerar a interface protobuf. Os nomes de arquivos básicos devem ser exclusivos entre protos e grpc_protos .

origem_stem

source_stem é o nome do arquivo de origem gerado que pode ser incluído. Esta é uma definição de campo obrigatória, mesmo se você estiver usando as ligações como uma caixa, já que a propriedade stem controla apenas o nome do arquivo de saída para as variantes de biblioteca geradas. Ao contrário de outros geradores de origem, o nome do arquivo é prefixado por mod_ , tornando o nome do arquivo final mod_<stem> . Isso evita colisões de nomes com fontes geradas de cada proto.

Além disso, como o módulo de ligações bindgen, o conjunto completo de propriedades da biblioteca também está disponível para controlar a compilação da biblioteca, embora raramente precisem ser definidas ou alteradas.