Gradle自動(dòng)化構(gòu)建之自定義任務(wù)
Gradle自動(dòng)化構(gòu)建ProtocolBuffer
最近在看《Gradle For Android》一書(shū),里面提到了講解了一些Gradle的基本概念,
以及在Android Studio中應(yīng)該如何使用Gradle.一本非常適合對(duì)Gradle一知半解的同學(xué),建議大家可以買(mǎi)來(lái)看看.
書(shū)中提供的關(guān)于Gradle自動(dòng)化的一些知識(shí),所謂Gradle自動(dòng)化構(gòu)建,是指很多需要我們手工操作的事情可以使用Gradle來(lái)自動(dòng)化實(shí)現(xiàn).
舉一個(gè)簡(jiǎn)單的例子,導(dǎo)出一個(gè)帶簽名的APK包,通常的步驟是:
Build
Generate Signed APK...
選擇簽名文件
輸入文件密碼
輸入key
輸入key密碼
選擇下一步
選擇需要簽名的APK類(lèi)型
點(diǎn)確定
等待輸出后,去目錄找到這個(gè)APK
假設(shè)文件名字不符合要求(例如沒(méi)有顯示的寫(xiě)出APK渠道,版本等等),需要重新命名
將APK包發(fā)布
每次導(dǎo)出一個(gè)簽名的APK,都需要經(jīng)過(guò)這些步驟,而且當(dāng)需要簽名十幾個(gè)甚至上百個(gè)簽名包時(shí),這個(gè)任務(wù)就會(huì)變得非常繁瑣.
當(dāng)然Gradle早就已經(jīng)考慮到了這種情況,只需要安裝Android插件配置好,輸入:gradle build簡(jiǎn)單的命令變可實(shí)現(xiàn)批量打包.
關(guān)于這部分的技術(shù)大家可以搜:Android 批量打包.更多Gradle的資料可看文末的鏈接
Android Studio內(nèi)置許多自動(dòng)化構(gòu)建的任務(wù),但是我們?cè)陂_(kāi)發(fā)的過(guò)程中往往會(huì)遇到一些特殊的任務(wù),這個(gè)時(shí)候?qū)W習(xí)一個(gè)編寫(xiě)一個(gè)自動(dòng)化的任務(wù)就非常有必要了.
本文通過(guò)講解自定義Protocol Buffer自動(dòng)化構(gòu)建任務(wù)來(lái)幫助大家理解.
下面是關(guān)于Protocol Buffer的一些基礎(chǔ)知識(shí),倘若已經(jīng)對(duì)Protocol Buffer有一定了解的同學(xué)可以直接跳過(guò).
基本介紹
Protocol Buffer是Google定義的一種在網(wǎng)絡(luò)間傳輸?shù)臄?shù)據(jù)格式.
使用ProtoBuffer有很多好處,具體到以下幾點(diǎn):
采用二進(jìn)制流方式傳輸,處理,傳輸,解析的效率,更省流量
我們都知道自然語(yǔ)言的信息最豐富的,人類(lèi)最容易懂,機(jī)器最難懂,二進(jìn)制機(jī)器最易懂,人類(lèi)最難懂.
即人類(lèi)對(duì)語(yǔ)言的理解程度可以概括性的解釋為:
<b>自然語(yǔ)言→XML→JSON→二進(jìn)制</b>
計(jì)算機(jī)正好與人類(lèi)相反,為什么我們用Json替換xml,因?yàn)镴son比xml效率更高,而且也能被人類(lèi)所理解,雖然傳輸?shù)男畔⒚枋鰶](méi)有那么豐富.
而為什么使用ProtoBuffer,因?yàn)樗菾son更加簡(jiǎn)潔(采用二進(jìn)制),同時(shí)對(duì)人類(lèi)來(lái)說(shuō)更加難懂,但是對(duì)機(jī)器來(lái)說(shuō)效率卻更高.
<b>騰訊便是采用一種類(lèi)ProtoBuffer的數(shù)據(jù)格式進(jìn)行通訊的.</b>
統(tǒng)一定制數(shù)據(jù)類(lèi)型效率更高.
這里所說(shuō)的效率,并不是計(jì)算機(jī)上所說(shuō)的執(zhí)行速度和占用資源.以Json為例,我們經(jīng)常會(huì)遇到這樣的一個(gè)場(chǎng)景:
服務(wù)端提供一個(gè)接口,返回固定的字段,類(lèi)似于下面的表格
字段 | 含義 |
---|---|
code | >0表示成功 |
message | 描述code的成功或失敗 |
data | 響應(yīng)數(shù)據(jù),code>0返回 |
name | String類(lèi)型,用戶(hù)名 |
id | int類(lèi)型,用戶(hù)id |
按照理想的狀態(tài),請(qǐng)求應(yīng)該返回下面信息
{"code":1,"message":"請(qǐng)求成功","data":{"name":"siyehua","id":10086}}
{"code":-1,"message":"密碼不對(duì)","data":{}}
客戶(hù)端根據(jù)json生成數(shù)據(jù)類(lèi)型并解析.
上面說(shuō)的理想狀態(tài),很明顯,理想是豐滿(mǎn)的,現(xiàn)實(shí)是骨感的.
服務(wù)器無(wú)數(shù)據(jù)的時(shí)候經(jīng)常會(huì)出現(xiàn)返回下面這種情況:
//明明說(shuō)好是一個(gè)Json對(duì)象,關(guān)鍵時(shí)刻變成Json數(shù)組類(lèi)型了
{"code":-1,"message":"密碼不對(duì)","data":[]}
//說(shuō)好這個(gè)message字段一定有,結(jié)果某次返回卻沒(méi)有了
//客戶(hù)端如果沒(méi)有做空判斷可能直接異常閃退
{"code":1,"message":"請(qǐng)求成功","data":{"id":10086}}
客戶(hù)端需要根據(jù)服務(wù)器返回的數(shù)據(jù)生成相應(yīng)的JavaBean(Android),而IOS那邊也需要生成自己的數(shù)據(jù)類(lèi)型.
隨著業(yè)務(wù)的擴(kuò)展增加或者修改了字段,客戶(hù)端也需要修改.
可能原來(lái)說(shuō)好一定有的字段,現(xiàn)在說(shuō)不一定有了,又需要修改代碼邏輯,做空判斷等等...
<b>沒(méi)有一個(gè)統(tǒng)一的規(guī)則對(duì)后期的維護(hù)修改是致命的,特別是在版本已經(jīng)發(fā)布的情況下</b>
Protocol Buffer統(tǒng)一定制好一個(gè)proto文件,詳細(xì)規(guī)定好字段信息,再使用proto生成工具生成對(duì)應(yīng)語(yǔ)言的數(shù)據(jù)類(lèi)型,例如java,c++.
它和平臺(tái)無(wú)關(guān),定義一次能讓整個(gè)項(xiàng)目的所有平臺(tái)都使用同樣意義的數(shù)據(jù)類(lèi)型,無(wú)需擔(dān)心各種意外情況,因?yàn)镻rotocol Buffer的語(yǔ)法
已經(jīng)幫你定制好了,不符合proto定義文件的數(shù)據(jù)類(lèi)型無(wú)法進(jìn)行有效的傳輸.
關(guān)于更多Protocol Buffer請(qǐng)看官方文檔,需自備梯子,或文末的參考鏈接
自動(dòng)化構(gòu)建
Protocol Buffer的好處是巨大的,但是它同樣帶來(lái)一些不便,除了上文說(shuō)到的不易被人類(lèi)所閱讀理解,
還有就是生成Java類(lèi)文件過(guò)大(擁有兩個(gè)屬性的類(lèi)高達(dá)上千行代碼),以及不能直接修改Protocol Buffer生成的數(shù)據(jù)類(lèi)型,如果需要
設(shè)置一些特殊效果,需要對(duì)類(lèi)進(jìn)行包裝.
現(xiàn)在我在工作中根據(jù)Protocol Buffer生成一個(gè)JavaBean的步驟是:
我需要經(jīng)常詢(xún)問(wèn)服務(wù)端是否更新了文件,服務(wù)端也要一次次回答我.如果有更新,每次都要做同樣的操作把生成新的JavaBean,為什么不
把這一整套流程做成自動(dòng)化的呢?
詳細(xì)構(gòu)建步驟
首先在module的build.gradle新建一個(gè)task任務(wù).
每一個(gè)task都相當(dāng)于一個(gè)main方法的入口,只要你添加了就會(huì)被假如到tasks列表依次執(zhí)行.
task createJavaBean << {
startCreate();
}
這就創(chuàng)建了一個(gè)任務(wù),同步一下gradle,我們可以在右邊的Gradle任務(wù)管理中查看到這個(gè)任務(wù)列表
創(chuàng)建即可運(yùn)行這個(gè)任務(wù),即執(zhí)行了startCreate()方法開(kāi)始自動(dòng)化構(gòu)建.
也可以在Terminal命令行中輸入gradlew 任務(wù)名 (mac下輸入./gradlew 任務(wù)名)
實(shí)際上我們執(zhí)行這任務(wù)的時(shí)候可能會(huì)輸入一大堆無(wú)關(guān)這個(gè)任務(wù)的日志,類(lèi)似于這樣:
這些也是一個(gè)個(gè)任務(wù),但是和我們建立的這個(gè)createJavaBean一點(diǎn)關(guān)系都沒(méi)有,那為什么會(huì)執(zhí)行呢?
實(shí)際上會(huì)這些任務(wù)并沒(méi)有執(zhí)行
Gradle的任務(wù)一共有三個(gè)階段:<b>初始化,配置,執(zhí)行</b>.
假設(shè)我們創(chuàng)建一個(gè)A任務(wù)
task A {
//do something...
}
那這個(gè)任務(wù)的//do something...會(huì)在Gradle的配置階段便被執(zhí)行,而 加了"<<"表示在執(zhí)行的階段才會(huì)執(zhí)行它.
所以我們創(chuàng)建的createJavaBean創(chuàng)建我們手動(dòng)雙擊才會(huì)執(zhí)行,假設(shè)我們希望它能在build階段執(zhí)行,只需要去掉"<<"即可.
接著,startCreate()只需要執(zhí)行java/groovy代碼即可,其實(shí)不需要懂groovy代碼,使用純粹的Java語(yǔ)言編寫(xiě)即可.
void startCreate(){
//判斷文件是否更新(可更新Http請(qǐng)求判斷文件是否更新,我這邊是放在本地git倉(cāng)庫(kù)里,所以通過(guò)git命令更新)
//沒(méi)有更新則return
//有更新則執(zhí)行proto命令生成新的JavaBean
//修改新的JavaBean的一些信息以適應(yīng)當(dāng)前項(xiàng)目
}
總結(jié)
這樣,一個(gè)簡(jiǎn)單的自動(dòng)構(gòu)建任務(wù)就完成了.
新建一個(gè)自動(dòng)化的任務(wù)真的非常簡(jiǎn)單,很多人使用Gradle還局限于對(duì)Android的各種配置中,
實(shí)際上Gradle的功能還不止如此,我強(qiáng)烈推薦大家參考文末的鏈接文章,來(lái)構(gòu)建自己的Gradle任務(wù).
Link
Name | Link |
---|---|
Gradle For Android圖書(shū) | https://item.jd.com/11995759.html |
Gradle官網(wǎng) | https://gradle.org/ |
Android Studio | https://developer.android.com/studio/build/index.html?hl=zh-cn |
Android Gradle | http://tools.android.com/tech-docs/new-build-system/user-guide |
Android Gradle中文譯文 | https://chaosleong.gitbooks.io/gradle-for-android/content/ |
Protocol Buffer | https://developers.google.com/protocol-buffers/ |
Windows上Protocol Buffer的接入 | http://www.reibang.com/p/47cd56f5e915 |
Protocol Buffer自動(dòng)構(gòu)建 | http://www.reibang.com/p/6c9f90538efe |
Protocol Buffer For Android | http://www.reibang.com/p/2a376e657ae0 |
Protocol Buffer For Android | http://www.reibang.com/p/e8712962f0e9 |
Protocol Buffer nano使用 | http://www.reibang.com/p/185fc0e13028 |
License
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.