协议缓冲gradle支持Kotlin Android不工作?

我在Kotlin有一个Android项目,在那里安装正确并且可以正常工作

在root build.gradle中

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 

在应用程序build.gradle

 apply plugin: 'kotlin-android' // ... implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 

一切运作良好。

它也具有Protobuf支持按照https://github.com/google/protobuf-gradle-plugin

在应用程序build.gradle它有

 apply plugin: 'com.google.protobuf' // ... protobuf { protoc { // Download from repositories artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { // The codegen for lite comes as a separate artifact artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.plugins { javalite { } } } } } sourceSets { main { java { srcDirs += file("${protobuf.generatedFilesBaseDir}/debug/javalite") } } } // ... api 'com.google.protobuf:protobuf-lite:3.0.0' 

唯一的一点是,当访问Protobuf生成的代码(即com.elyeproj.proto.*代码)的代码是Java代码时,

 package com.elyeproj.myapplication; import com.elyeproj.proto.Card; import com.elyeproj.proto.Heart; import com.elyeproj.proto.Result; import com.elyeproj.proto.Spade; public class MainPresenter { private MainView mainView; public MainPresenter(MainView mainView) { this.mainView = mainView; } public void fetchData() { Card card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build(); Card card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build(); Result result = Result.newBuilder().addCards(card1).addCards(card2).build(); mainView.showResult(result.toString()); } } 

但是,当转换到Kotlin

 package com.elyeproj.myapplication import com.elyeproj.proto.Card import com.elyeproj.proto.Heart import com.elyeproj.proto.Result import com.elyeproj.proto.Spade class MainPresenter(private val mainView: MainView) { fun fetchData() { val card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build() val card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build() val result = Result.newBuilder().addCards(card1).addCards(card2).build() mainView.showResult(result.toString()) } } 

它会在编译时显示错误消息:

 Error:(6, 21) Unresolved reference: proto Error:(11, 21) Unresolved reference: Card Error:(11, 48) Unresolved reference: Heart Error:(12, 48) Unresolved reference: Spade Error:(13, 22) Unresolved reference: Result 

即它不能访问那些Protobuf生成的代码(尽管在Android Studio中,它仍然可以访问代码,例如代码自动完成可以找到函数)。

它看起来像Protobuf Gradle支持和Kotlin不工作。 还是我错过了什么?

为了测试它,你可以通过https://github.com/elye/issue_android_protobuf_light_java用Java中的MainPresentation访问代码,这个代码编译得很好。 但是如果转换成Kotlin的话,会出现上面的错误。

有一个获得Kotlin支持的解决方法,就是使用Kotlin模块来生成protobuf文件。 然后作为一个单独的模块,然后可以使用它。 查看https://medium.com/@elye.project/android-protobuf-in-kotlin-a1c33014a4e2了解更多详情。