前言
Protocol Buffers
,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++
、JAVA
、Python
三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。
google在2008年7月7号将其作为开源项目对外公布
虽然Protocol Buffers
很早就被开源出来,被使用的频率并没有Json
和XML
多,大多数被用于游戏开发协议,RPC
和即时通讯.然而这样的数据交换利器比Json
和XML
的利处多太多了,但更小,更快,更简单
Android中快速使用Protocol Buffers
我知道光是想要使用Protocol Buffers,光是Android端是不够的,这里我写了对应SpringBoot集成Protocol Buffers是时候该了解一波Protocol Buffers了[Java]
(一)Android 环境下Gradle配置 Protocol Buffers编译环境
Android
项目不会添加默认输出,自Protobuf 3.0.0以来,protobuf-lite
是Android
推荐的Protobuf
库,您需要将其添加为代码生成插件。这样插件将代码生成到Android
指定的目录下
-
setup 1
你需要添加protobuf lite到你的依赖中
dependencies { // 你需要添加protobuf lite到你的依赖中,而不再是protobuf-java compile 'com.google.protobuf:protobuf-lite:3.0.0' } 复制代码
-
setup 2
配置编译器,编译Gradle插件,文件输出环境
protobuf { protoc { // You still need protoc like in the non-Android case artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { // The codegen for lite comes as a separate artifact artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.builtins { // In most cases you don't need the full Java output // if you use the lite output. remove java } task.plugins { javalite { } } } } } 复制代码
-
setup 3
指定 proto文件所在文件夹,并不将.proto文件打入在APK中,这个步骤您也可以忽略
sourceSets {
main {
proto {
srcDir 'src/main/proto'
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
复制代码
(二)Android项目中编写.proto文件,生成java文件
-
setup 1
Android项目中编写.proto文件了.例如: 新建 Result.proto文件
package com.hk.protocolbuffer; // 关注1:包名 option java_package = "com.hk.protocolbuffer"; option java_outer_classname = "Result"; // 关注2:option选项 // 关注3:消息模型 message AppResult { optional string message = 1; required string data = 2; optional string version = 3; optional string mobile = 5; optional int32 code= 6[default = 500]; optional string email = 7; } 复制代码
-
setup 2
然后重新构建,在项目的build\generated\source\proto\debug\javalite\com\hk\protocolbuffer下能找到生成的文件,收取成果
注意:
- 如果文件无法被Andriod studio 识别,请安装
Protobuf Support
插件 com\hk\protocolbuffer
目录是option java_package
指定的包名build\generated
目录生成的java文件都是能直接使用和打入到APK中的- .proto语法参照: developers.google.com/protocol-bu…
- 如果文件无法被Andriod studio 识别,请安装
(三)Android项目中Retrofit 配合 Protobuf 使用
-
setup 1
添加retrofit2 格式转化器依赖,有
protobuf2
和protobuf3
两个版本的- protobuf2:
compile 'com.squareup.retrofit2:converter-protobuf:2.1.0'
- protobuf3:
compile 'com.squareup.retrofit2:converter-protobuf:2.2.0'
-
setup 2
Retrofit
添加Protobuf
解析工厂Retrofit.Builder builder = new Retrofit.Builder(); builder.addConverterFactory(new StringConverterFactory())//添加String格式化工厂 .addConverterFactory (ProtoConverterFactory.create())//添加Proto格式化工厂 .addConverterFactory(GsonConverterFactory.create(gson));//添加Gson格式化工厂 ........ 复制代码
-
setup 3
使用例子:
//定义接口 public interface GitHubService { @Headers({"Content-Type:application/x-protobuf;charset=UTF-8","Accept: application/x-protobuf"}) @POST() Call<Result.AppResult> psotTest(@Url String url,@Body Result.AppResult appResult); } //获取实例 Retrofit retrofit = new Retrofit.Builder() //设置OKHttpClient,如果不设置会提供一个默认的 .client(new OkHttpClient()) //设置baseUrl .baseUrl("https://api.github.com/") //添加Gson转换器 .addConverterFactory(ProtoConverterFactory.create()) .build(); GitHubService service = retrofit.create(GitHubService.class); //异步请求 service.enqueue(new Callback<Result.AppResult>() { @Override public void onResponse(Call<Result.AppResult> call, Response<Result.AppResult> response) { ....... } @Override public void onFailure(Call<Result.AppResult> call, Throwable t) { ....... } }); 复制代码
注意:
proto2
和proto3
是不一样的,converter
中用了反射的方法去获取字段的,所以需要使用相对应的版本ProtoConverterFactory
尽可能的配置在Gson解析器的前面- 如果还不清楚Retrofit的使用请参考:明白Retrofit原理,才能更好的应用和Android网络请求Retrofit+okhttp+Rxjava,你应该知道的一些细节
- 你也可以使用快速构建组件化和MVP的插件(ComponentPlugin专注于:Android组件化和快速实现MVP(干货))
结束
相关工具
由于protobuf
调试比较头痛的问题,我在网上找到了一些调试工具(欢迎补充):
相关文章
第一篇-网络篇:
第二篇-Retrofit源码解析
第三篇-Android组件化和快速实现MVP
第三篇-是时候该了解一波Protocol Buffers了[Android]
第四篇-是时候该了解一波Protocol Buffers了[Java]
更新中....
关于个人
Github:github.com/chengzichen
CSDN : blog.csdn.net/chengzichen…
个人博客 : chengzichen.github.io/