前言
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/