[Protobuf翻译]关于Android中protobuf的javalite的说明。

1,416 阅读2分钟

本文由 简悦SimpRead 转码,原文地址 h.s64.jp

与我的工作没有直接关系,但我突然需要收集信息。

它与工作没有直接关系,而是作为一个杂项备忘录,因为我突然需要收集信息。 我没有在手上实际运行过,所以我可能做了一些不正确的描述。

在Android中使用协议缓冲区

Android使用Gradle作为标准构建工具,所以你需要安装protobuf-gradle-plugin。 这个插件的主要工作是与本地protoc二进制文件进行桥接,如果启用,放在Gradle项目sourceSet中的.proto可以被编译为一个Java类。 如果你没有本地protoc二进制文件,你可以在Maven上指定protoc为protobuf.protoc.artefact = 'com.google.protobuf:protoc:3.0.0'

Java Lite Runtime

如你所知,Android有一个不同于一般JVM的Runtime,谷歌的Protobuf团队称之为 "受限执行环境"。 有一种名为 "Lite "的模式是为这种环境设计的。

Lite不只是通过用protoc编译来吐出Java类,还包括以下功能

  • 只使用可在受限环境中使用的Java API,如Android Runtime。

  • 通过削减到外部库的普通逻辑来节省规模。

  • 通过削减到外部库的普通逻辑来节省规模。 目前,这个功能包含在protoc本身,可以通过在Gradle项目配置层中标记来启用。 然而,如上所述,共同的逻辑被切出到一个外部库中,所以需要单独编写。

// https://github.com/google/protobuf-gradle-plugin#default-outputs

def protobufVersion = '3.8.0'

dependencies {
  implementation "com.google.protobuf:protobuf-javalite:${protobufVersion}"
}

protobuf {
  protoc {
    artifact = "com.google.protobuf:protoc:${protobufVersion}"
  }
  generateProtoTasks {
    all().each { task ->
      task.builtins {
        java {
          option "lite"
        }
      }
    }
  }
}

这两点是,这个功能目前包含在protoc本身,而通用的逻辑已经被切割出来,变成了一个外部库。 由于 "protobuf-javalite "被定位为一个库,"protoc "的Lite功能的内部API被提取出来,"protoc "的功能更新等决定的版本规则在 "protobuf-javalite "中被原样设置。假设这两者是统一使用的。 假设两者是统一使用的,所以它们必须总是被设置成相同的。 如果它们是不同的版本,protoc的Lite模式输出的Java类和它所引用的protobuf-javalite的API之间可能存在差异,导致ClassNotFound这样的异常。


protobuf-javalite之前是一个名为protobuf-lite的artifact。

<artifactId>protobuf-lite</artifactId>

github.com/protocolbuf…

自2016年左右发布以来,已经很久没有更新了,但在2019年6月左右发布3.8.x时改为protobuf-javalite

<artifactId>protobuf-javalite</artifactId>

github.com/protocolbuf…

protobuf-javalite的旧版本被protobuf-lite所取代,也就是说,两者都只是升级,最好从protobuf-lite->protobuf-javalite迁移。

另外,在这个旧版本中,lite的模式没有捆绑在protoc中,所以com.google.protobuf:protoc-gen-javalite:xxx被指定为codegen。


www.deepl.com 翻译