Google Protocol Buffers + Android micro/nano runtime 的編譯

最近作的項目涉及到 Protobuf,因此就順便整理上來分享一下吧。java

Protocol Buffers (aka. protobuf) 是啥?

一套序列化方案。也就是說,把定義好的數據轉換爲通過精心安排的二進制形式,或者反過來。相較於 XML 或 JSON 更省流量。python

很少說,你們能夠谷歌一下這方面的資料。android

下面進入正題。git

正題

好吧被進入了。github

基於 protobuf 的特色,咱們須要使用 protobuf 的編譯器 protoc 將咱們的數據結構定義文件(*.proto)編譯生成對應語言的操做類。數據結構

protobuf 編譯器機制是,一個主命令 protoc,下面各個不一樣的語言(好比 Objective-C)經過插件來擴充。這就省去了爲了增長一個語言的支持而從新編譯編譯器(繞口令)的麻煩。工具

官方版的 protobuf 自帶了 Java、Python 和 C++ 的支持。而 Android 團隊爲了照顧移動平臺的計算能力,還作了 Java micro 和 Java nano 兩個精簡運行時,儘可能減小使用一些不是必須的語言特性。不過,不管什麼語言,它們生成的二進制格式都是同樣的。測試

編譯編譯器

首先固然要檢出源代碼。爲了獲得 Java micro 和 Java nano 兩個版本的運行時,咱們乾脆直接用 Android 團隊維護的分支好了。google

鑑於 android.googlesource.com 在國內的訪問速度有點內啥,咱們就用 GitHub 上的同步鏡像吧。spa

git clone https://github.com/android/platform_external_protobuf.git android-protobuf

這條命令會將代碼檢出到 android-protobuf/ 目錄下。Android 團隊的源代碼都是按照整個 Android 的發佈版原本打 tag 的,因此如今 tag 最新只到 4.4.2。master 分支上最近修復了 OS X 10.9 下一個編譯失敗問題,因此大膽用 master 分支的代碼吧。

下面開始編譯。gcc、libtool、autoconf 這些編譯工具要先裝好。

cd android-protobuf
./autogen.sh  # 刷出好多東西,最後 exit 0 表示成功
./configure  # 又刷出不少東西,留意沒報錯就好了
make  # 編譯過程那些 xx is deprecated 的 warning 能夠不用管
sudo make install  # 安裝

編譯安裝完了,測試一下:

$ protoc -h
Usage: protoc [OPTION] PROTO_FILES
Parse PROTO_FILES and generate output based on the options given:
  ...bla bla bla...
  --cpp_out=OUT_DIR           Generate C++ header and source.
  --java_out=OUT_DIR          Generate Java source file.
  --javamicro_out=OUT_DIR     Generate Java source file micro runtime.
  --javanano_out=OUT_DIR      Generate Java source file nano runtime.
  --python_out=OUT_DIR        Generate Python source file.

看到 Java micro 和 Java nano 都裝好了。

編譯運行時

Java(包括 micro 和 nano)版的運行時都須要一個文件,這個文件自己是經過 protoc 編譯生成的。這一步常常會不當心漏掉。

進入 android-protobuf/ 下的 java/ 目錄:

cd java
protoc --java_out=src/main/java -I../src ../src/google/protobuf/descriptor.proto

運行時

上面的 android-protobuf/java/ 目錄就是 protobuf 的運行時。簡單來講,就是 protoc 生成的那堆 Java 類繼承自的那些類。

在 Android 項目中使用配置運行時

首先,我討厭 Eclipse,我討厭 Android Studio。

動手吧:

  1. 掏出你的 IntelliJ IDEA
  2. 點開 File / Project Structure...

  3. Modules,點 + 號,Import Module

  4. 選擇剛剛檢出的 android-protobuf/ 目錄下的 java/ 目錄

  5. Import module from external modelMaven

  6. Next

  7. 三個可選的運行時版本,須要的話就選上吧。

  8. NextNextFinish

  9. 回到 Project Structure / Modules,點右邊下面的 + 號,Module Dependency...

  10. 選剛剛導入進工做區的 protobuf-java 模塊,OK

  11. 搞定咯
相關文章
相關標籤/搜索