[TOC]
介紹
Gradle 是google開發(fā)的基于groovy語言 妄迁,用于代替 ant 構(gòu)建的一種配置型語言
Gradle 是基于groovy語言實現(xiàn)(基于JVM的語法和java類似的腳本語言)的一個Android編譯系統(tǒng)庆揪, google針對Android編譯用groovy語言開發(fā)了一套 DSL 語言
有額外需要直接使用groovy怔接,或者java代碼解決
gradle wrapper
每個基于gradle構(gòu)建的工程都有一個gradle本地代理师幕,叫做 gradle wrapper
在 /gradle/wrapper/gralde-wrapper.properties
目錄中聲明了指向目錄和版本
官方的各個版本的代理下載地址 https://services.gradle.org/distributions/
如果 gradle 初次構(gòu)建緩慢,可以手動下載代理放到
${USER}/.gradle/wrapper/dists下
本地建立文件 gradle.properties
或者在用戶的 .gradle
目錄下建立 gradle.properties
文件作為全局設(shè)置倔幼,參數(shù)有
# 開啟并行編譯
org.gradle.parallel=true
# 開啟守護(hù)進(jìn)程
org.gradle.daemon=true
# 按需編譯
org.gradle.configureondemand=true
# 設(shè)置編譯jvm參數(shù)
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 設(shè)置代理
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=10384
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=10384
# 開啟JNI編譯支持過時API
android.useDeprecatedNdk=true
安裝一個全局的gradle顷蟆,并配置好Path變量,避免每個項目重復(fù)下載钉凌,這樣后面編譯項目就可以直接運(yùn)行g(shù)radle build
常用命令
注意:在window下可以直接運(yùn)行
gradlew
如果是Linux 或者 mac 命令為gradle gradlew
這里都簡寫成./gradlew
gradle 任務(wù)查詢命令
- 所有后面的命令咧最,都必須在 tasks --all 可見,不然報告找不到這個任務(wù)
# 查看任務(wù)
./gradlew tasks
# 查看所有任務(wù) 包括緩存任務(wù)等
./gradlew tasks --all
# 對某個module [moduleName] 的某個任務(wù)[TaskName] 運(yùn)行
./gradlew :moduleName:taskName
說明,module 定義在 工程根
settings.gradle
下矢沿,由include 指定
子模塊任務(wù)滥搭,不代表工程根也有同樣的任務(wù),所以需要單獨(dú)查詢moduel 最佳命名實踐為
全小寫英文
防止編譯兼容問題
快速構(gòu)建命令
# 查看構(gòu)建版本
./gradlew -v
# 清除build文件夾
./gradlew clean
# 檢查依賴并編譯打包
./gradlew build
# 編譯并安裝debug包
./gradlew installDebug
# 編譯并打印日志
./gradlew build --info
# 譯并輸出性能報告捣鲸,性能報告一般在 構(gòu)建工程根目錄 build/reports/profile
./gradlew build --profile
# 調(diào)試模式構(gòu)建并打印堆棧日志
./gradlew build --info --debug --stacktrace
# 強(qiáng)制更新最新依賴瑟匆,清除構(gòu)建并構(gòu)建
./gradlew clean build --refresh-dependencies
注意build
命令把 debug、release
環(huán)境的包都打出來的
如果需要指定構(gòu)建使用如下命令
gradle 指定構(gòu)建目標(biāo)命令
# 編譯并打Debug包
./gradlew assembleDebug
# 這個是簡寫 assembleDebug
./gradlew aD
# 編譯并打Release的包
./gradlew assembleRelease
# 這個是簡寫 assembleRelease
./gradlew aR
gradle 更新最新依賴問題
這個是困擾不少開發(fā)者的問題栽惶,其實研究一下就知道
- gradle 相對 maven 做了一層本地緩存
${user}/.gradle/caches/modules-2
(默認(rèn)緩存更新是 24小時) - gradle 在當(dāng)前工程也做了一層緩存
${project.root}/.gradle
- 使用 IDE 這種集成開發(fā)環(huán)境愁溜,也加了一層緩存(在 IDE 的緩存目錄里面)
- 工程開發(fā)配置文件(當(dāng)前工程下 .idea .vsc 等等),這個會影響到代碼提示
所以外厂,經(jīng)常出現(xiàn) gradle 命令更新到最新依賴代碼冕象,IDE 不顯示的問題,你需要自行處理好緩存
一般命令行 加入 --refresh-dependencies
可以更新 gradle 部分汁蝶,但不會影響到 IDE
如果想要 IDE 在寫代碼時知道更新渐扮,你需要刷新或者修改 IDE 的緩存,具體怎么操作需要根據(jù)情況自行解決
這里提供2個工具腳本輔助
腳本工具由 python2 編寫穿仪,怎么做到全局使用席爽,請配置在環(huán)境變量中,需要額外功能啊片,請自行修改腳本只锻,本人不提供免費(fèi)的技術(shù)服務(wù)
gradle 構(gòu)建并安裝調(diào)試命令
# 編譯并打Debug包
./gradlew assembleDebug
# 編譯app module 并打Debug包
./gradlew install app:assembleDebug
# 編譯并打Release的包
./gradlew assembleRelease
# Release模式打包并安裝
./gradlew installRelease
# 卸載Release模式包
./gradlew uninstallRelease
gradle 多渠道打包
assemble還可以和productFlavors結(jié)合使用,如果出現(xiàn)類似
Task 'install' is ambiguous in root project
這種錯誤紫谷,請查看配置的多個渠道然后修改命令為
./gradlew install[productFlavorsName] app:assembleDebug
來用命令構(gòu)建調(diào)試
# Release模式打包并安裝
./gradlew installRelease
# 卸載Release模式包
./gradlew uninstallRelease
# Release模式全部渠道打包
./gradlew assembleRelease
# Release模式 test 渠道打包
./gradlew assembleTestRelease
# debug release模式全部渠道打包
./gradlew assemble
gradle 查看包依賴
./gradlew dependencies
# 或者模組的 依賴
./gradlew app:dependencies
# 檢索依賴庫
./gradlew app:dependencies | grep CompileClasspath
# windows 沒有 grep 命令
./gradlew app:dependencies | findstr "CompileClasspath"
# 將檢索到的依賴分組找到 比如 multiDebugCompileClasspath 就是 multi 渠道分發(fā)的開發(fā)編譯依賴
./gradlew app:dependencies --configuration multiDebugCompileClasspath
# 一般編譯時的依賴庫齐饮,不是固定配置方式,建議檢索后嘗試
./gradlew app:dependencies --configuration compile
# 一般運(yùn)行時的依賴庫笤昨,不是固定配置方式祖驱,建議檢索后嘗試
./gradlew app:dependencies --configuration runtime
gradle 依賴管理
- 傳遞依賴特性
dependencies {
transitive true
}
手動配置transitive屬性為false,阻止依賴的下載
- 強(qiáng)制指定編譯版本
configurations.all{
// transitive false
// 強(qiáng)制指定版本
resolutionStrategy{
force 'org.hamcrest:hamcrest-core:1.3'
// 強(qiáng)制不編譯
all*.excludegroup: 'org.hamcrest', module:'hamcrest-core'
}
}
- 動態(tài)依賴特性
dependencies {
// 任意一個版本
compile group:'b',name:'b',version:'1.+'
// 最新的版本
compile group:'a',name:'a',version:'latest.integration'
}
查看詳細(xì)依賴信息
使用離線模式
./gradlew aDR --offline
守護(hù)進(jìn)程
./gradle build --daemon
并行編譯模式
./gradle build --parallel --parallel-threads=N
按需編譯模式
./gradle build --configure-on-demand
不使用snapshot依賴倉庫
前提是離線可以使用時
./gradlew clean aDR
設(shè)定編碼
allprojects {
...
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
...
}
倉庫設(shè)置
設(shè)置中心倉庫
默認(rèn)是jcenter瞒窒、可以是mavenCentral
repositories {
// gralde 4.0 以后出現(xiàn)捺僻,訪問倉庫為 https://dl.google.com/dl/android/maven2/
google()
// 私有,或者國內(nèi)鏡像倉庫配置方法
maven { url "http://maven.oschina.net/content/groups/public" }
// maven centeral 由Sonatype公司提供的服務(wù)崇裁,它是ApacheMaven匕坯、SBT和其他構(gòu)建系統(tǒng)的默認(rèn)倉庫
mavenCentral()
// jcenter 由JFrog公司提供的Bintray中的Java倉庫,是GoovyGrape內(nèi)的默認(rèn)倉庫,Gradle內(nèi)建支持
jcenter()
// mavenCentral 和 jcenter 搜索庫 http://mvnrepository.com/
}
repositories 倉庫的寫作順序拔稳,會影響到拉取的速度葛峻,因為 groovy 腳本執(zhí)行時,是按數(shù)組下標(biāo)進(jìn)行的
Android Studio 提速
禁用插件
去掉一些沒有用的插件巴比,這個不是固定的术奖,如果你能解決網(wǎng)絡(luò)問題礁遵,開啟這些插件對你寫代碼有好處
Google Cloud Testing、Google Cloud Tools For Android Studio、Goole Login、Google Services边坤、JavaFX、SDK Updater晰赞、TestNG-J
android studio 2.2.2新特性 編譯緩存
工程根目錄 gradle.properties
文件里加上
android.enableBuildCache=true
這個設(shè)置可以讓Android Studio 會把依賴的 jar 或 arr 緩存到本地,并且把模塊名稱設(shè)置為 hash 值
這個開啟后选侨,可能導(dǎo)致 includeJarFilter 配置失效掖鱼,Android Studio 升級到 2.3.0修復(fù)這個問題
每次編譯生成的緩存在 $HOME/.android/build-cache
如果緩存過多可以手動刪除該目錄進(jìn)行清除
升級到 Android Studio 2.3 后編譯不兼容問題
升級到 Android Studio 2.3 后,Gradle Plugin 也升級到 2.3.0
- 對應(yīng)推薦使用的 Gradle 版本是 3.3
這時候會發(fā)現(xiàn)工程模塊目錄下 {module name}/build/intermediates/exploded-aar/
目錄沒了
它會在 $HOME/.android/build-cache
下生成一部分緩存文件援制,來代替 exploded-aar
如果需要生成exploded-aar
戏挡,可以配置項目目錄下的 gradle.properties
,添加一行內(nèi)容
android.enableBuildCache=false
然后重新構(gòu)建項目即可在 {module name}/build/intermediates/
看到 exploded-aar 目錄