![](/img/trans.png)
[英]Android Studio can't build Google Protobuf generated files
[英]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。
輸出是
我搜索了幾個小時,但沒能刪除 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.