簡體   English   中英

Protobuf Android 在生成的文件夾中包含構建類型

[英]Protobuf Android includes build type in generated folders

我正在使用以下 app.gradle 從 android 示例項目中的 proto 類生成 java 類。

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "protobuf.example.com.protobuftestapp"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.0.0"
    }
    plugins {
        lite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.plugins {
                lite {
                    outputSubDir = ''
                }
            }
        }
    }
    generatedFilesBaseDir = "$projectDir/src/main/java/"
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.protobuf:protobuf-lite:3.0.0'
    testCompile 'junit:junit:4.12'
}

.proto 文件如下所示:

syntax = "proto3";
package my_test_package;
option java_package = "protoclasses";
option java_outer_classname = "MyTestClass";
message TestClass {
    string test_string_a = 1;
    int32 test_int_b = 2;
    bool test_bool_c = 3;
}

類已生成,但文件夾結構取決於 buildType。

輸出是

  • src->main->java-> DEBUG ->protoclasses->MyTestClass.java
  • src->main->java-> RELEASE ->protoclasses->MyTestClass.java

我搜索了幾個小時,但沒能刪除 buildType 文件夾。 問題是,這些類是作為副本生成的,這會導致構建失敗。

我設法“解決”了問題,編輯了這一行

generatedFilesBaseDir = "$projectDir/src/main/proto_gen"

不在src / main / java中生成類(但向上一層)不會將兩個目錄(調試、發布)添加到構建路徑,只添加調試文件夾。

調試文件夾還有一個圖標,將其標記為生成的源根目錄。

即使仍然生成兩個文件夾,也不再有類沖突。 使用生成類的調試版本也很好,因為它與發布版本完全相同。

盡管(對我而言)生成原型定義的不同變體(對於每個 android buildType)沒有意義。 我們找到了一個解決方案。

希望有幫助!

您可以在 outputSubDir 中使用相對路徑。

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.13.0'
    }
//    generatedFilesBaseDir = "$projectDir/src/main/java/"
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {
                    option "lite"
                    outputSubDir = '../../../../../src/main/java/'
                }
            }
        }
    }
}

在我的例子中,我希望 protoc 生成 java 代碼並放入src/main/java auto。 但是,仍然存在一個問題,如果我將generatedFiledBaseDir設置為$projectDir/src/main/java/並將outputSubDir設置為'../' ,它仍然會將構建類型 dir(debug | release)保留在generatedFiledBaseDir 因此,我只使用outputSubDir ,構建類型 dir 留在構建目錄中,它更優雅:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM