最近給項目接入protobuf庫雕擂,做了一番調(diào)研。Android和protobuf不愧都是谷歌的親兒子,protobuf提供了nano、lite辑鲤、java三個版本供Android選用,真是挑花了眼杠茬。
其實三者是按照庫大小依次增大的月褥,理所當(dāng)然他們支持的protobuf特性也是依次增加的。
其實官方推薦Android使用的是lite庫瓢喉,因為其支持大部分特性宁赤,包體積又比較小,而且因為沒有用到反射栓票,所以不需要處理混淆問題决左。
而我這次需要用到Any的類型,這可以看成是protobuf中的泛型走贪,可以方便的進(jìn)行動態(tài)解析佛猛,可是nano庫和lite庫都不支持,所以只好接入protobuf-java庫坠狡。
lite庫的接入方法網(wǎng)上有很多继找,比如這篇:ProtoBuf在Android中的簡單使用逃沿,或者直接閱讀官方的文檔都可以很快接入:
Github-progobuf
Github-protobuf-gradle-plugin
但是protobuf-java的接入方法有點不一樣,我摸索了很久才終于成功了边臼,這里記錄一下硼瓣,供有需要的人使用置谦。
0.我這里使用的是最新版:protobuf-java:3.6.1,protoc:3.1.0,protobuf-gradle-plugin:0.8.6堂鲤,讀者如果需要更新版本,參照github更新到最新應(yīng)該就可以了媒峡。
1.在項目根目錄的build.gradle中添加依賴:
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
2.在用到protobuf的module的build.gradle中添加protobuf的plugin:
apply plugin: 'com.google.protobuf'
3.添加protobuf的配置
protobuf {
protoc {
// You still need protoc like in the non-Android case
artifact = 'com.google.protobuf:protoc:3.6.1'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {}
}
}
}
}
4.添加proto文件的路徑
android {
sourceSets {
main {
proto {
srcDir 'src/main/proto' //proto文件所在路徑
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
}
5.添加protobuf-java和protoc的依賴谅阿,其中protoc的依賴很重要,lite版使用方法中不需要添加寓涨,所以很容易漏掉
dependencies {
compile 'com.google.protobuf:protobuf-java:3.6.1'
compile 'com.google.protobuf:protoc:3.1.0'
}
其中第3盯串,4,5步跟lite版的配置不太一樣戒良,要注意哦体捏。
最終的build.gradle文件如下:
apply plugin: 'com.android.library'
apply plugin: 'com.google.protobuf'
protobuf {
protoc {
// You still need protoc like in the non-Android case
artifact = 'com.google.protobuf:protoc:3.6.1'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {}
}
}
}
}
android {
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
}
sourceSets {
main {
proto {
srcDir 'src/main/proto' //proto文件所在路徑
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.google.protobuf:protobuf-java:3.6.1'
compile 'com.google.protobuf:protoc:3.1.0'
}
最后是混淆規(guī)則:
-keep class com.pl.longlink.** {*;} //protobuf生成類的路徑
-keep class com.google.protobuf.Any {*;} //如果要用到Any,需要keep