Documentación de protobuf nano de Android

Estoy tratando de reducir el número de métodos que se generan por Google proto-buf y una de las alternativas es usar proto-buf nano. Sin embargo, no encontré documentación sobre cómo usarlo. Excepto el enlace del paquete , no puedo encontrar nada sobre cómo generar archivos java de archivos proto utilizando nano.

Así que la pregunta es sencilla: ¿cómo usar google proto nano con el fin de generar clases de java de los archivos proto y cómo usarlos en un proyecto?

Mirando el código fuente del compilador protobuf principal:

#include <google/protobuf/compiler/javanano/javanano_generator.h> .... int main(int argc, char* argv[]) { google::protobuf::compiler::CommandLineInterface cli; cli.AllowPlugins("protoc-"); ... // Proto2 JavaNano google::protobuf::compiler::javanano::JavaNanoGenerator javanano_generator; cli.RegisterGenerator("--javanano_out", &javanano_generator, "Generate Java source file nano runtime."); return cli.Run(argc, argv); } 

Mirando el Léame de protobuf

Opciones de Nano Generator

  • java_package -> <file-name>|<package-name>
  • java_outer_classname -> <file-name>|<package-name>
  • java_multiple_files -> true or false
  • java_nano_generate_has -> true or false [DEPRECATED]
  • optional_field_style -> default or accessors
  • enum_style -> c or java

Para usar protobufs nano fuera de Android repo:

  • Enlace con el archivo jar generado <protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
  • Invoque con --javanano_out , por ejemplo:

./protoc '--javanano_out=java_package=src/proto/simple-data.proto|my_package,java_outer_classname=src/proto/simple-data.proto|OuterName:.' src/proto/simple-data.proto

Para usar protobufs nano dentro del repositorio Android:

  • Establecer ' LOCAL_PROTOC_OPTIMIZE_TYPE := nano ' en su archivo .mk local. Al crear una biblioteca Java o una aplicación (paquete), la compilación
    El sistema agregará la biblioteca Java nano runtime a la
    LOCAL_STATIC_JAVA_LIBRARIES variable, por lo que no es necesario.
  • Establecer ' LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ... ' en su archivo .mk local para las opciones de línea de comandos que necesita. Utilice comas para unirse a múltiples
    Opciones. Sólo en el sabor nano, los espacios en blanco que rodean la opción
    Nombres y valores se ignoran, por lo que puede utilizar la barra invertida-newline o
    '+ =' Para estructurar bien los archivos.
  • Las opciones se aplicarán a todos los archivos proto en LOCAL_SRC_FILES al crear una biblioteca o un paquete Java. En caso de diferentes opciones
    Son necesarios para diferentes archivos proto, construir bibliotecas separadas de Java
    Y hacer referencia a ellos en su objetivo principal. Nota: debe asegurarse
    Que, para cada objetivo distinto, todos los archivos proto importados de
    El archivo proto en LOCAL_SRC_FILES está incluido en LOCAL_SRC_FILES . Esta
    Es porque el generador tiene que asumir que los archivos importados son
    Construido usando las mismas opciones, y generará el código que la referencia
    Los campos y enums de los archivos importados usando el mismo código
    estilo.
  • Sugerencia: ' include $(CLEAR_VARS) ' restablece todas las variables LOCAL_ , incluyendo las dos anteriores.

Ejemplo nano simple de https://android.googlesource.com/platform/external/protobuf/+/master/src/google/protobuf/ .

Unittest_simple_nano.proto

 package protobuf_unittest_import; option java_package = "com.google.protobuf.nano"; // Explicit outer classname to suppress legacy info. option java_outer_classname = "UnittestSimpleNano"; message SimpleMessageNano { message NestedMessage { optional int32 bb = 1; } enum NestedEnum { FOO = 1; BAR = 2; BAZ = 3; } optional int32 d = 1 [default = 123]; optional NestedMessage nested_msg = 2; optional NestedEnum default_nested_enum = 3 [default = BAZ]; } 

Línea de comando

 ./protoc '--javanano_out=java_package=google/protobuf/unittest_simple_nano.proto|com.google.protobuf.nano,java_outer_classname=google/protobuf/unittest_simple_nano.proto|UnittestSimpleNano:target/generated-test-sources' google/protobuf/unittest_simple_nano.proto 

Prueba extraída de NanoTest.java

  public void testSimpleMessageNano() throws Exception { SimpleMessageNano msg = new SimpleMessageNano(); assertEquals(123, msg.d); assertEquals(null, msg.nestedMsg); assertEquals(SimpleMessageNano.BAZ, msg.defaultNestedEnum); msg.d = 456; assertEquals(456, msg.d); SimpleMessageNano.NestedMessage nestedMsg = new SimpleMessageNano.NestedMessage(); nestedMsg.bb = 2; assertEquals(2, nestedMsg.bb); msg.nestedMsg = nestedMsg; assertEquals(2, msg.nestedMsg.bb); msg.defaultNestedEnum = SimpleMessageNano.BAR; assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum); byte [] result = MessageNano.toByteArray(msg); int msgSerializedSize = msg.getSerializedSize(); //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length); assertTrue(msgSerializedSize == 9); assertEquals(result.length, msgSerializedSize); SimpleMessageNano newMsg = SimpleMessageNano.parseFrom(result); assertEquals(456, newMsg.d); assertEquals(2, msg.nestedMsg.bb); assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum); } 

Hay un montón de casos de prueba en la misma clase, y mirando el proyecto pom se puede encontrar una configuración maven-antrun-plugin para generar las clases de recursos de prueba

 <!-- java nano --> <exec executable="../src/protoc"> <arg value="--javanano_out=java_package=google/protobuf/unittest_import_nano.proto|com.google.protobuf.nano,java_outer_classname=google/protobuf/unittest_import_nano.proto|UnittestImportNano:target/generated-test-sources" /> <arg value="--proto_path=../src" /> <arg value="--proto_path=src/test/java" /> <arg value="../src/google/protobuf/unittest_nano.proto" /> <arg value="../src/google/protobuf/unittest_simple_nano.proto" /> <arg value="../src/google/protobuf/unittest_stringutf8_nano.proto" /> <arg value="../src/google/protobuf/unittest_recursive_nano.proto" /> <arg value="../src/google/protobuf/unittest_import_nano.proto" /> <arg value="../src/google/protobuf/unittest_enum_multiplejava_nano.proto" /> <arg value="../src/google/protobuf/unittest_multiple_nano.proto" /> </exec> 

Espero que esto ayude.

  • AES128 Descifrado: javax.crypto.badpaddingexception pad block dañado
  • Android Image Viewer de la aplicación
  • Cómo descomprimir un archivo 7zip en Android?
  • Cómo probar si un JSONObject es nulo o no existe
  • ¿Cómo obtener el último valor de BehaviorSubject?
  • Retrofit 2.0 cómo imprimir la respuesta json completa?
  • Archivos de lista de android contenidos en la subcarpeta de activos
  • Optimización del compilador de código Java en Android
  • Android cómo cambiar un intervalo TimerTask después de shcedule?
  • RoboGuice 3.0 NoClassDefFoundError: roboguice.inject.ContextScopedRoboInjector
  • Cifrado entre Android y C #
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.