前言
之前在多版本多渠道打包,還有混淆相關的文章中對gradle相關的內容有一部分的瞭解,但是沒有系統綜合的總結過相關的知識內容,這裏就一些碰到的問題做一下總結!
什麼是Gradle?
Gradle是一個開源的自動化構建工具,被應用在AS中去構建我們的Android項目,代替了之前Eclipse中的ant。首先我們要明確一點,Gradle不是一種語言,它使用的是Groovy語言,關於Groovy,這裏不多說,想要了解的可以查閱一些資料。
Gradle version和Gradle plugin version的區別
好像15年之前,Android Studio都沒怎麼普及,我第一次接觸AS之後,也是被其中的編譯配置搞懵逼了,那時候牆的厲害,各種編譯不過,有的時候前一次編譯過了,後一次就又不過!
Gradle version:對應的是Gradle官方發行的release版本,跟Android Studio半毛錢關係沒有。
具體在gradle-wrapper.properties
文件中:
...
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
Gradle plugin version:這個說的插件是指AS中的Gradle插件,是AS以Gradle發行版本爲基礎,結合Android SDK Build Tools專用於構建 Android 應用的插件。
具體在項目的build.gradle
中:
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
一般來說,每次AS的大版本更新,都會有一次Gradle插件的更新,而且兩者的版本號基本上一樣,當然也會有AS更新,但是插件不更新的情況。也就是說Gradle插件是獨立於AS單獨維護更新的。
再說回gradle和gradle plugin,兩者的區別上邊已經說清楚了,關於兩者的版本對應關係可以到AS官網這個頁面查看:版本對應關係
AS中的Gradle配置
這裏以最新的AS4.0爲例,其中gradel配置頁面較之前版本UI有所改變,但是內容不變:
默認情況下,使用的是gradle-wrapper.properties
這個文件中的配置:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.11-all.zip
它會先在GRADLE_USER_HOME
這裏邊去找有沒有對應的版本(這裏是6.1.1),如果沒有則去distributionUrl
這個地址去下載,下載完成則會放在distributionPath
對應的文件夾下。
說個題外話,上邊提到早期牆的厲害,導致這個url下載不了,就出現項目死活編譯不了的問題。
我們也注意到下邊還有一個Specified location
,就我們手動指定Gradle目錄位置,其實我們在下載更新一個版本的AS後,這個安裝目錄中就帶有該Gradle插件所依賴的最新版的gradle,我們直接將該gradle地址,寫在後邊即可!編譯的時候,就會直接使用本地的gradle,而不會再去GRADLE_USER_HOME
查找下載了!
Gradle構建流程
通常來說,Gradle一次完整的構建過程通常分成如下 三個部分:
初始化階段:首先,在初始化階段 Gradle 會決定哪些項目模塊要參與構建,並且爲每個項目模塊創建一個與之對應的 Project 實例。
配置階段:然後,配置工程中每個項目的模塊,並執行包含其中的配置腳本。
任務執行:最後,執行每個參與構建過程的 Gradle task。
詳細可以參考:深度探索 Gradle 自動化構建技術(三、Gradle 核心解密)
文章寫的非常好!建議閱讀!
常用命令和配置
①多版本多渠道打包
這個就不在贅述了,之前有篇文章總結過,需可以查看:
Android Gradle 多版本多APK打包,修改生成APK名稱
另外在設置不同的編譯類型變量時,比如設置不同的baseUrl地址,也可以這樣寫:
buildTypes {
...
preRelease {
initWith(release)
buildConfigField "String", "BASE_URL", "\"https://xxxxxxxx/\""
}
}
我們在使用的時候,直接使用BuildConfig.BASE_URL
即可!
②使用 exclude 來排除三方庫中某些不需要或者是重複的依賴。
比如之前常見的v4包衝突
implementation ('com.xx.xx:XXX:1.0.0') {
exclude group: 'com.android.support'
}
③命令
./gradlew projects #從root從上往下列出所有的project
./gradlew tasks #列出項目中所有的任務
./gradlew dependencies #列出項目中所有的依賴
./gradlew clean #clean,相當於清空build文件夾
./gradlew build #編譯打包
./gradlew installDebug #編譯並安裝debug包
./gradlew assembleDebug #編譯並打所有渠道的debug包
./gradlew assemble #編譯並打所有渠道的debug,release包