Gradle自動(dòng)化構(gòu)建之自定義任務(wù)

Gradle自動(dòng)化構(gòu)建之自定義任務(wù)

GitHub地址

_001.jpg

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的步驟是:

_006.png

我需要經(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ù)列表

_002.jpg

創(chuàng)建即可運(yùn)行這個(gè)任務(wù),即執(zhí)行了startCreate()方法開(kāi)始自動(dòng)化構(gòu)建.

也可以在Terminal命令行中輸入gradlew 任務(wù)名 (mac下輸入./gradlew 任務(wù)名)

_003.jpg

實(shí)際上我們執(zhí)行這任務(wù)的時(shí)候可能會(huì)輸入一大堆無(wú)關(guān)這個(gè)任務(wù)的日志,類(lèi)似于這樣:

_005.jpg

這些也是一個(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)目
}

詳細(xì)代碼

總結(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.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灿渴,一起剝皮案震驚了整個(gè)濱河市榜贴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖吨悍,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異菇爪,居然都是意外死亡撑瞧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)乙嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)末购,“玉大人,你說(shuō)我怎么就攤上這事虎谢∶肆瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵婴噩,是天一觀(guān)的道長(zhǎng)擎场。 經(jīng)常有香客問(wèn)我羽德,道長(zhǎng),這世上最難降的妖魔是什么顶籽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任玩般,我火速辦了婚禮,結(jié)果婚禮上礼饱,老公的妹妹穿的比我還像新娘坏为。我一直安慰自己,他們只是感情好镊绪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布匀伏。 她就那樣靜靜地躺著,像睡著了一般蝴韭。 火紅的嫁衣襯著肌膚如雪够颠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天榄鉴,我揣著相機(jī)與錄音履磨,去河邊找鬼。 笑死庆尘,一個(gè)胖子當(dāng)著我的面吹牛剃诅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驶忌,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矛辕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了付魔?” 一聲冷哼從身側(cè)響起聊品,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎几苍,沒(méi)想到半個(gè)月后翻屈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妻坝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伸眶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠勒。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爬坑,靈堂內(nèi)的尸體忽然破棺而出纠屋,到底是詐尸還是另有隱情,我是刑警寧澤盾计,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布售担,位于F島的核電站赁遗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏族铆。R本人自食惡果不足惜岩四,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哥攘。 院中可真熱鬧剖煌,春花似錦、人聲如沸逝淹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栅葡。三九已至茉兰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欣簇,已是汗流浹背规脸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊咽,地道東北人莫鸭。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像网棍,于是被迫代替她去往敵國(guó)和親黔龟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評(píng)論 25 707
  • 這一章主要針對(duì)項(xiàng)目中可以用到的一些實(shí)用功能來(lái)介紹Android Gradle滥玷,比如如何隱藏我們的證書(shū)文件氏身,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,575評(píng)論 3 25
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,122評(píng)論 8 72
  • 2017.2.23 今天完成了英語(yǔ)背單詞打卡惑畴,80個(gè)單詞大概背了兩個(gè)多小時(shí)蛋欣,結(jié)束的時(shí)候,還有十幾個(gè)單詞不太熟悉如贷,明...
    薇糖糖糖閱讀 116評(píng)論 0 0
  • 本想去買(mǎi)輛自行車(chē)陷虎,然后去騎行一把,結(jié)果發(fā)現(xiàn)國(guó)慶有活動(dòng)杠袱,心想那就再等一天吧尚猿。路上看到一排排的小黃車(chē),眼睛突然一亮楣富,這...
    douhaolee閱讀 483評(píng)論 0 0