Система сборки поддерживает генерацию интерфейсов protobuf через модуль типа rust_protobuf .
Генерация базового кода protobuf осуществляется с помощью крейта rust-protobuf . Документацию по его использованию можно найти на странице проекта GitHub с соответствующими примерами использования protobuf.
Также поддерживаются протоколы gRPC protobuf, генерация которых обеспечивается библиотекой grpc-rs . Документацию по использованию можно найти на соответствующей странице проекта gRPC на GitHub .
Базовый способ сборки rust_protobuf
Ниже приведён пример определения модуля protobuf и использования этого модуля в качестве крейта. Более подробная информация о важных свойствах и способах их использования приведена в разделе «Определение rust_protobuf .
Если вам необходимо использовать сгенерированный protobuf-код через макрос include!() , например, для стороннего кода, см. пример на странице «Генераторы исходного кода» . (В примере используется модуль rust_bindgen , но способ включения исходного кода одинаков для всех генераторов исходного кода.)
Определите модуль rust_protobuf Android.bp
Предположим, что в файле src/protos/my.proto находится некоторый протокол относительно вашего файла Android.bp; в этом случае модуль определяется следующим образом:
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",
}
Библиотека, использующая этот крейт, определяется путем ссылки на него, как если бы это была любая другая библиотечная зависимость:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Структура крейтов модулей rust_protobuf
Каждый файл protobuf организован как отдельный модуль внутри крейта и принимает имя этого файла. Это означает, что все базовые имена файлов proto должны быть уникальными. Например, рассмотрим файл rust_protobuf определенный следующим образом:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
Доступ к различным прототипам внутри этого контейнера осуществляется следующим образом:
// 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
Примечательные свойства rust_protobuf
Описанные ниже свойства дополняют важные общие свойства , применимые ко всем модулям. Они либо особенно важны для модулей Rust protobuf, либо демонстрируют уникальное поведение, специфичное для типа модуля rust_protobuf .
stem, name, crat_name
rust_protobuf создает варианты библиотек, поэтому к этим трем свойствам предъявляются те же требования, что и к модулям rust_library . Подробности см. в свойствах rust_library .
протос
Это список относительных путей к файлам protobuf для генерации интерфейса protobuf. Базовые имена файлов должны быть уникальными для всех protos и grpc_protos .
grpc_protos
Параметр grpc_protos представляет собой список относительных путей к файлам protobuf, определяющим grpcs для генерации интерфейса protobuf. Базовые имена файлов должны быть уникальными как для protos , так и grpc_protos .
исходная_система
source_stem — это имя файла сгенерированного исходного кода , который может быть включен. Это обязательное поле, даже если вы используете привязки в качестве крейта, поскольку свойство stem управляет только именем выходного файла для сгенерированных вариантов библиотеки. В отличие от других генераторов исходного кода, имя файла начинается с префикса mod_ , в результате чего итоговое имя файла становится mod_<stem> . Это предотвращает конфликты имен с сгенерированными исходными файлами из каждого прототипа.
Кроме того, как и в модуле привязок bindgen, для управления компиляцией библиотеки также доступен полный набор свойств библиотеки, хотя их редко требуется определять или изменять.