Неразрешенная ссылка Protobuf со сгенерированными классами в Android Studio с использованием Kotlin

это мой первый раз, когда я погружаюсь в хранилище данных protobuf и jetpack, но я столкнулся с проблемой, которая довольно сбивает с толку.

Я создал свой файл .proto в src/main/java/proto, это очень просто:

syntax = "proto3";

option java_package = "com.test.appname.proto";
option java_multiple_files = true;

message WalkInfo {
  float distance = 1;
  bool run = 2;
}

Затем я написал в kotlin класс сериализатора для некоторых данных в моем приложении.

object WalkInfoSerializer : Serializer<Walker.WalkInfo>{
        override val defaultValue: Walker.WalkInfo
            get() = WalkInfo.getDefaultInstance()

        override fun readFrom(input: InputStream): Walker.WalkInfo {
            try {
                return WalkInfo.parseFrom(input)
            } catch (exception: InvalidProtocolBufferException) {
                throw CorruptionException("Cannot read proto.", exception)
            }

        }

        override fun writeTo(t: Walker.WalkInfo, output: OutputStream) {
            t.writeTo(output)
        }

    }

Я также настроил свой файл build.gradle следующим образом:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id "com.google.protobuf" version "0.8.14"

}
...
dependencies {
    ...
    //DataStore
    implementation "androidx.datastore:datastore:1.0.0-alpha05"
    implementation 'com.google.protobuf:protobuf-javalite:3.14.0'
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.10.0"
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
}

Все работает нормально, классы генерируются правильно, и они даже всплывают в автозаполнении студии Android. Проблема в том, что я не могу скомпилировать проект, так как не могу найти способ разрешить неразрешенную ссылку для сгенерированных методов (например, getDefaultInstance(), parseFrom(), writeTo() Даже путем написания полного class path это не сработает.

автозаполнение студии Android

Я что-то упускаю? Я пытался поиграть с build.gradle и файлом proto с некоторыми настройками, которые я нашел в их документации, но я все еще не мог заставить его работать.

Благодарю вас!


person Bonfi    schedule 23.12.2020    source источник


Ответы (1)


Заснул, проснулся и знал ответ на свои проблемы. Тупой мозг умудрился за ночь сделать 1+1.

Я понял, что если создаются прототипы классов, я не должен сам определять их в коде kotlin.

У меня было сообщение WalkInfo, которое генерировало класс WalkInfo, но у меня также был класс WalkInfo с некоторыми методами в нем. Это то, что смутило компилятор.

После дальнейших исследований я понял, что классы, созданные proto, даже не предназначены для расширения, они должны быть просто контейнерами данных.

В итоге я переименовал свое сообщение в WalkInfoStorage, сохранив при этом класс kotlin WalkInfo, затем я буду обрабатывать создание экземпляров WalkInfo из сериализованных данных.

person Bonfi    schedule 23.12.2020