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/"))
    }
}