Android protobuf 插件使用及问题记录

0. 一句话描述protobuf

protobuf是Google推出的类似json和xml一样的通信数据协议。

1. 为什么使用protobuf

1.1 轻松的定义和多语言生成

定义register.proto文件

syntax = "proto3";

package com.privi.protocol;

option java_outer_classname = "RegisterProtoCreator";

message RegisterProto {
    string name = 1;
    int32 age = 2;
}

使用插件即可生成多语言的类,供多语言使用。

1.2 高效

相对json,protobuf的时间和空间效率都很高,尤其适用于高频率大数据量的传输和解析。

2. Android studio使用protobuf基础篇

2.1 修改项目根build.gradle

buildscript {
//省略repostories
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        ///**修改**:添加对protobuf插件的依赖
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
    }
}

2.2 修改项目内build.gradle

apply plugin: 'com.android.library'
apply plugin: 'com.google.protobuf'
android {
    //省略defaultConfig和buildTypes
    ///**修改1**:增加proto文件目录配置
    sourceSets {
        main {
            // 定义proto文件目录
            proto {
                srcDir 'src/main/proto'
            }
        }
    }
}
///**修改2**:增加protobuf插件编译配置
protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                javalite {}
            }
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    ///修改3:增加protobuf-lite包依赖
    api 'com.google.protobuf:protobuf-lite:3.0.0'
}

2.3 定义proto文件

在src/main/proto目录下定义Register.proto
在这里插入图片描述

2.4 编译并查看类文件

使用gradle的单模块编译命令:gradlew :模块名:编译类型
terminal中执行 gradlew :protocol:assembleDebug
或者clean Project也可以。

在目录:\protocol\build\generated\source\proto\debug\javalite\com\privi\protocol\RegisterProtoCreator.java
即可以看拿到生成的类文件如下图:
在这里插入图片描述

3. 遇到的坑

3.1 问题1

编译报错:Configuration with name ‘debugAndroidTestCompile’ not found.
原因:根build.gradle下的protobuf 插件版本不是最新版本
解决方案:修改依赖为最新的protobuf 插件
参考:https://stackoverflow.com/questions/49772940/google-cloud-speech-api-protobuf-is-causing-debugandroidtestcompile-not-found

3.2 问题2

编译报错:Android - API ‘variant.getJavaCompiler()’ is obsolete and has been replaced with 'variant.getJavaCom
原因:gradle版本太新了,比如 3.3.0以上,protobuf 插件暂不支持该版本
解决方案:降低gradle 版本,比如降到gradle 3.2.1

3.3 问题3

编译报错:ResGetMapList.proto:11:5: “com.ainirobot.navigationservice.protocol.request.Params” seems to be defined in “ReqPackLog.proto”, which is not imported by “ResGetMapList.proto”. To use it here, please add the necessary import.
原因:在不同的proto文件中,定义同名的message会出错
解决方案:如果message内容相同,则单独定义proto文件,复用,如果message内容不同,则修改名字

3.4 问题4

编译报错:Error: Program type already present: com.google.protobuf.AbstractMessageLite B u i l d e r Builder BuilderLimitedInputStream
原因:混用了protobuf-lite和protobuf-java,这两个属于protobuf的不同版本包,不能混用
解决方案:保证只用一种protobuf包

3.5 问题5

编译报错:找不到com.google.protobuf.MessageLiteOrBuilder的类文件
原因:protocol module使用了implementation依赖protobuf-lite包,app项目依赖protocol module的时候,就无法同时依赖protobuf-lite。
解决方案:用api替代依赖选项implementation

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ProtobufProtocol Buffers)是一种轻量级的数据序列化格式,用于结构化数据的存储和交换。它具有跨平台、高效、可扩展等特点,被广泛应用于分布式系统、通信协议、数据存储等领域。 要使用Protobuf插件,首先需要安装Protobuf编译器(protoc)和相应的插件。然后,按照以下步骤进行使用: 1. 定义消息结构:使用Protobuf语言定义消息的结构,包括字段名称、类型和标签等信息。例如,可以创建一个名为`person.proto`的文件,并在其中定义一个`Person`消息类型。 2. 编写消息定义:在`person.proto`文件中,使用Protobuf语言编写消息的定义。例如,可以定义一个包含姓名和年龄字段的`Person`消息类型。 3. 编译消息定义:使用Protobuf编译器将消息定义文件编译成目标语言的代码。例如,可以使用以下命令将`person.proto`文件编译成Python代码: ``` protoc --python_out=. person.proto ``` 4. 使用生成的代码:根据目标语言生成的代码,可以在应用程序中使用Protobuf消息进行序列化和反序列化操作。例如,在Python中可以导入生成的代码,并使用`Person`类创建和操作消息对象。 相关问题: 1. Protobuf是什么? 2. Protobuf有哪些特点? 3. 如何定义Protobuf消息结构? 4. 如何使用Protobuf编译器生成代码? 5. 如何在应用程序中使用生成的代码进行序列化和反序列化操作?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值