Android中使用ProtoBuf进行通信

一.什么是ProtoBuf

protobuf是Google的与语言无关,与平台无关,可扩展的机制,用于对结构化数据进行序列化(例如XML),但更小,更快,更简单。您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。这是google的官方文档。protobuf支持很多语言。,这里仅以Java为例。
对于一个写移动端的我来说,初次接触protobuf我是拒绝的,我觉得JSON比XML优秀多了,直到我接触到了ProtoBuf。

二.AndroidStudio中如何集成ProtoBuf

这里重在说明protobuf的集成
还是直接上代码来得干脆

apply plugin: 'com.android.application'
//添加插件
apply plugin: 'com.google.protobuf'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.**.protobuf_test"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            //定义protobuf文件夹
            proto {
                srcDir 'src/main/proto'
            }
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'//编译器版本
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'//指定当前工程使用的protobuf版本为javalite版,以生成javalite版的java类
        }
    }
    generateProtoTasks.generatedFilesBaseDir = "$projectDir/src/main/java" //指定编译生成java类的存放位置
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                javalite {
                    outputSubDir = '' //指定存放位置的二级目录,这里未指定
                }
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    //添加的protobuf依赖
    implementation 'com.google.protobuf:protobuf-lite:3.0.1'
}

再来贴一下工程gradle

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
        //添加protobuf插件
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

然后在main文件夹下新建proto文件,用于编辑.proto类,对于编辑实体类的语法,你可以参考如下
在protobuf的Java文档中有给出示例,如下

syntax = "proto2";

package tutorial;
//proto文件输出的包名
option java_package = "com.example.tutorial";
//自动生成的proto文件的实体类类名
option java_outer_classname = "AddressBookProtos";

message Person {
  //用required 修饰的字段必须给初始化值
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}


这是目录结构。当你编辑问了.proto文件以后,build project一下就可看到自动生成的.java的实体类了。
这里是ProtoBuf的github说明然后选中Java说明指南,对于Android用户来说,他们推荐更加轻量化的lite版,Protobuf Java Lite运行时与主要Java运行时分开,因为它的设计/实现具有不同的约束。特别是,因此Java Lite运行时的代码大小要小得多,这使其更适合在Android上使用。
差点忘了,需要在AndroidStudio中添加插件

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值