天天看點

Proto3的在Android上內建一、Project目錄下build.gradle配置二、Module下build.gradle配置三、module下增加與java同級目錄proto目錄,用于定義proto消息資料體四、其他介紹

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消息資料體

Proto3的在Android上內建一、Project目錄下build.gradle配置二、Module下build.gradle配置三、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類,可直接使用了

Proto3的在Android上內建一、Project目錄下build.gradle配置二、Module下build.gradle配置三、module下增加與java同級目錄proto目錄,用于定義proto消息資料體四、其他介紹

proto使用上也比較簡單,參考官方文檔即可

四、其他介紹

proto3文法定義:

https://developers.google.com/protocol-buffers/docs/proto3

proto3和proto2的差別參考:

http://www.cppblog.com/sunicdavy/archive/2016/01/25/212739.html