proto3和proto2有很大差別,網上大多是proto2的介紹,因為有使用最新庫的習慣,是以堅持內建proto3
一、Project目錄下build.gradle配置
buildscript {
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
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
}
}
二、Module下build.gradle配置
在
apply plugin: 'com.android.application'
或者
apply plugin: 'com.android.library'
下增加
apply plugin: 'com.google.protobuf'
同時,在android同級增加
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.8.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
//生成目錄
generatedFilesBaseDir = "$projectDir/src/generated"
}
在android裡增加
sourceSets {
main {
java {
srcDir 'src/main/java'
}
proto {
srcDir 'src/main/proto' //指定.proto檔案路徑
}
}
}
最後在depends裡增加
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.protobuf:protobuf-java:3.8.0'
implementation 'com.google.protobuf:protoc:3.8.0'
}
完整的module下build.gradle檔案如下:
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.8.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
//生成目錄
generatedFilesBaseDir = "$projectDir/src/generated"
}
android {
compileSdkVersion 28
defaultConfig {
applicationId "cn.starcart.testjni"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
proto {
srcDir 'src/main/proto' //指定.proto檔案路徑
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
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'
implementation 'com.google.protobuf:protobuf-java:3.8.0'
}
三、module下增加與java同級目錄proto目錄,用于定義proto消息資料體
如上圖中user定義如下:
syntax = "proto3";
package cn.proto.java.bean; //輸出的包名
option java_outer_classname = "UserBean"; //輸出的類名
message User{
int64 id = 1 ;
string name = 2 ;
}
build project即可生成與main同級目錄generated目錄,該目錄下生成proto目錄下的java類,可直接使用了
proto使用上也比較簡單,參考官方文檔即可
四、其他介紹
proto3文法定義:
https://developers.google.com/protocol-buffers/docs/proto3proto3和proto2的差別參考:
http://www.cppblog.com/sunicdavy/archive/2016/01/25/212739.html