題外話:其實本來不想取這個名字的,但是感覺不取這個名字感覺沒有幾個人看啊。大家肯定覺得這個名字比較高大上吧!哈哈哈哈。好了,收。
前言
在平時Android開發中我們常常使用Gradle來構建我們的專案,我相信大家都可能遇到以下問題:
- 開啟專案提示介面一直顯示Gradle Build Running
- Gradle傳遞性依賴衝突
- 多渠道打包
- .....等
相信大家在平時使用的時候,遇到問題都通過搜尋引擎來解決,有些小夥伴可定會想,"作為一個Android開發者,我沒有必要去詳細的瞭解Gradle到底去這麼使用,平時開發任務本來就比較重,哪裡有時間有精力來學習呢
" 但是個人覺得對Gradle的瞭解,對於我們平時開發專案有很重要的幫助。
Java專案的構建
要知道Gradle是什麼以及其作用。我們需要從整個Java專案的構建說起,看下圖:
從上圖中我們可以看出在平時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的構建流程看起來是這個樣子:
為了方便大家理解這裡對其中主要的構建過程進行描述(上圖中綠色橢圓部分
):
- 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