我是靠谱客的博主 高兴猎豹,这篇文章主要介绍Android上使用Protocol Buffer,现在分享给大家,希望可以做个参考。

文章目录

    • 环境配置:
    • 基本使用方式
    • 注意事项:
    • 参考链接:

环境配置:

< ProjectName>/build.gradle

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.17'
  }
}

< ProjectName>/app/build.gradle

apply plugin: 'com.android.application'  // or 'com.android.library'
apply plugin: 'com.google.protobuf'
// or apply plugin: 'com.google.protobuf' version "0.8.17" //这种方式可以不用在classpath中添加插件依赖
  1. protobuf-lite以来方式

    • version3.8以前
   
     dependencies {
       // You need to depend on the lite runtime library, not protobuf-java
       implementation 'com.google.protobuf:protobuf-lite:3.0.0'
     }
     
     protobuf {
       protoc {
         // You still need protoc like in the non-Android case
         artifact = 'com.google.protobuf:protoc:3.7.0'
       }
       plugins {
         javalite {
           // The codegen for lite comes as a separate artifact
           artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
         }
       }
       generateProtoTasks {
         all().each { task ->
           task.builtins {
             // In most cases you don't need the full Java output
             // if you use the lite output.
             remove java
           }
           task.plugins {
             javalite { }
           }
         }
       }
     }
  • version3.8以后
   dependencies {
       // You need to depend on the lite runtime library, not protobuf-java
       implementation 'com.google.protobuf:protobuf-javalite:3.8.0'
     }
     
     protobuf {
       protoc {
         artifact = 'com.google.protobuf:protoc:3.8.0'
       }
       generateProtoTasks {
         all().each { task ->
           task.builtins {
             java {
               option "lite"
             }
           }
         }
       }
     }
  1. protobuf-java方式
   
   dependencies {
     implementation 'com.google.protobuf:protobuf-java:3.17.3'
   }
   
   protobuf {
       protoc {
           artifact = 'com.google.protobuf:protoc:3.17.3'
       }
       generateProtoTasks {
           all().each { task ->
               task.builtins {
                   remove java
               }
               task.plugins {
                   java  {}
               }
           }
       }
   }

基本使用方式

这里对最基本的使用方式进行举例。对proto的文件夹默认定在../app/src/main/proto文件夹中,如果想更改位置可以使用以下方式:

android {
    sourceSets {
        main {
           jniLibs.srcDir 'libs'
           jni.srcDirs = []    //disable automatic ndk-build
            proto {
                // proto 文件默认路径是 src/main/proto
                // 可以通过 srcDir 修改 proto 文件的位置
                srcDir 'src/main/proto'
           }
        }
   }
 }

创建拓展名为proto的文件,如test.proto,其内容格式如下:

syntax = "proto3";

option java_package = "com.sample.android_sample_preference_datastore";
option java_multiple_files = true;

message UserStore {
    bool is_logged_in = 1;
    string user_name = 2;
}

当对test.proto文件的更改,需要进行重新编译(build)来重新生成代码,生成的代码位于app/build/generated/source/proto下面

注意事项:

  1. protocol buffer 需要使用最新版本,否则可能会出现编译错误
  2. protobuf-java是完整版本,protobuf-lite是轻量版本,轻量版本里面只有基本类型,没有google/protobuf/any.proto文件
  3. protocol buffer数据格式使用的话最好双方统一为该数据格式,否则一方面使用protocol buffer,一方面使用json或者xml的话,需要使用额外的数据格式转换库(比如protobuf-java-format)。但是这种方式会比较麻烦而且要兼容一些额外的操作,比如Any的范型
  4. 在使用json和protocol buffer进行转换的时候,如果在测试的时候需要注意不能使用单引号’。例如以下两种方式在单纯的解析时候可以使用,但是单引号那种在protocol buffer就不可以使用
    第一种转义符使用:
    val json = "{"code":"3"}"
    

第二种单引号使用(错误示范):

```kotlin
val json = "{'code':'3'}"
```
  1. Mac电脑上的M1芯片兼容问题
    在Mac电脑的M1芯片进行编译Protocol文件时候会出现类似以下的错误:
Could not find protoc-3.14.0-osx-aarch_64.exe (com.google.protobuf:protoc:3.14.0)

参考github上面的解决对gradle配置的解决方案如下:
修改文件地址: ../app/build.gradle

protobuf {
  protoc {
    if (osdetector.os == "osx") {//区分平台
      artifact = 'com.google.protobuf:protoc:3.14.0:osx-x86_64'
    } else {
      artifact = 'com.google.protobuf:protoc:3.14.0'
    }
  }
}

当然上面还提供了maven的解决方案,如下(该方案没有尝试过)
修改文件地址 ~/.m2/settings.xml

<settings>
  ...
  <activeProfiles>
    <activeProfile>
      apple-silicon
    </activeProfile>
    ...
  </activeProfiles>
  <profiles>
    <profile>
      <id>apple-silicon</id>
      <properties>
        <os.detected.classifier>osx-x86_64</os.detected.classifier>
      </properties>
    </profile>
    ...
  </profiles>
  ...
</settings>

参考链接:

  1. Android 中使用Protocol Buffer

https://blog.csdn.net/qq_35599978/article/details/80386356

  1. 查看protocol buffer最新版本

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

  1. Protocol Buffer

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

  1. Protocol Buffer在Java上的使用

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

  1. Protocol Buffer在网络数据传输中的使用
    https://blog.csdn.net/weixin_32757449/article/details/114093565

  2. protobuf与json相互转换的方法
    https://www.cnblogs.com/pcheng/p/9586039.html

  3. protobuf-java-format
    https://github.com/bivas/protobuf-java-format

  4. proto在Android上的使用
    https://proandroiddev.com/android-jetpack-proto-datastore-a11ff8edcda8

  5. Mac电脑的M1芯片兼容问题
    https://github.com/grpc/grpc-java/issues/7690

  6. Android Developer官网中datastore的使用https://developer.android.google.cn/topic/libraries/architecture/datastore?hl=zh-cn

最后

以上就是高兴猎豹最近收集整理的关于Android上使用Protocol Buffer的全部内容,更多相关Android上使用Protocol内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部