本文由 简悦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>。
自2016年左右发布以来,已经很久没有更新了,但在2019年6月左右发布3.8.x时改为protobuf-javalite。
<artifactId>protobuf-javalite</artifactId>。
protobuf-javalite的旧版本被protobuf-lite所取代,也就是说,两者都只是升级,最好从protobuf-lite->protobuf-javalite迁移。
另外,在这个旧版本中,lite的模式没有捆绑在protoc中,所以com.google.protobuf:protoc-gen-javalite:xxx被指定为codegen。