Protocol Buffers 通信:
//感觉跟自定义私有协议差不多,只是proto使用起来会更方便一点,比如数据的转换和拓展...
1、引入辅助插件protobuf-gradle-plugin
// 最新版本请参考官网 https://github.com/google/protobuf-gradle-plugin
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' // (项目最外层build.gradle)
2、导入 protocol库 (考虑到文件大小,Android采用精简版 protobuf-lite)
// 具体版本请参考 https://search.maven.org/artifact/com.google.protobuf/protobuf-lite
compile "com.google.protobuf:protobuf-lite:3.0.1" //app层build.gradle
3、应用插件
apply plugin: 'com.google.protobuf' // app层build.gradle
4、其他配置
// app层build.gradle
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.plugins {
javalite { }
}
}
}
}
5、编写.proto文件
在src\main\ 目录下新建proto文件夹 ,新建 xxx.proto文件
// 版本号为3
syntax = "proto3";
//自动生成的对应的Java文件放这个目录下
option java_package = "com.myProto.pack";
// java_multiple_files 为true时,生成的Java类将是包级别的,否则会在一个包装类中。
option java_multiple_files = true;
// 该文件对应的Java类名,不用写了,因为 message Person已经写了
//option java_outer_classname = "Person";
message Person {
//proto3 已经取消了默认值的设置。
// 这里的1 2 3是字段号,不是默认值
string name =1;
bool isMan =2;
int32 age =3;
double money =4;
string phone =5 ;
}
6、编译工程,系统就会自动生成对应的Java文件。
7、Java层使用和解析数据
private void test(){
Person person = Person.newBuilder().
setName("aivin666")
.setIsMan(true)
.setAge(20)
.setMoney(1000)
.setPhone("13650909087")
.build();
byte[] dataSend = person.toByteArray();
// 对象转byte[]
WkLogTool.showLog(WkByteBitTools.byte2HexStr(dataSend));
Person result = Person.parseFrom(dataSend);
//byte[]转对象
WkLogTool.showLog( result.getName());
}
代码下载 https://gitee.com/hnyer/Proto_android_Demo/blob/master/ReadMe.md