У меня есть проект 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()); } }
Тем не менее, при обращении в Котлин
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
т.е. он не может получить доступ к тем протобуф-кодом (хотя в Android Studio он все равно может получить доступ к коду, например, автозаполнение кода может найти функции).
Похоже, что поддержка Protobuf Gradle и Kotlin не работают. Или я что-то пропустил?
Чтобы проверить это, вы можете получить доступ к коду в https://github.com/elye/issue_android_protobuf_light_java с помощью MainPresentation на Java, который компилируется отлично. Но если конвертирует в Котлин, это приведет к ошибке, как указано выше.
Существует решение об использовании Kotlin, то есть использовать модуль Kotlin для генерации файла protobuf. Затем в качестве отдельного модуля он может быть использован. Подробнее см. https://medium.com/@elye.project/android-protobuf-in-kotlin-a1c33014a4e2 .