最近的一个项目使用到了grpc实现跨平台的远程调用,在安卓端使用的时候遇到了一些坑,这里记录一下。
首先根据grpc android的官方演示配置grpc依赖,测试它的hello world工程。
<强>添加rotobuf-gradle-plugin插件强>
首先添加rotobuf-gradle-plugin插件,他是用来从原型文件自动生成java代码的:
//项目的build.gradle中添加rotobuf-gradle-plugin插件 buildscript { … 依赖关系{ … 类路径“com.google.protobuf: protobuf-gradle-plugin: 0.8.0” … } … }
//应用程序的build.gradle中添加下面配置 应用插件:“com.google.protobuf” protobuf { protoc { 工件=' com.google.protobuf: protoc: 3.0.0 ' } 插件{ javalite { 工件=" com.google.protobuf: protoc-gen-javalite: 3.0.0 " } grpc { 工件=' io.grpc: protoc-gen-grpc-java: 1.0.0 '//CURRENT_GRPC_VERSION } } generateProtoTasks { 所有()。每个{任务→ 的任务。插件{ javalite {} grpc {//选项添加到——grpc_out 选择“lite” } } } } }
添加原型文件并自动生成java代码
在src/main/目录下创建一个原型目录,并将官方的helloworld.proto放到原型目录下
之后只需要重建一下就能看到生成构建//源/原型/目录下根据<代码> helloworld.proto 代码>生成了几个Java类
//应用程序的build.gradle中添加下面配置 依赖关系{ … 编译“io.grpc: grpc-okhttp: 1.1.2” 编译“io.grpc: grpc-protobuf-lite: 1.1.2” 编译“io.grpc: grpc-stub: 1.1.2” 编译“javax.annotation: javax.annotation-api: 1.2” … }
配置。所有{ resolutionStrategy。力“com.google.code.findbugs: jsr305:3.0.1” }
我这个时候报了这个错误
警告:与依赖“com.google.code.findbugs: jsr305”冲突。解决版本应用程序(3.0.0)和测试应用程序(2.0.1)是不同的。见http://g。有限公司/androidstudio/app-test-app-conflict细节。
这是因为<代码> com.google.code.findbugs: jsr305> 代码的版本不一致导致的
可以在应用程序的<代码> build.gradle> 代码的android标签中配置一下解决
android { … 配置。所有{ resolutionStrategy。力“com.google.code.findbugs: jsr305:3.0.1” } … }
编写演示代码
公开课MainActivity延伸AppCompatActivity { 私有静态最终字符串标签=癎rpcDemo”; 私有静态最终int PROT=55055; 私有静态最终字符串名称=" linjw”; 私有静态最终字符串主机=發ocalhost”; @Override 保护空白> 引起的:io.grpc。ManagedChannelProvider ProviderNotFoundException美元:没有发现功能服务器。尝试添加一个依赖项> 依赖关系{ … 编译“io.grpc: grpc-netty: 1.1.2” 编译“io.grpc: grpc-protobuf-lite: 1.1.2” 编译“io.grpc: grpc-stub: 1.1.2” 编译“javax.annotation: javax.annotation-api: 1.2” … }
这么编译会报错
com.android.build.api.transform。TransformException: com.android.builder.packaging。DuplicateFileException:复制文件复制的APK meta - inf/INDEX.LIST
需要加上下面的配置解决
android { … packagingOptions { pickFirst“meta - inf/INDEX.LIST” pickFirst“meta - inf/许可证” pickFirst“meta - inf/io.netty.versions.properties” } … }
当然,还需要加上互联网权限,要不然运行的时候还是会崩溃。
最终就能看的下面的打印,这样安卓grpc的helloworld就成功了。
03-03 00:04:20.000 6137 - 6137/linjw.com.grpcdemo D/GrpcDemo:你好linjw
任何可以携带任意类型的数据,用法相当于c语言的空指针。在项目中是很常用的,但是谷歌在javalite的版本不支持。