溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中的Protobuf怎么使用

發(fā)布時間:2022-02-07 15:53:44 來源:億速云 閱讀:358 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Android中的Protobuf怎么使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    前言

    Protobuf,類似于json和xml,是一種序列化結(jié)構(gòu)數(shù)據(jù)機(jī)制,可以用于數(shù)據(jù)通訊等場景,相對于xml而言更小,相對于json而言解析更快,支持多語言。

    一、Proto文件示例

    Protobuf使用.proto文件來定義數(shù)據(jù)格式,所以我們首先新建立一個person.proto文件,并在文件中填下如下內(nèi)容:

    //指定proto的版本為proto3,不寫的話默認(rèn)為proto2.
    syntax = "proto3";
    //包名
    package proto;
    //引入包
    //import "";
    //指定生成類所在的Java包名
    option java_package = "com.example.demowork1";
    //重命名,如果不寫,默認(rèn)為文件名的首字母大寫轉(zhuǎn)化生成,如本文件如果不寫則是Person
    option java_outer_classname = "PersonProto";
    
    message Person{
      string name = 1;
      int32 id = 2;
      bool boo = 3;
      string email = 4;
      string phone = 5;
    }

    這樣我們就定義好了一個基本的Person對象,下面我們對文件中的關(guān)鍵字進(jìn)行一一說明:

    **syntax:**指定proto的版本,protobuf目前有proto2和proto3兩個常用版本,如果沒有聲明,則默認(rèn)是proto2.

    **package:**指定包名。

    **import:**導(dǎo)入包,類似于java的import.

    **java_package:**指定生成類所在的包名

    **java_outer_classname:**定義當(dāng)前文件的類名,如果沒有定義,則默認(rèn)為文件的首字母大寫名稱

    **message:**定義類,類似于java class;可以嵌套

    **repeated:**字段可以有多個內(nèi)容(包括0),類似于array

    需要注意的是在聲明了屬性之后,需要對屬性聲明一個tag(示例代碼中的:1,2,3)。

    這個tag是ProtoBuf編碼是使用來標(biāo)識屬性的,因此在定義了一個message的屬性之后,最好不要再去修改屬性的tag值以免造成舊數(shù)據(jù)解析錯誤。

    二、在Android中的使用

    protobuf可以在Android中進(jìn)行使用,并且集成對應(yīng)的Gradle Plugin能夠快速的編譯proto文件。

    其基本的編譯流程如下:

    Android中的Protobuf怎么使用

    下面我們直接使用上面的person.proto文件來舉例說明。

    1、 plugin配置

    首先我們需要在工程目錄下的build.gradle文件中引入protobuf,示例代碼如下:

    buildscript {
        ext.kotlin_version = "1.3.72"
        repositories {
            google()
            jcenter()
            maven { url "https://jitpack.io" }
            mavenCentral()
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.1.0"
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }

    然后我們還需要在Module目錄下的build.gradle文件下添加配置,示例如下:

    plugins {
      	...
        id 'com.google.protobuf'
    }
    android{
    	...
            sourceSets {
            main {
                java.srcDirs = ['src/main/java']
                jniLibs.srcDirs = ['libs']
                assets.srcDirs = ['assets']
    
                proto {
                    //指定proto文件位置,你的proto文件放置在此文件夾中
                    srcDir 'src/main/proto'
                }
            }
        }
    }
    dependencies{
    	...
    	    implementation 'com.google.protobuf:protobuf-java:3.5.1'
        	implementation 'com.google.protobuf:protoc:3.5.1'
    }
    protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地編譯器路徑
        }
    
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    remove java
                }
                task.builtins {
                    java {}// 生產(chǎn)java源碼
                }
            }
        }
    }

    在完成了上述配置之后,執(zhí)行一下rebuild方法,這樣我們就能夠自動生成proto java class文件了。

    2.、基本調(diào)用

    下面我們在Module工程中調(diào)用一下我們生成的文件,我們先首先生成一個Person對象,然后把轉(zhuǎn)換的byte[]再解析一下查看結(jié)果是否正確,代碼如下:

            var person1 = PersonProto.Person.newBuilder().setName("Tom")
                .setId(111).setBoo(false).setEmail("123@123.com").setPhone("123456789")
                .build()
            tvData.setOnClickListener {
                var dataTemp = PersonProto.Person.parseFrom(person1.toByteArray())
                LogUtil.instance.d(dataTemp.toString())
    //            mHandler.sendEmptyMessage(1)
            }

    執(zhí)行運(yùn)行之后,我們能看到正確的輸出結(jié)果:

    com.example.demowork1 D/message: name: "Tom"
        id: 111
        email: "123@123.com"
        phone: "123456789"

    “Android中的Protobuf怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI