是时候该了解一波Protocol Buffers了[Android]

前言

Protocol Buffers,是Google公司开发的一种数据描述语言,相似于XML可以将结构化数据序列化,可用于数据存储、通讯协议等方面。java

它不依赖于语言和平台而且可扩展性极强。现阶段官方支持C++JAVAPython三种编程语言,但能够找到大量的几乎涵盖全部语言的第三方拓展包。git

google在2008年7月7号将其做为开源项目对外公布github

虽然Protocol Buffers很早就被开源出来,被使用的频率并无JsonXML多,大多数被用于游戏开发协议,RPC和即时通信.然而这样的数据交换利器比JsonXML的利处多太多了,但更小更快更简单编程

Android中快速使用Protocol Buffers

我知道光是想要使用Protocol Buffers,光是Android端是不够的,这里我写了对应SpringBoot集成Protocol Buffers是时候该了解一波Protocol Buffers了[Java]api

(一)Android 环境下Gradle配置 Protocol Buffers编译环境

Android项目不会添加默认输出,自Protobuf 3.0.0以来,protobuf-lite Android推荐的Protobuf库,您须要将其添加为代码生成插件。这样插件将代码生成到Android指定的目录下网络

  • setup 1app

    你须要添加protobuf lite到你的依赖中异步

    dependencies {
        // 你须要添加protobuf lite到你的依赖中,而再也不是protobuf-java
        compile 'com.google.protobuf:protobuf-lite:3.0.0'
      }
    复制代码
  • setup 2maven

    配置编译器,编译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/

本人一直都致力于组件化和插件化的研究若是你们有更好的想法能够联系我一块儿成长
图片名称
相关文章
相关标签/搜索