Android 接入protobuf-java庫(非nano和lite庫)
最近給專案接入protobuf庫,做了一番調研。Android和protobuf不愧都是谷歌的親兒子,protobuf提供了nano、lite、java三個版本供Android選用,真是挑花了眼。
其實三者是按照庫大小依次增大的,理所當然他們支援的protobuf特性也是依次增加的。
其實官方推薦Android使用的是lite庫,因為其支援大部分特性,包體積又比較小,而且因為沒有用到反射,所以不需要處理混淆問題。
而我這次需要用到Any的型別,這可以看成是protobuf中的泛型,可以方便的進行動態解析,可是nano庫和lite庫都不支援,所以只好接入protobuf-java庫。
lite庫的接入方法網上有很多,比如這篇:ofollow,noindex">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更新到最新應該就可以了。
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' }
最後是混淆規則:
-keep class com.pl.longlink.** {*;} //protobuf生成類的路徑 -keep class com.google.protobuf.Any {*;} //如果要用到Any,需要keep