一.什么是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中添加插件