专栏首页终身开发者在Android Studio配置google protobuf

在Android Studio配置google protobuf

在Android Studio配置google protobuf

1、在project的build.gradle中配置

 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中配置

 ...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

 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实例

 BookOuterClass.Book book = BookOuterClass.Book.newBuilder()  .setId(1)  .setName("Prime")  .setDesc("Code Book")  .build();

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

     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[])方法。

 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

本文分享自微信公众号 - 终身开发者(AngryCode),作者:angrycode

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WeCode发布了!

    随时查阅当前Github上的热门趋势。使用Material Design设计风格,和流行的MVP+Retrofit+RxJava框架。数据抓取自https://...

    阳仔
  • Android WebView 安全问题汇总

    在使用WebView开发时注入JS对象,当App具有读写SDCARD权限,那么注入的JS对象就可以通过反射机制获取到Java对象Runtime,并调用静态方法来...

    阳仔
  • Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了。列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FA...

    阳仔
  • 你所需要的跨域问题的全套解决方案都在这里啦!(前后端都有)

    随着RESTful架构风格成为主流,以及Vue.js、React.js和Angular.js这三大前端框架的日益强大,越来越多的开发者开始由传统的MVC架构转向...

    一只图雀
  • 为什么浏览器不能跨域

     现在很多人特别是前端开发人员,在ajax请求,XMLHttpRequest的过程中会碰到一个问题,那就是跨域请求:

    跟着阿笨一起玩NET
  • leetcode478. Generate Random Point in a Circle

    假设现在已知圆的圆心的x和y坐标,以及该圆的半径radius。要求写一个随机点生成器,要求该生成器生成的点必须在圆内,且每一个点被生成的概率为相等的。规定圆周上...

    眯眯眼的猫头鹰
  • 信息搜集-Github文件泄露搜索语法

    site:Github.com smtp admin@%.com  (webmaster、root、help、service,And so on..)

    酷酷的繁星
  • 初探ClickHouse的RBAC权限功能

    在4.28号的线上 Meetup 中,朵夫介绍了 ClickHouse 的一项新特性,即基于角色的RBAC权限功能,当时我就觉得这将会是一项实用的功能。

    Nauu
  • vs2015编写c#项目下各文件解析 vs项目结构解析vs项目结构解析

    当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用。

    vv彭
  • Android 2.3中的LinearAlloc

    在2.3版本Apk安装时 , 会进行Dexopt , 如果单个Dex中的class过大/method过多 , 就会导致LinearAlloc为Class/Met...

    None_Ling

扫码关注云+社区

领取腾讯云代金券