題外話:其實本來不想取這個名字的仇味,但是感覺不取這個名字感覺沒有幾個人看啊杨赤。大家肯定覺得這個名字比較高大上吧!哈哈哈哈野来。好了恼除,收。
前言
在平時Android開發(fā)中我們常常使用Gradle來構建我們的項目曼氛,我相信大家都可能遇到以下問題:
- 開啟項目提示界面一直顯示Gradle Build Running
- Gradle傳遞性依賴沖突
- 多渠道打包
- .....等
相信大家在平時使用的時候豁辉,遇到問題都通過搜索引擎來解決,有些小伙伴可定會想,"作為一個Android開發(fā)者搪锣,我沒有必要去詳細的了解Gradle到底去這么使用秋忙,平時開發(fā)任務本來就比較重,哪里有時間有精力來學習呢
" 但是個人覺得對Gradle的了解构舟,對于我們平時開發(fā)項目有很重要的幫助灰追。
Java項目的構建
要知道Gradle是什么以及其作用堵幽。我們需要從整個Java項目的構建說起,看下圖:
從上圖中我們可以看出在平時Java項目的構建流程弹澎,或多或少我們會涉及以下操作:
- 通過
javac
命令將一些Java源文件編譯為class文件朴下。 - 將類文件和資源文件(圖像和字符串的資源)壓縮為Jar包。
- 通過
javadoc
命令提取Java源文件的中的注釋苦蒿。生成文檔殴胧。 - 運行一些單元測試,或程序驗收測試佩迟。
- 將Jar文件部署到資源庫中团滥。
既然Java項目的構建會經歷以上或更多的步驟,那么我們接下來看看Android項目的構建流程报强。
Android項目的構建
對于Android項目的構建灸姊,主要會經歷和解決下面這些問題:
- Android對于Java源文件
并未按照標準Java字節(jié)碼編譯
,但可為Android運行時自定義字節(jié)碼秉溉。 - Android具有三種資源類型(R.java力惯、Application source code、JavaInterfaces)召嘶,且按照不同的方式打包父晶。
- 還有一個難題就是你定義的資源需要與所包括的資源庫中的資源進行匯集,在編譯其他任何程序之前弄跌,需要知道所有這些資源的識別符甲喝。
- Android應用多數情況下會對應用進行加密。
那么匯集所有的資源以及情況后铛只,整個Android的構建流程看起來是這個樣子:
為了方便大家理解這里對其中主要的構建過程進行描述(上圖中綠色橢圓部分
):
- aapt:aapt(Android Asset Packaging Tool)工具會打包應用中的資源文件俺猿,如AndroidManifest.xml、layout布局中的xml等格仲,并將xml文件編譯為二進制形式,當然assets文件夾中的文件不會被編譯诵冒,圖片及raw文件夾中的資源也會保持原來的形態(tài)凯肋,(
需要注意的是raw文件夾中的資源也會生成資源id。AAPT編譯完成之后會生成R.java文件
)汽馋。 - aidl:AIDL工具會將所有的aidl接口轉化為java接口侮东。
- Java Compiler(Java編譯器):當AAPT與AIDL工具將需要處理的數據處理好后,Java 編譯器會將所有的java代碼豹芯,包括R.java與aidl文件編譯成
.class文件
悄雅。 - dex:dex工具會將上述產生的.class文件及第三庫及其他.class文件編譯成
.dex文件
(dex文件是Dalvik虛擬機可以執(zhí)行的格式),dex文件最終會被打包進APK文件铁蹈。 - apkbuilder:apkbuilder工具會將編譯過的資源及未編譯過的資源(如圖片等)以及.dex文件打包成APK文件宽闲。
- Jarsingner:生成APK文件后,需要對其簽名才可安裝到設備,平時測試時會使用debug keystore容诬,當正式發(fā)布應用時必須使用release版的keystore對應用進行簽名娩梨。Jarsigner工具會根據相應的keystore生成相應的簽名APK文件。
- zipalign(release mode):zipalign工具览徒,它能夠對打包的應用程序進行優(yōu)化狈定。在你的應用程序上運行zipalign,使得在運行時Android與應用程序間的交互更加有效率习蓬。
在Android中纽什,每個應用程序中儲存的數據文件都會被多個進程訪問:安裝程序會讀取應用程序的manifest文件來處理與之相關的權限問題;Home應用程序會讀取資源文件來獲取應用程序的名和圖標躲叼;系統服務會因為很多種原因讀取資源(例如芦缰,顯示應用程序的Notification)。此外押赊,就是應用程序自身用到的資源文件饺藤。
在Android中,當資源文件通過內存映射對齊到4字節(jié)邊界時流礁,訪問資源文件的代碼才是有效率的涕俗。但是,如果資源本身沒有進行對齊處理(未使用zipalign工具)神帅,它就必須回到老路上再姑,顯式地讀取它們——這個過程將會比較緩慢且會花費額外的內存。
從整個Android項目的構建來看找御,我們會感嘆“為啥我就簡單的創(chuàng)建一個應用元镀,為毛有非常多的事情需要做■Γ”栖疑,所以為了方便處理這些,我們都會想是不是可以寫一個能自動處理這些過程的程序化腳本呢滔驶?所以Gradle出現了S龈铩!=腋狻萝快!
。
為毛選擇Gradle著角?
對于以前傳統的項目構建工具揪漩,只是編譯和打包源代碼。而現在項目的構建需要負責更多的工作吏口,它們會運行測試奄容、從多個來源購買編碼資源冰更、生成文檔、創(chuàng)建多個構建變種嫩海、發(fā)布應用程序和管理依賴性冬殃。而Gradle不僅具備這些能力與功能,還解決了Android開發(fā)人員面臨的一些最棘手的問題叁怪,如下所示:
- 如何自動構建和測試應用审葬,以快速實現生產力?
- 如何管理依賴和變種奕谭。使專業(yè)開發(fā)人員只需要單擊一次就能提取出其應用的數十個變種涣觉?
- 如何構建處理及處理非常大的應用?
- ...
哎呀說這么多血柳,其實最大的原因是Google爸爸已經選擇Gradle做為Android Studio的構建系統
官册,在Android Studio中將Android應用的整個流程指派給了Gradle。當我們點擊運行
按鈕時难捌,Android studio會在運行過程中設置Gradle膝宁,并在后臺監(jiān)控。通過學習有關Gradle知識根吁。我們可以擴展此默認行為员淫。以構建能力更強且經過適當測試的應用。
既然Gradle大法這么好击敌,為毛我們不去學習呢介返?
總結
Gradle是項目的構建工具,解決了我們平時開發(fā)中沃斤,項目測試圣蝎、項目打包、項目依賴等問題衡瓶。
最后
Gradle系列會繼續(xù)寫徘公。如果大家喜歡我的寫作風格的話。歡迎大家點贊哮针。
最后步淹,附上我寫的一個基于Kotlin 仿開眼的項目SimpleEyes(ps: 其實在我之前,已經有很多小朋友開始仿這款應用了诚撵,但是我覺得要做就做好。所以我的項目和其他的人應該不同键闺,不僅僅是簡單的一個應用寿烟。但是,但是辛燥。但是筛武。重要的話說三遍缝其。還在開發(fā)階段,不要打我)徘六,歡迎大家follow和start