Android Gradle Protobufs: как скомпилировать полную версию protobuf, а не облегченную версию?

Каждый пример настройки build.gradle для компиляции protobufs, который я могу найти, использует "облегченную" версию и выглядит примерно так:

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.6.0'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.plugins {
                javalite { }
            }
        }
    }
}

dependencies {
    implementation 'com.google.protobuf:protobuf-java:3.6.0'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Обратите внимание на «джавалит». В результате создаются файлы java, в которых используется MessageLite, но мне нужен полный класс Message.

Как мне изменить это так, чтобы не генерировалась "облегченная" версия?


person JamieB    schedule 12.02.2019    source источник
comment
Вы знаете, почему рекомендуют облегченную версию для Android? потому что нормальный protobuf использует отражение во время выполнения, а сгенерированные классы более сложны, и это неэффективно для Android! использование обычной версии влияет на производительность приложения.   -  person beigirad    schedule 14.02.2019
comment
Да, но если вы хотите упаковать сообщение в Any.proto, вам нужно, чтобы это было сообщение, а не MessageLite.   -  person JamieB    schedule 14.02.2019


Ответы (1)


Нашел решение:

1) Удалите это:

plugins {
    javalite {
        artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
    }
}

2) Удалите это:

task.plugins {
    javalite { }
}

3) Измените раздел task.builtins на это:

task.builtins {
    java { }
}

Теперь он будет генерировать полнофункциональные протобаффы.

person JamieB    schedule 14.02.2019