是時候該瞭解一波Protocol Buffers了[Android]

chengzichen發表於2018-06-20

前言

Protocol Buffers,是Google公司開發的一種資料描述語言,類似於XML能夠將結構化資料序列化,可用於資料儲存、通訊協議等方面。

它不依賴於語言和平臺並且可擴充套件性極強。現階段官方支援C++JAVAPython三種程式語言,但可以找到大量的幾乎涵蓋所有語言的第三方擴充包。

google在2008年7月7號將其作為開源專案對外公佈

雖然Protocol Buffers很早就被開源出來,被使用的頻率並沒有JsonXML多,大多數被用於遊戲開發協議,RPC和即時通訊.然而這樣的資料交換利器比JsonXML的利處多太多了,但更小更快更簡單

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…

(三)Android專案中Retrofit 配合 Protobuf 使用

  • setup 1

    新增retrofit2 格式轉化器依賴,protobuf2protobuf3兩個版本的

    • 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) {
                 .......
             }
         });
    複製程式碼

注意:

結束

相關工具

由於protobuf除錯比較頭痛的問題,我在網上找到了一些除錯工具(歡迎補充):

相關文章

第一篇-網路篇:

第二篇-Retrofit原始碼解析

第三篇-Android元件化和快速實現MVP

第三篇-是時候該瞭解一波Protocol Buffers了[Android]

第四篇-是時候該瞭解一波Protocol Buffers了[Java]

更新中....

關於個人

Github:github.com/chengzichen

CSDN : blog.csdn.net/chengzichen…

個人部落格 : chengzichen.github.io/

本人一直都致力於元件化和外掛化的研究如果大家有更好的想法可以聯絡我一起成長
圖片名稱

相關文章