給Android初學(xué)者的Gradle知識(shí)普及
Gradle build android 歷史
Android Tools 主頁(yè) ,大概是2016年2月份發(fā)布 adt21.1 的時(shí)候,忽然在主頁(yè)發(fā)現(xiàn)了New Build System 原來(lái)是可以用gradle 來(lái)構(gòu)建android項(xiàng)目,至于gradle是什么(既然點(diǎn)擊進(jìn)來(lái)看了應(yīng)該都知道了吧。)。然后,又看了一下RoadMap 那時(shí)候,還并不支持Proguard 打包,于是就沒(méi)看了。
android studio 發(fā)布,終于gradle 0.4 也跟著出來(lái)了,于是,先把gradle 學(xué)了一遍,然后把Gradle Plugin User Guide也認(rèn)真閱讀了一下,根據(jù)我的個(gè)人體驗(yàn),如果你對(duì)gradle 毫無(wú)了解就去看Gradle Plugin User Guide 可能很多地方都一頭霧水,但是并不妨礙你用gradle 打包android 應(yīng)用,只是,出現(xiàn)問(wèn)題,你就可能很頭疼。不過(guò),本文就是讓不會(huì)gradle 也能用上 gradle 打包android 程序
順便貼上官方為什么使用gradle 的理由
Domain Specific Language (DSL) to describe and manipulate the build logic
Build files are Groovy based and allow mixing of declarative elements through the DSL and using code to manipulate the DSL elements to provide custom logic.
Built-in dependency management through Maven and/or Ivy.
Very flexible. Allows using best practices but doesn't force its own way of doing things.
Plugins can expose their own DSL and their own API for build files to use.
Good Tooling API allowing IDE integration
1. 前言
剛學(xué) Android 不久,對(duì) Gradle 不懂,看了很多資料依然一知半解,我覺(jué)得這個(gè)主題可能對(duì)很多讀者也都很有幫助,所以我在整理的筆記的基礎(chǔ)上做了點(diǎn)補(bǔ)充與改進(jìn),希望這篇文章對(duì)你們有幫助!
2. 什么是構(gòu)建工具?
我們大家都知道 Gradle 是一種構(gòu)建工具,那么什么是構(gòu)建工具呢?
網(wǎng)上一大堆的文字解釋我覺(jué)得很難理解,這里我以咱們 Android 開(kāi)發(fā)來(lái)舉個(gè)例子吧。
我們以前開(kāi)發(fā)都是用 Eclipse ,而 Eclipse 大家都知道是一種 IDE (集成開(kāi)發(fā)環(huán)境),最初是用來(lái)做 Java 開(kāi)發(fā)的,而 Android 是基于 Java 語(yǔ)言的,所以最初 Google 還是希望 Android 能在 Eclipse 上進(jìn)行開(kāi)發(fā),為了滿足這個(gè)需求,Google 開(kāi)發(fā)了一個(gè)叫 ADT (Android Developer Tools)的東西,相信以前從 Eclipse 時(shí)代過(guò)來(lái)的對(duì) ADT 應(yīng)該都不陌生,正是因?yàn)橛辛?ADT ,從此我們只需要碼好代碼,然后直接在 Eclipse 上進(jìn)行編譯、運(yùn)行、簽名、打包等一系列流程,而這背后的工作都是 ADT 的功勞。某種意義上 ADT 就是我們的構(gòu)建工具。
而自 Google 推出 Android Studio 以來(lái),就宣布默認(rèn)使用 Gradle 來(lái)作為構(gòu)建工具,并且之后放棄更新 ADT ,從此 Gradle 走入 Android 開(kāi)發(fā)者的視野,而我也是在 AS 的 Beta 版開(kāi)始接觸并學(xué)習(xí) Gradle。
一般來(lái)說(shuō),構(gòu)建工具除了以上提到的編譯、運(yùn)行、簽名、打包等,還具備依賴(lài)管理的功能,什么是依賴(lài)管理呢?還是拿 Eclipse 來(lái)說(shuō),我們以前在 Eclipse 上開(kāi)發(fā) Android ,如果需要用到第三方庫(kù)的時(shí)候一般都是先下載 jar 文件,然后把 jar 文件添加到 libs 目錄,然后項(xiàng)目中就可以引用了。但是你不覺(jué)得這種管理方式很麻煩么?假設(shè)第三方庫(kù)有更新,需要下載最新的 Jar 文件,然后替換掉原來(lái)的,引用的庫(kù)少還好,一旦引用的第三方庫(kù)多,那簡(jiǎn)直麻煩死,可以說(shuō)這種方式只有依賴(lài),而沒(méi)有管理。
現(xiàn)在大家不陌生的 Gradle 引用第三方庫(kù)方式是這樣的:
compile 'com.android.support:support-v4:24.0.1'
類(lèi)似這樣的依賴(lài)方式,是不是很方便?而且很直觀,直接可以看到源地址,升級(jí)的話直接改下版本號(hào)就可以了,這就是所謂的依賴(lài)管理。
所以構(gòu)建工具就是對(duì)你的項(xiàng)目進(jìn)行編譯、運(yùn)行、簽名、打包、依賴(lài)管理等一系列功能的合集,傳統(tǒng)的構(gòu)建工具有 Make、Ant、Maven、Ivy等,而 Gradle 是新一代的自動(dòng)化構(gòu)建工具。
3. 什么是 Gradle ?
上面說(shuō)了,Gradle 是新一代的自動(dòng)化構(gòu)建工具,它是一個(gè)獨(dú)立的項(xiàng)目,跟 AS、Android 無(wú)關(guān),官方網(wǎng)站:https://gradle.org/ , 類(lèi)似 Ant、Maven這類(lèi)構(gòu)建工具都是基于 xml 來(lái)進(jìn)行描述的,很臃腫,而 Gradle 采用的是一種叫做 Groovy 的語(yǔ)言,語(yǔ)法跟 Java 語(yǔ)法很像,但是是一種動(dòng)態(tài)語(yǔ)言,而且在 Java 基礎(chǔ)上做了不少改進(jìn),用起來(lái)更加簡(jiǎn)潔、靈活,而且 Gradle 完全兼容 Maven、Ivy,這點(diǎn)基本上宣布了 Maven、Ivy 可以被拋棄了,Gradle 的推出主要以 Java 應(yīng)用為主,當(dāng)然目前還支持 Android、C、C++。
4. Gradle 與 Android Studio 的關(guān)系
上面也提到,Gradle 跟 Android Studio 其實(shí)沒(méi)有關(guān)系,但是 Gradle 官方還是很看重 Android 開(kāi)發(fā)的,Google 在推出 AS 的時(shí)候選中了 Gradle 作為構(gòu)建工具,為了支持 Gradle 能在 AS 上使用,Google 做了個(gè) AS 的插件叫 Android Gradle Plugin ,所以我們能在 AS 上使用 Gradle 完全是因?yàn)檫@個(gè)插件的原因。在項(xiàng)目的根目錄有個(gè) build.gradle 文件,里面有這么一句代碼:
classpath 'com.android.tools.build:gradle:2.1.2'
這個(gè)就是依賴(lài) gradle 插件的代碼,后面的版本號(hào)代表的是 android gradle plugin 的版本,而不是 Gradle 的版本,這個(gè)是 Google 定的,跟 Gradle 官方?jīng)]關(guān)系。關(guān)于 android gradle plugin 的更多信息可以到這里查看,這里列舉了 android gradle plugin 每個(gè)版本的具體變化與具體功能:
http://tools.android.com/tech-docs/new-build-system
友情提示,需要科學(xué)上網(wǎng)!
5. Gradle Wrapper
現(xiàn)在默認(rèn)新建一個(gè)項(xiàng)目,然后點(diǎn)擊 AS 上的運(yùn)行,默認(rèn)就會(huì)直接幫你安裝 Gradle ,我們不需要額外的安裝 Gradle 了,但是其實(shí)這個(gè) Gradle 不是真正的 Gradle ,他叫 Gradle Wrapper ,意為 Gradle 的包裝,什么意思呢?假設(shè)我們本地有多個(gè)項(xiàng)目,一個(gè)是比較老的項(xiàng)目,還用著 Gradle 1.0 的版本,一個(gè)是比較新的項(xiàng)目用了 Gradle 2.0 的版本,但是你兩個(gè)項(xiàng)目肯定都想要同時(shí)運(yùn)行的,如果你只裝了 Gradle 1.0 的話那肯定不行,所以為了解決這個(gè)問(wèn)題,Google 推出了 Gradle Wrapper 的概念,就是他在你每個(gè)項(xiàng)目都配置了一個(gè)指定版本的 Gradle ,你可以理解為每個(gè) Android 項(xiàng)目本地都有一個(gè)小型的 Gradle ,通過(guò)這個(gè)每個(gè)項(xiàng)目你可以支持用不同的 Gradle 版本來(lái)構(gòu)建項(xiàng)目。
理解了 Gradle Wrapper 的概念就好辦了,以下的所有操作都是基于 Gradle Wrapper 的。
默認(rèn)我們?cè)?AS 上第一次創(chuàng)建項(xiàng)目會(huì)自動(dòng)下載 Gradle 的,這個(gè)過(guò)程很漫長(zhǎng),出奇的慢,但是第一次之后就ok了,接下來(lái)就是教大家用命令行測(cè)試下,請(qǐng)大家在終端或者 AS 帶的終端上切換到所在項(xiàng)目的目錄,然后輸入 ./gradlew -v (win用戶(hù)直接輸入 gradlew -v) ,即可以查看當(dāng)前項(xiàng)目所用的 gradle 的版本,gradlew 即為 gradle wrapper 的縮寫(xiě),如果你是第一次執(zhí)行命令行,那么會(huì)出現(xiàn)一個(gè)下載的提示,緊接著會(huì)打印一個(gè)個(gè)的點(diǎn),這個(gè)過(guò)程很漫長(zhǎng),依賴(lài)你的網(wǎng)速,時(shí)間幾分鐘到幾十分鐘不等。
有人有疑問(wèn),我 AS 上明明已經(jīng)可以正常運(yùn)行該項(xiàng)目的,說(shuō)明 Gradle 已經(jīng)下載過(guò)了,為什么命令行還要再下載一次?我也一直有這個(gè)疑問(wèn),理論上是不該再下載的,但是事實(shí)他就是要重新下載一次,我猜測(cè)可能是bug吧。
如果下載完成輸入 ./gradlew -v 出現(xiàn)如下結(jié)果,證明你的項(xiàng)目是ok的,否則就是你的項(xiàng)目配置有問(wèn)題了。
6. Android 項(xiàng)目包含的 Gradle 配置文件
這里姑且以我很早在 GitHub 開(kāi)源的 9GAG 項(xiàng)目為例,來(lái)稍微介紹下一個(gè)完整的 Android 項(xiàng)目包含的基本 Gradle 相關(guān)的配置文件:
咱們來(lái)一步步分析:
9GAG/app/build.gradle
這個(gè)文件是 app 文件夾下這個(gè) Module 的 gradle 配置文件,也可以算是整個(gè)項(xiàng)目最主要的 gradle 配置文件,具體里面的配置以后再介紹。
9GAG/extras/ShimmerAndroid/build.gradle
每一個(gè) Module 都需要有一個(gè) gradle 配置文件,語(yǔ)法都是一樣,唯一不同的是開(kāi)頭聲明的是
apply plugin: ‘com.android.library'
9GAG/gradle
這個(gè)目錄下有個(gè) wrapper 文件夾,里面可以看到有兩個(gè)文件,我們主要看下 gradle-wrapper.properties 這個(gè)文件的內(nèi)容:
可以看到里面聲明了 gradle 的目錄與下載路徑以及當(dāng)前項(xiàng)目使用的 gradle 版本,這些默認(rèn)的路徑我們一般不會(huì)更改的,這個(gè)文件里指明的 gradle 版本不對(duì)也是很多導(dǎo)包不成功的原因之一。
9GAG/build.gradle
這個(gè)文件是整個(gè)項(xiàng)目的 gradle 基礎(chǔ)配置文件,默認(rèn)的內(nèi)容就是聲明了 android gradle plugin 的版本。
9GAG/settings.gradle
這個(gè)文件是全局的項(xiàng)目配置文件,里面主要聲明一些需要加入 gradle 的 module,我們來(lái)看看 9GAG 該文件的內(nèi)容:
7. 如何正確導(dǎo)入下載的開(kāi)源項(xiàng)目?
我們經(jīng)常會(huì)在 GitHub 發(fā)現(xiàn)一些優(yōu)秀的開(kāi)源項(xiàng)目,然后想要下載學(xué)習(xí),然而第一步一般都是把源碼導(dǎo)入到 AS 里,然后運(yùn)行起來(lái)看下效果,但是經(jīng)常會(huì)運(yùn)行失敗,這里我來(lái)給大家說(shuō)下導(dǎo)入開(kāi)源項(xiàng)目的正確姿勢(shì):
下載一個(gè)Demo,先打開(kāi)每個(gè) module下的 gradle 文件,即 app 目錄下的 build.gradle 以及各個(gè) library 下的 build.gradle ,首先查看 compileSdkVersion 和 buildToolsVersion,因?yàn)橛行r(shí)候你本地的版本和下載的版本不一致,那么就會(huì)導(dǎo)致失敗。
然后就是檢查 gradle-wrapper ,Google 有些時(shí)候要求不同的 AS 支持不同的 gradle 版本。比如 AS 1.0 的時(shí)候要求必須使用 gradle 1.x 的版本,等到 AS 2.0 的時(shí)候,Google 不支持 gradle1.x 的版本,這個(gè)時(shí)候你必須手動(dòng)更新下 android gradle plugin 的版本,然后重新同步下。
檢查以上兩個(gè)地方基本就可以導(dǎo)入并運(yùn)行了,如果還有其他問(wèn)題,那可能就是環(huán)境或者項(xiàng)目本身的問(wèn)題了。
8. 認(rèn)識(shí)下幾個(gè)命令
上面提到了,假設(shè)我們沒(méi)有 IDE ,只有類(lèi)似 Sublime、Atom、Vim這種輕量編輯器怎么辦?那我們就沒(méi)法開(kāi)發(fā) Android 了么?然而只要有構(gòu)建工具,不需要 IDE 我們一樣有辦法開(kāi)發(fā),這個(gè)時(shí)候我們就需要用到幾個(gè)有用的 Gradle 命令了:
./gradlew -v 版本號(hào)
./gradlew clean 清除9GAG/app目錄下的build文件夾
./gradlew build 檢查依賴(lài)并編譯打包
這里注意的是 ./gradlew build 命令把 debug、release 環(huán)境的包都打出來(lái),如果正式發(fā)布只需要打 Release 的包,該怎么辦呢,下面介紹一個(gè)很有用的命令 assemble , 如
./gradlew assembleDebug 編譯并打Debug包
./gradlew assembleRelease 編譯并打Release的包
值得注意的是,以上所有命令都是在終端里執(zhí)行,并且必須要切換到所在項(xiàng)目的根目錄下執(zhí)行,win系統(tǒng)直接執(zhí)行 gradlew 。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- spring boot使用sonarqube來(lái)檢查技術(shù)債務(wù)
- 使用Sonarqube掃描Javascript代碼的示例
- Android Studio Gradle插件版本與Gradle版本之間的對(duì)應(yīng)關(guān)系
- Spring Boot配置Thymeleaf(gradle)的簡(jiǎn)單使用
- Spring Boot使用Thymeleaf + Gradle構(gòu)建war到Tomcat
- Android中的build.gradle文件深入講解
- 優(yōu)化Gradle提升Gradle編譯速度
- 關(guān)于gradle你應(yīng)該知道的一些小事
- Android gradle插件打印時(shí)間戳的方法詳解
- Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法
相關(guān)文章
Android實(shí)現(xiàn)仿通訊錄側(cè)邊欄滑動(dòng)SiderBar效果代碼
這篇文章主要介紹了Android實(shí)現(xiàn)仿通訊錄側(cè)邊欄滑動(dòng)SiderBar效果代碼,實(shí)例分析了通訊錄側(cè)邊欄滑動(dòng)效果的實(shí)現(xiàn)技巧,并附帶完整實(shí)例代碼供讀者下載參考,需要的朋友可以參考下2015-10-10Android SDK Manager更新、下載速度慢問(wèn)題解決辦法
這篇文章主要介紹了Android SDK Manager更新、下載速度慢問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05基于Flutter實(shí)現(xiàn)按位置大小比例布局的控件
做視頻監(jiān)控項(xiàng)目時(shí)需要需要展示多分屏,比如2x2、3x3、414等等,所以本文為大家介紹了如何基于Flutter實(shí)現(xiàn)按位置大小比例布局的控件,需要的可以參考一下2023-08-08Android WebView打開(kāi)網(wǎng)頁(yè)一片空白的解決方法
這篇文章主要介紹了Android WebView打開(kāi)網(wǎng)頁(yè)一片空白的解決方法,試了很多方法,最后記錄一下,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12安卓應(yīng)用開(kāi)發(fā)通過(guò)java調(diào)用c++ jni的圖文使用方法
這篇文章主要介紹了2013-11-11Android studio 自動(dòng)換行和取消自動(dòng)換行操作
這篇文章主要介紹了Android studio 自動(dòng)換行和取消自動(dòng)換行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04使用Fragment來(lái)處理Andoird app的UI布局的實(shí)例分享
這篇文章主要介紹了使用Fragment來(lái)處理Andoird appUI布局的實(shí)例分享,Fragment的出現(xiàn)緩解了代碼依賴(lài)于Activity而造成的臃腫狀況,需要的朋友可以參考下2016-02-02