如何将protobuf添加到flutter/kotlin android项目中

Posted

技术标签:

【中文标题】如何将protobuf添加到flutter/kotlin android项目中【英文标题】:How to add protobuf into flutter/kotlin android project 【发布时间】:2021-04-07 09:47:48 【问题描述】:

我正在尝试将 protobuf 添加到我的颤振项目中。这是树ls flutter_project

android  docker  ios   protobuf      Readme.md         test
assets   docs    lib   pubspec.lock  
build    gen     oboe  pubspec.yaml  

.proto 文件位于protobuf 文件夹中

我按照https://github.com/google/protobuf-gradle-plugin 上的说明进行操作。这是我的 build.gradle 文件:

flutter_project/android/build.gradle

buildscript 
    ext.kotlin_version = '1.3.50'
    repositories 
        google()
        jcenter()
        mavenCentral()
    

    dependencies 
        classpath 'com.android.tools.build:gradle:4.1.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.14'
    


//...

flutter_project/android/app/build.gradle

//...

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
apply plugin: 'kotlin-android'

apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android 
    compileSdkVersion 29

    sourceSets 
        main.java.srcDirs += 'src/main/kotlin'
        main 
            proto 
                srcDir '../../protobuf/proto_java/'
            
        
    

//..

项目同步正常,但我无法在MainActivity.kt 中导入任何原始文件。比如protobuf文件:

syntax = "proto3";
package proto_pack
enum MessageResponseCode 


我不能在MainActivity.kt 上做import proto_pack,也不能输入MessageResponseCode 来暗示任何事情。

【问题讨论】:

【参考方案1】:

首先我看不到您对 protobuf 编译器的配置,如果未设置,它将在系统路径中搜索它(它可用吗?)。通常为了避免出现问题,我通过在 app gradle 构建文件中配置 protobuf 配置来使用编译器的分布式版本。我也使用 lite 运行时,因为它是 Android 的推荐方式。

dependencies 
    implementation  "com.google.protobuf:protobuf-javalite:3.10.0"


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

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

尝试编译您的应用程序,您应该会在flutter_project/build/app/generated/source/proto/debug/java/proto_pack 中看到 java 生成的文件

如果是这样,您的类应该在 MainActivity 中可用。

最后一点,您的 proto 文件在语法上不正确,但我认为它只是为了示例。

【讨论】:

我应该把 protobuf 源放在哪里?请记住,它们在根目录中,而不是 android 目录 您已将 proto 源目录配置为项目根目录 (flutter_project/) 中的 'protobuf/proto_java',所以它应该是放置它们的位置。 我应该保留多少我和你的 gradle 文件?我迷路了 我将您的代码粘贴到我的代码中,并在尝试编译我的应用程序后得到了protoc: stdout: . stderr: datasets/google_message3/benchmark_message3_1.proto: File not found.。请看,我开了一个赏金 对于配置,您只需在 android/app/build.gradle 文件中添加块而不更改配置。至于您的错误,您似乎正在尝试在 proto 文件中包含 datasets/google_message3/benchmark_message3_1.proto 并且在配置的 proto 源目录中找不到它,或者您正在尝试使用包含 datasets/google_message3/benchmark_message3_1.proto 的某些文件,而该文件又不存在。如果没有完整的 proto 文件,将很难调试。

以上是关于如何将protobuf添加到flutter/kotlin android项目中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ServiceStack 中添加 protobuf

如何确定protobuf中的消息类型,以便我可以使用该类型.parsefrom(byte [])

将变量添加到序列化缓冲区而不使用 protobuf.net 对其进行序列化

如何使用 Kafka Connect 将 Protobuf 消息传递到 Elasticsearch?

如何在 Protobuf-net 中动态添加 Proto 成员

Kafka Connect:如何使用 hdfs sink 连接器将 Kafka 主题的 protobuf 数据发送到 HDFS?