Android protobuf nano 文档

2023-11-24

我正在尝试减少 Google protobuf 生成的方法数量,替代方案之一是使用 protobuf nano。但是我没有找到有关如何使用它的文档。除了包链接,我找不到任何关于如何使用 nano 从 proto 文件生成 java 文件的信息。

所以问题很简单:如何使用 google proto nano 从 proto 文件生成 java 类以及如何在项目中使用它们?


查看主要protobuf编译器源代码:

#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);
}

看着protobuf 的自述文件

纳米发电机选项

  • 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

要在 Android 存储库之外使用 nano protobuf:

  • 链接到生成的 jar 文件<protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
  • 调用方式为--javanano_out, e.g.:

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

要在 Android 存储库中使用 nano protobuf:

  • Set 'LOCAL_PROTOC_OPTIMIZE_TYPE := nano' 在您的本地 .mk 文件中。构建 Java 库或应用程序(包)目标时,构建
    系统会将Java nano运行时库添加到
    LOCAL_STATIC_JAVA_LIBRARIES变量,所以你不需要。
  • Set 'LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...' 在本地 .mk 文件中查找您需要的任何命令行选项。使用逗号连接多个
    选项。仅在纳米风格中,选项周围有空白
    名称和值将被忽略,因此您可以使用反斜杠换行符或
    '+=' 可以很好地构建你的 make 文件。
  • 这些选项将应用于all原型文件在LOCAL_SRC_FILES当您构建 Java 库或包时。如果有不同的选择
    不同的 proto 文件需要,构建单独的 Java 库
    并在您的主要目标中引用它们。注意:您应该确保
    对于每个单独的目标,从任何导入的所有原始文件
    原始文件在LOCAL_SRC_FILES包含在LOCAL_SRC_FILES. This
    是因为生成器必须假设导入的文件是
    使用相同的选项构建,并将生成引用的代码
    使用相同代码的导入文件中的字段和枚举
    风格。
  • Hint: 'include $(CLEAR_VARS)' 重置所有LOCAL_变量,包括上面两个。

简单的纳米示例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];
}

命令行

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

测试摘自纳米测试.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);
  }

同一个类有很多测试用例,看项目pom你可以找到一个maven-antrun-plugin生成测试资源类的配置

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

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android protobuf nano 文档 的相关文章

随机推荐