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. 数据库系统概念:JDBC

    import java.sql.*; public class DataBase { public static void main() { } } /* 5.1.1 JDBC */ class JD ...

  2. 统计学习方法(李航)朴素贝叶斯python实现

    朴素贝叶斯法 首先训练朴素贝叶斯模型,对应算法4.1(1),分别计算先验概率及条件概率,分别存在字典priorP和condP中(初始化函数中定义).其中,计算一个向量各元素频率的操作反复出现,定义为c ...

  3. C# 不同访问符的访问级别

    public----成员可以由任何代码访问. private----成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal----成员只能由定义它的项目(程序集) ...

  4. C# ORM简单原理

    对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去. 在今日的企业环境中,把面向对象 ...

  5. Webpack打包效率优化篇

    Webpack基础配置: 语法解析:babel-loader 样式解析:style-loader css解析:css-loader less解析:less-loader 文件解析:url-loader ...

  6. 物联网时代 跟着Thingsboard学IOT架构-CoAP设备协议

    thingsboard官网: https://thingsboard.io/ thingsboard GitHub: https://github.com/thingsboard/thingsboar ...

  7. 访问腾讯云主机mysql的设置问题

    ---恢复内容开始--- 1.需要打开腾讯云主机的防火墙端口3306,具体实现可以在腾讯云控制台安全组中设置开放全部端口(安全组对应入站.出战规则): 2.将云主机mysql中mysql数据库user ...

  8. jsp数据交互(二).3

    01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...

  9. Linux ln 命令

    Linux 中的文件分为 Hard Link 和 Symbolic Link 两种.Hard Link 文件又被称为硬链接文件.实体链接文件,Symbolic Link 文件则常被称为符号链接.软链接 ...

  10. 并发栅栏CyclicBarrier---简单问2

    并发栅栏CyclicBarrier---简单问 背景:前几天在网上看到关于Java并发包java.concurrent中一个连环炮的面试题,整理下以备不时之需. CyclicBarrier简介: 栅栏 ...