原文鏈接:
http://www.reibang.com/p/0e680428a745
http://www.reibang.com/p/c7983274c510
1帚称、Gradle
項目的構(gòu)建工具,管理一個項目的依賴架包,性質(zhì)和maven相似
一個基于groovy的項目打包工具能復(fù)用很多的打包過程(tasks)有一個中央倉庫能找到你打包過程中需要依賴的庫淮韭,并且聲明使用很簡單
2垄琐、Gradle wrapper
用于統(tǒng)一項目所使用的gradle版本,保證了所有開發(fā)人員在該項目使用同一個版本的編譯工具進行編譯(統(tǒng)一項目所使用的gradle版本)
在android studio中,選中你的項目征讲,切換到project files視圖,在項目根目錄下就能看到gradle/wrapper/gradle-wrapper.properties 文件橡娄,配置大體如下:
#Mon Dec 28 10:00:20 PST 2015
#規(guī)定了解壓后的gradle包放在哪里
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#規(guī)定了gradle的zip包放在哪里
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#規(guī)定了使用哪個版本的gradle編譯項目诗箍,這個地址可以配置成服務(wù)器地址或者本地地址
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
根據(jù)此配置Gradle Wrapper會自動為我們下載合適的Gradle版本。默認情況下挽唉,下載位置是在$USER_HOME/.gradle/wrapper/dists滤祖,如果設(shè)置了GRADLE_USER_HOME環(huán)境變量,那么就會下載到GRADLE_USER_HOME/wrapper/dists下.
3瓶籽、Gradle plugin
Gradle plugin 匠童,俗稱gradle插件,是android studio為了方便使用gradle進行配置和編譯而開發(fā)的插件塑顺,它跟隨gradle版本的變遷而變遷.
在android studio中汤求,項目的根目錄下的build.gradle中會配置如下代碼:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
這個dependencies中的gradle:2.1.0代表的就是使用gradle 插件版本 2.1.0. 在編譯過程中,如果gradle插件版本與gradle版本不匹配严拒,編譯就會失敗.
目前在使用的gradle與gradle插件版本的對應(yīng)關(guān)系如下
Gradle plugin的版本通常隨Android Studio的安裝包扬绪,目錄位置在
/Applications/Android\ Studio.app/Contents/gradle/m2repository/com/android/tools/build/gradle
4、gradlew
gradlew: W意思是wrapper糙俗,它是一個用bash命令包裝過的gradle編譯啟動腳本勒奇,里面會進行環(huán)境變量檢測和設(shè)置,最終進行編譯的還是gradle.常見命令如:gradlew -v
查看當(dāng)前項目下gradle版本
在工程目錄下執(zhí)行
gradlew build --info
巧骚,即可編譯工程赊颠。Android Studio對gradle配置問題錯誤輸出不明顯,用這種方式能看到具體的出錯原因劈彪。
報錯信息
分析:
“Gradle version 2.2 is required. Current version is 2.10.try editing the distributionUrlin/MyApplication/gradle/wrapper/gradle-wrapper.properties to gradle-2.2-all.zip.”
這到底是啥意思呢竣蹦?
簡單解釋一下:“根據(jù)你的AS的Gradle插件版本,與你匹配的Gradle版本是2.2沧奴,但是你當(dāng)前的Gradle版本是2.10.請嘗試將Gradle系統(tǒng)版本改為gradle-2.2-all.zip”
先理清下Gradle版本的概念:
Gradle version: Gradle是一種自動化建構(gòu)工具(例如Ant 痘括、Maeven也是構(gòu)建工具),Gradle version就是指這種構(gòu)建工具的版本號滔吠「倬可以在你項目根目錄的gradle/wrapper/gradle-wrapper.properties里指定。指定后AS會自動去下載或者你也可以去Gradle官網(wǎng)下載相應(yīng)的版本放到/Users/你的用戶名/.gradle/wrapper/dists目錄下
Android Plugin Version : 是指你Android Studio里的gradle插件版本疮绷。在你項目根目錄下的build.gradle文件中的dependencies節(jié)點下設(shè)置翰舌。
Paste_Image.png
而我的AS Gradle插件版本我設(shè)置的是1.2.3,Gradle構(gòu)建工具的版本是2.10.Android Plugin Version和Gradle version是有對應(yīng)關(guān)系的冬骚,Plugin版本太低了椅贱,所以gradle 2.10是不支持 1.2.3版本的plugin懂算。
三種解決方案:
一 根據(jù)報錯信息里建議的:降低 Gradle版本到2.2
下載gradle-2.2-all.zip如果讓 AS自動去下載 gradle-2.2-all.zip實在是太慢了!所以將https://services.gradle.org/distributions/gradle-2.2-all.zip 這個網(wǎng)址拖到迅雷把它下載好庇麦,然后放到/Users/你的用戶名/.gradle/wrapper/dists目錄下
-
進入AS的設(shè)置中计技,設(shè)置使用默認的gradle wrapper來管理gradle
Paste_Image.png
-
進入項目根目錄的gradle/wrapper/gradle-wrapper.properties里
Paste_Image.png
修改為
distributionUrl=https://services.gradle.org/distributions/gradle-2.2-all.zip
- 選擇 File—>invalidate and restart
-
耐心等待一會
Paste_Image.png
發(fā)現(xiàn)會彈框提醒你升級 插件版本Android Gradle Plugin
Paste_Image.png
先忽略。然后就可以運行程序了山橄。
修改后各版本匹配關(guān)系:
Android Studio版本是 2.1
Plugin version 是 1.2.3
Gradle version是 2.2
二 提高 plugin 版本
- 修改根目錄下 build.gradle文件中的plug 版本垮媒,改為>=1.5.0:classpath 'com.android.tools.build:gradle:1.5.0’或者2.0.0或2.1.0
- 修改gradle wrapper中的
distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip
3 .這時候不要點擊Sync Now
4 .選擇 File—>invalidate and restart
讓它加載1分鐘左右就好了。
修改后各版本匹配關(guān)系:
Android Studio版本是 2.1
plugin version 是 >=1.5.0
gradle version是 2.10
三 靈活配置
比如我們團隊用的版本是:plugin1.2.3 , gradle構(gòu)建工具2.4為了保持一致驾胆,所以我又不得不
- 下載gradle-2.4-all.zip扔到/Users/你的用戶名/.gradle/wrapper/dists/目錄下
- 修改gradle wrapper.properties 文件涣澡,將url改為gradle-2.4-all.zip
- File—> invalidate and restart
- 進入AS的設(shè)置中,設(shè)置use default gradle wrapper來管理gradle
修改后各版本匹配關(guān)系:
Android Studio版本是 2.1
plugin version 是 1.2.3
gradle version是 2.4
重新打開項目丧诺,出現(xiàn)
Error:null value in entry: incrementalFolder=null
或者
Could not create service of type CachingFileHasher using TaskExecutionServices.createFileSnapshotter().
解決方法:
- 刪除 .gradle 目錄
- 重啟 Android Studio
換了新手機,app安裝不上或一運行就crash
關(guān)掉Instant Run
gradle vs gradlew
gradlew是gradle的包裝器奄薇,它的主要用處是保證編譯環(huán)境一致驳阎。
不同人電腦安裝了不同Android Studio,gradlew必要時會去網(wǎng)絡(luò)下載所需要的gradle版本馁蒂。
Suggestion: use tools:overrideLibrary="android.support.v17.leanback" to force usage
在manifest中添加呵晚,不要忘了也要包含xmlns:tools="http://schemas.android.com/tools"
編譯太慢
Gradle編譯特別慢,一直在 resolve dependency
一般是Android Studio升級后沫屡,沒有找到相應(yīng)的gradle版本饵隙。鑒于國內(nèi)的網(wǎng)絡(luò)環(huán)境,下載過程會非常長沮脖〗鹈可以嘗試用本地離線模式
離線模式需要曾經(jīng)編譯成功過的,才能使用
Gradle sync failed: Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-3.3-all.zip’
gradle下載不下來勺届,建議用本地gradle驶俊。將https://services.gradle.org/distributions/gradle-3.3-all.zip下載,解壓免姿,設(shè)置gradle home為解壓目錄(有bin的那個就是)
更改后饼酿,如果還是很慢,需要檢查一下 gradle plugin 版本是否對應(yīng)胚膊。