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

微信扫一扫
关注该公众号

在Android Studio配置google protobuf的更多相关文章

  1. Android Studio配置指南总结

     转载:http://blog.csdn.net/mynameishuangshuai/article/details/51332790 使用AndroidStudio开发APP已有半年多的时间了,从 ...

  2. Android零基础入门第13节:Android Studio配置优化,打造开发利器

    原文:Android零基础入门第13节:Android Studio配置优化,打造开发利器 是不是很多同学已经有烦恼出现了?电脑配置已经很高了,但是每次运行Android程序的时候就很卡,而且每次安装 ...

  3. Win10下Android studio配置

    Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ...

  4. Android studio配置Git

    Android studio配置Git 1.下载window 版git并安装:下载地址 2.Android Studio设置git插件:File->Setting->Version Con ...

  5. Android Studio配置Git及Git文件状态说明

    Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ...

  6. Android Studio 配置SVN实现代码管理

    Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ...

  7. Android studio 配置JNI环境

    Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...

  8. Android studio 配置file encoding 无效,中文乱码解决办法

    通过配置Android studio 配置file encoding 无效,中文乱码,问题出现在java编译的时候jack采用了默认编码(中文windows默认的GBK编码)而乱码,所以不管更改bui ...

  9. Android Studio配置使用git

    一.准备 如果没有安装git,那么先要到到Git官网下载git,然后按照提示一步一步安装即可,这个没有什么难度,不过要记得安装的目录. 二.Android Studio配置git File->S ...

随机推荐

  1. Spring的注解问题

    Annotation(注解)概述 从JDK5.0开始, Java增加了对元数据(MetaData)的支持,也就是 Annotation(注解). Annotation其实就是代码里的特殊标记,它用于替 ...

  2. SpringBoot集成beetl模板快速入门

    SpringBoot集成beetl模板快速入门 首次探索 beetl官方网址:http://ibeetl.com/ 创建SpringBoot工程(idea) 新建工程 选择创建Spring工程 书写包 ...

  3. android异常 More than one file was found with OS independent path 'META-INF/XXX'

    android 异常总结:一个文件在jar包中出现多次. Error:Execution failed for task ':app:transformResourcesWithMergeJavaRe ...

  4. CSS画出三角形(利用Border)

    画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及颜色. 如果你将宽度调的足够大,改变不同方向的颜色,你就可以发现盒模型的border是四个梯形一样的线条. div{ width ...

  5. LINUX下查找大文件及大的文件夹

    原帖地址:https://www.cnblogs.com/iyoume2008/p/6105590.html 今天正好碰到这样的问题,在博客园中看到有以上地址的一篇文章,照着上面的操作解决了问题,但是 ...

  6. 深入学习OpenCV检测及分割图像的目标区域

    准备1:OpenCV常用图片转换技巧 在进行计算机视觉模型训练前,我们经常会用到图像增强的技巧来获取更多的样本,但是有些深度学习框架中的方法对图像的变换方式可能并不满足我们的需求,所以掌握OpenCV ...

  7. JavaScript Boolean(逻辑)对象

    Boolean(逻辑)对象用于将非逻辑值转换为逻辑值(true 或者 false). 实例 检查逻辑值 检查逻辑对象是 true 还是 false. 完整的 Boolean 对象参考手册 我们提供 J ...

  8. backtracing

    5月10日 1 37  Sudoku Slover public void solveSudoku(char[][] board) { if(board == null || board.length ...

  9. 【iOS】手动抛出异常

    之前没遇到过需要手动抛出异常的时候,这次见到了,记录一下.示例代码如下: /** 如果调用 [[BNRItemStore alloc] init],就提示应该使用 [BNRItemStore shar ...

  10. 【Python-Django】浏览器同源策略

    1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策. 同源策略是浏览器的一个安全功能,不同源的客户端脚本(js文件)在没有明确授权的情况下,不能读写对方资源.只有 ...