Android Studio 2.2 的增量编译器看不到生成的 protobufs
Android Studio 2.2's incremental compiler can't see generated protobufs
我将 Android Studio 的稳定版本升级到 2.2,现在 IDE 的 "incremental compiler" 找不到生成的 protobuf 的任何符号 class es。我打开项目,它可以很好地构建应用程序并将其部署到设备。但是当我打开一个包含生成的 protobuf 引用的 Java class 文件时,Android Studio 在文件打开后很快将它们标记为错误。生成的原型 class 的每个 Java 导入都标有 "Cannot resolve symbol"。
我 first noticed 一个月前在 Canary 频道上发布了这个,但我没有多想,因为我正在为其他 protobuf 问题苦苦挣扎(升级到 3.0.0 及其 javalite 拆分)。直到今天我才忘记它。仍然可以在该项目上工作,只是 IDE 几乎没用,因为它认为存在错误(即使真正的编译没问题)。
供参考。
gradle-2.14.1
com.android.tools.build:gradle:2.2.0
com.google.protobuf:protobuf-gradle-plugin:0.8.0
com.google.protobuf:protobuf-lite:3.0.0
com.google.protobuf:protoc:3.0.0
com.google.protobuf:protoc-gen-javalite:3.0.0
并且在包含 .proto 文件的模块中:
protobuf {
protoc {
artifact = google_protoc_artifact
}
plugins {
javalite {
artifact = google_protoc_javalite_artifact
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.plugins {
javalite { }
}
}
}
}
我们遇到了同样的问题并发现了以下内容:
1) 为了让 idea (studio) 看到您的源代码,您需要通过将 idea 插件添加到您的模块来帮助它:
apply plugin: 'idea'
idea {
module {
// Use "${protobuf.generatedFilesBaseDir}/main/javalite" for LITE_RUNTIME protos
sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java");
}
}
2) 另一个错误,Android Studio 似乎忽略了 build/ 下的任何源目录。您必须将生成的目录移到构建之外:
protobuf {
generatedFilesBaseDir = "$projectDir/src/generated"
}
这两个更改解决了 Android Studio 2.2 为我们引入的问题。
在我的例子中,我使用了 kotlin protobuf 插件来修复 IDE 无法解决的错误。我调整了上面的其他答案以指向主文件夹。
// build.gradle.kts
plugins {
idea
}
idea {
module {
// explicitly tell intellij where to resolve generated proto files
sourceDirs.plusAssign(file("build/generated/source/proto/main/"))
}
}
我将 Android Studio 的稳定版本升级到 2.2,现在 IDE 的 "incremental compiler" 找不到生成的 protobuf 的任何符号 class es。我打开项目,它可以很好地构建应用程序并将其部署到设备。但是当我打开一个包含生成的 protobuf 引用的 Java class 文件时,Android Studio 在文件打开后很快将它们标记为错误。生成的原型 class 的每个 Java 导入都标有 "Cannot resolve symbol"。
我 first noticed 一个月前在 Canary 频道上发布了这个,但我没有多想,因为我正在为其他 protobuf 问题苦苦挣扎(升级到 3.0.0 及其 javalite 拆分)。直到今天我才忘记它。仍然可以在该项目上工作,只是 IDE 几乎没用,因为它认为存在错误(即使真正的编译没问题)。
供参考。
gradle-2.14.1
com.android.tools.build:gradle:2.2.0
com.google.protobuf:protobuf-gradle-plugin:0.8.0
com.google.protobuf:protobuf-lite:3.0.0
com.google.protobuf:protoc:3.0.0
com.google.protobuf:protoc-gen-javalite:3.0.0
并且在包含 .proto 文件的模块中:
protobuf {
protoc {
artifact = google_protoc_artifact
}
plugins {
javalite {
artifact = google_protoc_javalite_artifact
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.plugins {
javalite { }
}
}
}
}
我们遇到了同样的问题并发现了以下内容:
1) 为了让 idea (studio) 看到您的源代码,您需要通过将 idea 插件添加到您的模块来帮助它:
apply plugin: 'idea'
idea {
module {
// Use "${protobuf.generatedFilesBaseDir}/main/javalite" for LITE_RUNTIME protos
sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java");
}
}
2) 另一个错误,Android Studio 似乎忽略了 build/ 下的任何源目录。您必须将生成的目录移到构建之外:
protobuf {
generatedFilesBaseDir = "$projectDir/src/generated"
}
这两个更改解决了 Android Studio 2.2 为我们引入的问题。
在我的例子中,我使用了 kotlin protobuf 插件来修复 IDE 无法解决的错误。我调整了上面的其他答案以指向主文件夹。
// build.gradle.kts
plugins {
idea
}
idea {
module {
// explicitly tell intellij where to resolve generated proto files
sourceDirs.plusAssign(file("build/generated/source/proto/main/"))
}
}