前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Android Studio配置google protobuf

在Android Studio配置google protobuf

作者头像
阳仔
发布2019-07-31 17:13:32
2.5K0
发布2019-07-31 17:13:32
举报
文章被收录于专栏:终身开发者

在Android Studio配置google protobuf

1、在project的build.gradle中配置
代码语言:javascript
复制
 buildscript {    repositories {        jcenter()        mavenCentral()    }    dependencies {        classpath 'com.android.tools.build:gradle:2.2.3'        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'    }}

注意 Gradle版本至少是 2.12 并且Java 7,本例子使用的是2.2.3protobuf-gradle-plugin使用最新的0.8.0版本。

2、在app的build.gradle中配置
代码语言:javascript
复制
 ...apply plugin: 'com.google.protobuf'...protobuf {    //这里配置protoc编译器    protoc {        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'    }    plugins {        javalite {            // The codegen for lite comes as a separate artifact            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'        }    }    //这里配置生成目录,编译后会在build的目录下生成对应的java文件    generateProtoTasks {        all().each { task ->            task.plugins {                javalite {}            }        }    }}dependencies {    ...    compile 'com.google.protobuf:protobuf-lite:3.0.0'    ...}

这里配置的是protobuf-lite最新的3.0.0版本,这个官方推荐给Android中使用的版本。

3、创建proto文件

一般情况下在app/main目录下创建proto目录,用于放置.proto文件。本例中创建了一个book.proto

代码语言:javascript
复制
 syntax = "proto2";option java_package = "net.angrycode.bean";package bean;message Book {    required int32 id = 1;    required string name = 2;    optional string desc = 3;}

proto2proto3的语法不大一样,例如proto3中不需要requiredoptional修饰字段,而proto2是需要的,这里指定了proto2的语法版本。

这里指定了java_package属性,说明当protoc生成这个java类的包名为net.angrycode.bean

最后使用message定义了一个名为Book的数据结构,或者说通讯协议。Book有3个字段其中idname是必须的,而desc是可选字段。如果必选字段缺失,读写时会发生com.google.protobuf.UninitializedMessageException: Message was missing required fields异常。

4、一个简单实例

在Android Studio中Build菜单选中Make Project或者Reruild Project可以在app/build目录下生成对应的java文件,例如创建一个Book实例

代码语言:javascript
复制
 BookOuterClass.Book book = BookOuterClass.Book.newBuilder()  .setId(1)  .setName("Prime")  .setDesc("Code Book")  .build();

proto可以往外写,使用writeTo(OutputStream)方法,可以是本地文件流,也可以是网络流。这里写入文件流

代码语言:javascript
复制
     void save() {        File dir = Environment.getExternalStorageDirectory();        File file = new File(dir, "book");        try {            FileOutputStream outputStream = new FileOutputStream(file);            book.writeTo(outputStream);            outputStream.close();        } catch (IOException e) {            Log.e(TAG, e.getMessage());        }    }

proto是二进制传输,故可以读取文件流,或者网络流,这里文件模拟,使用parseFrom(byte[])方法。

代码语言:javascript
复制
 void read() {        File dir = Environment.getExternalStorageDirectory();        File file = new File(dir, "book");        try {            FileInputStream inputStream = new FileInputStream(file);            ByteArrayOutputStream out = new ByteArrayOutputStream();            byte[] data = new byte[1024];            int len = -1;            while ((len = inputStream.read(data)) != -1) {                out.write(data, 0, len);                out.flush();            }            BookOuterClass.Book book = BookOuterClass.Book.parseFrom(out.toByteArray());            out.close();            textView.setText("name:" + book.getName() + ",desc:" + book.getDesc());        } catch (IOException e) {            Log.e(TAG, e.getMessage());        }    }
参考链接

https://developers.google.com/protocol-buffers/

https://github.com/google/protobuf

https://github.com/google/protobuf-gradle-plugin

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 终身开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Android Studio配置google protobuf
    • 1、在project的build.gradle中配置
      • 2、在app的build.gradle中配置
        • 3、创建proto文件
          • 4、一个简单实例
            • 参考链接
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档