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?
- Cómo agregar KmlLayer a M4B Google Map para empresas?
- Android AnalogClock: configuración de programación por programación
- Comprobación de nombre de usuario y contraseña en Android
- Qt - el paquete android.support.v4.app no existe
- API de Google Fit, obteniendo calorías por actividad
- Cargar archivos y otros datos de Android a través de la solicitud HTTP POST
- ¿Cómo puedo obtener la ruta relativa de las carpetas en mi proyecto android?
- Cómo obtener el valor de los atributos 'resource id' y 'content description' del elemento android en appium java?
- Android Web-view archivo-selector después de la selección nada sucede
- Tratando de verificar si existe un archivo en el almacenamiento interno
- Mantener la clave secreta SECRET - dentro de la aplicación para Android .. cualquier idea
- Smartcast es imposible porque propery tiene getter abierto o personalizado
- Convertir doc en PDF en android, No se puede ejecutar dex
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 enLOCAL_SRC_FILES
está incluido enLOCAL_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 variablesLOCAL_
, 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.
- Guardar / recuperar el "Rich Formatted Text" en la base de datos sin perder su formato
- ¿Cómo traceroute en adb shell?