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