Gradle系列-引導篇(一)

gradle.png

題外話:其實原本不想取這個名字的,可是感受不取這個名字感受沒有幾我的看啊。你們確定以爲這個名字比較高大上吧!哈哈哈哈。好了,收。java

前言

在平時Android開發中咱們經常使用Gradle來構建咱們的項目,我相信你們均可能遇到如下問題:git

  • 開啓項目提示界面一直顯示Gradle Build Running
  • Gradle傳遞性依賴衝突
  • 多渠道打包
  • .....等

相信你們在平時使用的時候,遇到問題都經過搜索引擎來解決,有些小夥伴可定會想,"做爲一個Android開發者,我沒有必要去詳細的瞭解Gradle到底去這麼使用,平時開發任務原本就比較重,哪裏有時間有精力來學習呢" 可是我的以爲對Gradle的瞭解,對於咱們平時開發項目有很重要的幫助。github

Java項目的構建

要知道Gradle是什麼以及其做用。咱們須要從整個Java項目的構建提及,看下圖: 工具

gradle-java-builds.png

從上圖中咱們能夠看出在平時Java項目的構建流程,或多或少咱們會涉及如下操做:佈局

  • 經過javac命令將一些Java源文件編譯爲class文件。
  • 將類文件和資源文件(圖像和字符串的資源)壓縮爲Jar包。
  • 經過javadoc命令提取Java源文件的中的註釋。生成文檔。
  • 運行一些單元測試,或程序驗收測試。
  • 將Jar文件部署到資源庫中。

既然Java項目的構建會經歷以上或更多的步驟,那麼咱們接下來看看Android項目的構建流程。單元測試

Android項目的構建

對於Android項目的構建,主要會經歷和解決下面這些問題:學習

  • Android對於Java源文件並未按照標準Java字節碼編譯,但可爲Android運行時自定義字節碼。
  • Android具備三種資源類型(R.java、Application source code、JavaInterfaces),且按照不一樣的方式打包。
  • 還有一個難題就是你定義的資源須要與所包括的資源庫中的資源進行聚集,在編譯其餘任何程序以前,須要知道全部這些資源的識別符。
  • Android應用多數狀況下會對應用進行加密。

那麼聚集全部的資源以及狀況後,整個Android的構建流程看起來是這個樣子:測試

Android構建流程圖.png

爲了方便你們理解這裏對其中主要的構建過程進行描述(上圖中綠色橢圓部分):gradle

  • aapt:aapt(Android Asset Packaging Tool)工具會打包應用中的資源文件,如AndroidManifest.xml、layout佈局中的xml等,並將xml文件編譯爲二進制形式,固然assets文件夾中的文件不會被編譯,圖片及raw文件夾中的資源也會保持原來的形態,(須要注意的是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虛擬機能夠執行的格式),dex文件最終會被打包進APK文件。
  • apkbuilder:apkbuilder工具會將編譯過的資源及未編譯過的資源(如圖片等)以及.dex文件打包成APK文件。
  • Jarsingner:生成APK文件後,須要對其簽名纔可安裝到設備,平時測試時會使用debug keystore,當正式發佈應用時必須使用release版的keystore對應用進行簽名。Jarsigner工具會根據相應的keystore生成相應的簽名APK文件。
  • zipalign(release mode):zipalign工具,它可以對打包的應用程序進行優化。在你的應用程序上運行zipalign,使得在運行時Android與應用程序間的交互更加有效率。

在Android中,每一個應用程序中儲存的數據文件都會被多個進程訪問:安裝程序會讀取應用程序的manifest文件來處理與之相關的權限問題;Home應用程序會讀取資源文件來獲取應用程序的名和圖標;系統服務會由於不少種緣由讀取資源(例如,顯示應用程序的Notification)。此外,就是應用程序自身用到的資源文件。 在Android中,當資源文件經過內存映射對齊到4字節邊界時,訪問資源文件的代碼纔是有效率的。可是,若是資源自己沒有進行對齊處理(未使用zipalign工具),它就必須回到老路上,顯式地讀取它們——這個過程將會比較緩慢且會花費額外的內存。優化

從整個Android項目的構建來看,咱們會感嘆「爲啥我就簡單的建立一個應用,爲毛有很是多的事情須要作。」,因此爲了方便處理這些,咱們都會想是否是能夠寫一個能自動處理這些過程的程序化腳本呢?因此Gradle出現了!!!!

爲毛選擇Gradle?

對於之前傳統的項目構建工具,只是編譯和打包源代碼。而如今項目的構建須要負責更多的工做,它們會運行測試、從多個來源購買編碼資源、生成文檔、建立多個構建變種、發佈應用程序和管理依賴性。而Gradle不只具有這些能力與功能,還解決了Android開發人員面臨的一些最棘手的問題,以下所示:

  • 如何自動構建和測試應用,以快速實現生產力?
  • 如何管理依賴和變種。使專業開發人員只須要單擊一次就能提取出其應用的數十個變種?
  • 如何構建處理及處理很是大的應用?
  • ...

哎呀說這麼多,其實最大的緣由是Google爸爸已經選擇Gradle作爲Android Studio的構建系統,在Android Studio中將Android應用的整個流程指派給了Gradle。當咱們點擊運行按鈕時,Android studio會在運行過程當中設置Gradle,並在後臺監控。經過學習有關Gradle知識。咱們能夠擴展此默認行爲。以構建能力更強且通過適當測試的應用。

既然Gradle大法這麼好,爲毛咱們不去學習呢?

總結

Gradle是項目的構建工具,解決了咱們平時開發中,項目測試、項目打包、項目依賴等問題。

最後

Gradle系列會繼續寫。若是你們喜歡個人寫做風格的話。歡迎你們點贊。

最後,附上我寫的一個基於Kotlin 仿開眼的項目SimpleEyes(ps: 其實在我以前,已經有不少小朋友開始仿這款應用了,可是我以爲要作就作好。因此個人項目和其餘的人應該不一樣,不只僅是簡單的一個應用。可是,可是。可是。重要的話說三遍。還在開發階段,不要打我),歡迎你們follow和start

相關文章
相關標籤/搜索