Gradle Android-build 常用命令參數及解釋

[TOC]

介紹

Gradle 是google開發的基于groovy語言 ,用于代替 ant 構建的一種配置型語言

Gradle 是基于groovy語言實現(基于JVM的語法和java類似的腳本語言)的一個Android編譯系統, google針對Android編譯用groovy語言開發了一套 DSL 語言
有額外需要直接使用groovy,或者java代碼解決

gradle wrapper

每個基于gradle構建的工程都有一個gradle本地代理,叫做 gradle wrapper
/gradle/wrapper/gralde-wrapper.properties 目錄中聲明了指向目錄和版本

官方的各個版本的代理下載地址 https://services.gradle.org/distributions/
如果 gradle 初次構建緩慢,可以手動下載代理放到${USER}/.gradle/wrapper/dists

本地建立文件 gradle.properties 或者在用戶的 .gradle目錄下建立 gradle.properties 文件作為全局設置,參數有

# 開啟并行編譯
org.gradle.parallel=true
# 開啟守護進程
org.gradle.daemon=true
# 按需編譯
org.gradle.configureondemand=true
# 設置編譯jvm參數
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 設置代理
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變量,避免每個項目重復下載,這樣后面編譯項目就可以直接運行gradle build

常用命令

注意:在window下可以直接運行 gradlew 如果是Linux 或者 mac 命令為 gradle gradlew 這里都簡寫成 ./gradlew

gradle 任務查詢命令

  • 所有后面的命令,都必須在 tasks --all 可見,不然報告找不到這個任務
# 查看任務
./gradlew tasks
# 查看所有任務 包括緩存任務等
./gradlew tasks --all
# 對某個module [moduleName] 的某個任務[TaskName] 運行
./gradlew :moduleName:taskName

說明,module 定義在 工程根 settings.gradle 下,由 include 指定
子模塊任務,不代表工程根也有同樣的任務,所以需要單獨查詢

moduel 最佳命名實踐為 全小寫英文 防止編譯兼容問題

快速構建命令

# 查看構建版本
./gradlew -v
# 清除build文件夾
./gradlew clean
# 檢查依賴并編譯打包
./gradlew build
# 編譯并安裝debug包
./gradlew installDebug
# 編譯并打印日志
./gradlew build --info
# 譯并輸出性能報告,性能報告一般在 構建工程根目錄 build/reports/profile
./gradlew build --profile
# 調試模式構建并打印堆棧日志
./gradlew build --info --debug --stacktrace
# 強制更新最新依賴,清除構建并構建
./gradlew clean build --refresh-dependencies

注意build命令把 debug、release環境的包都打出來的
如果需要指定構建使用如下命令

gradle 指定構建目標命令

# 編譯并打Debug包
./gradlew assembleDebug
# 這個是簡寫 assembleDebug
./gradlew aD
# 編譯并打Release的包
./gradlew assembleRelease
# 這個是簡寫 assembleRelease
./gradlew aR

gradle 更新最新依賴問題

這個是困擾不少開發者的問題,其實研究一下就知道

  • gradle 相對 maven 做了一層本地緩存 ${user}/.gradle/caches/modules-2(默認緩存更新是 24小時)
  • gradle 在當前工程也做了一層緩存 ${project.root}/.gradle
  • 使用 IDE 這種集成開發環境,也加了一層緩存(在 IDE 的緩存目錄里面)
  • 工程開發配置文件(當前工程下 .idea .vsc 等等),這個會影響到代碼提示

所以,經常出現 gradle 命令更新到最新依賴代碼,IDE 不顯示的問題,你需要自行處理好緩存
一般命令行 加入 --refresh-dependencies 可以更新 gradle 部分,但不會影響到 IDE
如果想要 IDE 在寫代碼時知道更新,你需要刷新或者修改 IDE 的緩存,具體怎么操作需要根據情況自行解決
這里提供2個工具腳本輔助

腳本工具由 python2 編寫,怎么做到全局使用,請配置在環境變量中,需要額外功能,請自行修改腳本,本人不提供免費的技術服務

gradle 構建并安裝調試命令

# 編譯并打Debug包
./gradlew assembleDebug
# 編譯app module 并打Debug包
./gradlew install app:assembleDebug
# 編譯并打Release的包
./gradlew assembleRelease
#  Release模式打包并安裝
./gradlew installRelease
# 卸載Release模式包
./gradlew uninstallRelease

gradle 多渠道打包

assemble還可以和productFlavors結合使用,如果出現類似 Task 'install' is ambiguous in root project 這種錯誤,請查看配置的多個渠道然后修改命令為
./gradlew install[productFlavorsName] app:assembleDebug
來用命令構建調試

# 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 渠道分發的開發編譯依賴
./gradlew app:dependencies --configuration multiDebugCompileClasspath
# 一般編譯時的依賴庫,不是固定配置方式,建議檢索后嘗試
./gradlew app:dependencies --configuration compile
# 一般運行時的依賴庫,不是固定配置方式,建議檢索后嘗試
./gradlew app:dependencies --configuration runtime

gradle 依賴管理

  • 傳遞依賴特性
dependencies {
    transitive true
}

手動配置transitive屬性為false,阻止依賴的下載

  • 強制指定編譯版本
configurations.all{
  // transitive false
  // 強制指定版本
  resolutionStrategy{
    force 'org.hamcrest:hamcrest-core:1.3'
  // 強制不編譯
  all*.excludegroup: 'org.hamcrest', module:'hamcrest-core'
  }
}
  • 動態依賴特性
dependencies {
    // 任意一個版本
    compile group:'b',name:'b',version:'1.+'
    // 最新的版本
    compile group:'a',name:'a',version:'latest.integration'
}

查看詳細依賴信息

使用離線模式

./gradlew aDR --offline

守護進程

./gradle build --daemon

并行編譯模式

./gradle build --parallel --parallel-threads=N

按需編譯模式

./gradle build --configure-on-demand

不使用snapshot依賴倉庫

前提是離線可以使用時

./gradlew clean aDR

設定編碼

allprojects {
...
    tasks.withType(JavaCompile){
        options.encoding = "UTF-8"
    }
...
}

倉庫設置

設置中心倉庫

默認是jcenter、可以是mavenCentral

repositories {
    // gralde 4.0 以后出現,訪問倉庫為 https://dl.google.com/dl/android/maven2/
    google()
    // 私有,或者國內鏡像倉庫配置方法
    maven { url "http://maven.oschina.net/content/groups/public" }
    // maven centeral 由Sonatype公司提供的服務,它是ApacheMaven、SBT和其他構建系統的默認倉庫
    mavenCentral()
    // jcenter 由JFrog公司提供的Bintray中的Java倉庫,是GoovyGrape內的默認倉庫,Gradle內建支持
    jcenter()
    // mavenCentral 和 jcenter 搜索庫 http://mvnrepository.com/

}

repositories 倉庫的寫作順序,會影響到拉取的速度,因為 groovy 腳本執行時,是按數組下標進行的

Android Studio 提速

禁用插件

去掉一些沒有用的插件,這個不是固定的,如果你能解決網絡問題,開啟這些插件對你寫代碼有好處
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

這個設置可以讓Android Studio 會把依賴的 jar 或 arr 緩存到本地,并且把模塊名稱設置為 hash 值

這個開啟后,可能導致 includeJarFilter 配置失效,Android Studio 升級到 2.3.0修復這個問題

每次編譯生成的緩存在 $HOME/.android/build-cache
如果緩存過多可以手動刪除該目錄進行清除

升級到 Android Studio 2.3 后編譯不兼容問題

升級到 Android Studio 2.3 后,Gradle Plugin 也升級到 2.3.0

  • 對應推薦使用的 Gradle 版本是 3.3

這時候會發現工程模塊目錄下 {module name}/build/intermediates/exploded-aar/
目錄沒了

它會在 $HOME/.android/build-cache 下生成一部分緩存文件,來代替 exploded-aar
如果需要生成exploded-aar,可以配置項目目錄下的 gradle.properties ,添加一行內容

android.enableBuildCache=false

然后重新構建項目即可在 {module name}/build/intermediates/看到 exploded-aar 目錄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容