一、瞭解
gradle是個什麼東西,一開始的時候我並沒有一個很深的概念要去了解,完全當它是個工具來用,而Google就是用戶手冊。剛開始還好,到後面就不行了,遇到一些問題,莫名其妙,簡直煩炸!至此,我開始瞭解gradle
就像常說的,gradle是個構建工具,它作爲一個新起之秀,有ant,maven等前輩。那構建工具用來幹什麼的?
顧名思義:構建工具是用來將項目源代碼進行build,然後得到output的一個工具。(所以用不好就會煩炸,明明源代碼啥都有,就是得不到output,想想就害怕)。那麼這些個構建工具有什麼區別,從一片知乎上看到,ant是樸素的,任務清晰,當時不管理依賴。maven是厲害的,他管理依賴,但是不太靈活。最後就有了gradle,我的需求,他都可以滿足:構建,打包,依賴管理,項目配置,等等。
重點來了,對於一個構建工具,我們要注意什麼?在我開來,第一是構建腳本,第二是項目配置結構,第三是命令使用。清楚他的構建腳本,知道他會幹什麼,如何定義,然後就是項目結構,如何配置才能讓項目能順利構建,最後就是對各種命令的使用,充分發揮構建工具的作用了。
最後,我是個android開發者,常常用到gradle,也是官方默認的管理工具,就只能去用了。還有就是,他是基於jvm運行的,這是前提。
二、入手
入手的方式有兩種:一種是手動創建一個gradle管理的項目,一種是拿到一個gradle管理的項目。
顯然,自己創建的方式需要預先安裝好gradle,無論是使用IDE的集成,還是使用命令行,一般都不會遇到什麼問題,畢竟東西都是自己控制的。就不說啥了。
所以,重點就是拿到一個gradle的項目。gradle神奇的地方在於,即使你沒有預先安裝gradle,也可以使用它,因爲他常常會帶一個jar,來讓那些沒有gradle的環境去下載,然後使用。當然,這也是個坑,爲什麼,在後續的wrapper裏明說,總的就是,我有個新版的gradle,你竟然去下載舊的,還巨慢!
使用Android Studio的同學相必早已在電腦有了gradle,當然,我們可以在gradle官網,去下載使用。官網還有許多docs,很有幫助。
至於說什麼基於groovy的,作爲一個程序員,代碼簡直簡單到看不懂都好難,所以,直接上手吧,邊摸索邊學習即可。
三、見面
在Windows平臺,一般一個由gradle管理的項目大概會有這麼些個東西。
首先來看文件夾:.gradle(‘.’開頭的都不好惹),build(執行過後常常將輸出或者緩存放到這個文件夾),gradle(管理自己的地方),src(我們的源代碼)
再看文件,大致可以分爲3類:構建腳本(後綴爲gradle),執行文件(gradlew和gradlew.bat),配置文件(後綴爲properties)。顯然,配置文件不是必須的,所以不同項目不同,而這裏的local.properties就是Android SDK的目錄設置配置。
所以,我們要關注的,就基本上是腳本而已。當然,文件夾gradle和配置文件是基礎。也就是3個方面。
- 在腳本(*.gradle)裏我們定義任務,管理依賴。
- 在文件夾gradle裏我們管理不同版本的gradle,包括下載,升級等。
- 在配置文件裏我們管理gradle運行時的屬性,包括執行環境的一切(jvm設置,sdk路徑等)
四、避坑
在使用前,當然要了解一些最基本的坑,不然可能艱難爬過了,後面又掉進去而不知道。
4.1、wrapper
在gradle文件夾裏的就是這個,他是個管理gradle的東西,包括從無到有,版本選擇,版本升級等。
重點:
gradle/wrapper/gradle-wrapper.properties
.
distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-bin.zip
類似上面的就是要注意的地方,很多時候,我們本地沒有它指定的版本,然後他就會去下載指定的版本,所以,我們把對應的版本號做好統一,避免去下載n多個版本,直接替換4.3.1爲自己的版本號即可。
4.2、local.properties
本來這不是個坑,但是一不小心就會遇到,目前我只遇到,用它來設置本地Android SDK目錄的時候,但是,有時候一些第三方的項目就沒有這個文件,如果用Android Studio他會幫我們加上去,但是用命令行時就坑爹了。下面mark一下:
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Sat May 12 08:39:04 CST 2018
ndk.dir=D\:\\sdk\\ndk-bundle
sdk.dir=D\:\\sdk
顯然,後面的路徑要根據各位同學本地的sdk來設置。
五、開始
終於來到正式的地方了,正正經經的使用。我們可以選擇使用IDE提供的工具欄或者使用命令行。兩種方式都會說一下,當然,IDE使用的本質也是命令行了,所以,命令行纔是本質。
說明:當使用wrapper時,命令換成gradlew,能更新或者下載wrapper配置裏的gradle然後使用
概念:project和task,project有一個或多個task或字project構成,task是gradle的最小執行單元。而在“見面”裏的setting.gradle裏,就是來聲明project包括了那些子project的。task在build.gradle裏定義。
其實,本文目的並不單純,下面的大多都是結合Android Studio和android plugin來講述的,畢竟我是做Android的。
5.1、gradle in Android Studio
以上就是在android studio裏提供的task的列表,我們只需要雙擊就能使用,下面簡單介紹一下。
呃呃呃,好像沒啥好說的,唯一提一下的就是:assemble的意思是集合,打包之類的,顯然,這就是個將所有東西編譯,打包成運行文件的操作,具體後面說,其他的猜一下也差不多了,或者google一下,畢竟我也沒用多少。
補充一點,在android studio裏的構建任務,可以參考官網裏的構建。
5.2、gradle in CLI(command line interface)
命令解釋:
//命令格式,taskname可以多個,用space隔開
> gradle [taskName...] [--option-name...]
//多項目情況,如果是rootProject,則最前面的":"可以省略
> gradle :mySubproject:taskName
//環境路徑基於的文件路徑,上例等於如下
> cd mySubproject
> gradle taskName
//exclude task,如:不執行test
> gradle dist --exclude-task test
//失敗後,繼續task
> gradle test --continue
常見命令:
//assembling all outputs and running all checks
> gradle build
//running applications
> gradle run
//running all checks
> gradle check
//cleaning outputs
> gradle clean
//get report(在gradle 加-q 可以只輸出核心內容,安靜模式)
> gradle projects
> gradle tasks [--all]
//get task usage help
> gradle help --task someTask
//list dependencies
> gradle dependencies //對應dependencies
> gradle buildEnvironment //對應buildscript
> gradle dependencyInsight --dependency name //查看特定依賴
//list properties
> gradle properties
//list models
> gradle model
加速構建:
--build-cache, --no-build-cache
reuse the outputs. Default is off.
--configure-on-demand, --no-configure-on-demand
Only relevant projects are configured in this build run. Default is off.
--parallel, --no-parallel
Build projects in parallel. Default is off.
//對於gradle的性能調優,可以加--profile生成執行時間報告
加速構建之gradle.properties設置:
org.gradle.parallel=(true,false)
org.gradle.configureondemand=(true,false)
org.gradle.caching=(true,false)
當然,在很多時候只需要配置好properties就可以定製很多特性了,全部請查看gradle_configuration_properties。六、Android Plugin DSL
第一次體會到什麼叫DSL(domain-specific language) ,像android plugin,他定義了很多隻針對android項目的一些東西,然後在腳本里會用到(區別於一般的編程語言),所以,這種domain-specific當然是有reference啦(我是今天才發現,真是坑)Android Plugin DSL Reference
在官網裏我們看到有大概十幾個configration block,這都是定義好的,可以用來控制android項目的某些東西的。下面就幾個常用的做一下介紹。當然了,要使用就要在root project裏的buildscript裏聲明使用這個dependency(IDE自動弄好了,此處說明一下)。
6.1、概覽
在Android項目裏的build.gradle裏,主要看android{},dependencies{},這兩大塊,而android{}裏的就是這裏的重點,其餘都算是普通gradle的內容。
6.2、android{}
全局配置
直接在裏面配置
android {
compileSdkVersion 26
...
...
}
原來舊的版本還有個buildToolVersion的設置,後來更新了,直接有提供默認的設置了,就不同自行設置了,而一般我們就加這一個而已。
sourceSets{}
android {
...
...
sourceSets{
res.srcDirs = ['src']
jni.srcDirs = ['jniLibs']
}
...
...
}
一般遵循默認的設定,像java,res,assets,jniLibs都放在module/src/main/目錄下,當然我們可以添加一些自己的文件夾到默認中,只需要在上面的[]裏添加路徑即可,用','分隔開。
defaultConfig{}
android {
...
...
defaultConfig {
applicationId "com.example.zyssky.interesting"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
...
}
在這裏一般設置一些通用的,就像上面這種類型的,設置。
buildType{}
android {
...
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
...
}
這裏是設置構建類型的自定義的,包括debug,release,自定義,還有就是各類型裏的簽名,資源壓縮,proguard問題,包名設置等等的,就是用來區分分割構建類型的設置的,完了後會自動生成task:assemble***來執行對應任務。構建類型之間還能夠繼承:
如:myBuildType.initWith(buildTypes.debug)
signingConfigs{}
android {
...
...
signingConfigs {
release {
storeFile file("path")
storePassword "123456"
keyAlias "rr"
keyPassword "1234567"
}
}
buildTypes {
release{
singingConfig signingConfigs.release
}
}
...
...
}
在配置完成後,再在buildTypes裏設置就好。簽名文件自己定義的是jks,不再是keystore了。
還有多渠道打包用到的productFlavour{},使用java特性時的compileOptions{},還有lint檢查時的lintOptions{},具體使用根據具體場景,參考官網教程使用即可。
七、小結
這裏我們沒有做很多介紹一些用法,畢竟很多東西IDE都默認配好了,就是當出現問題或者需要自定義的時候,我們纔會去着手,而這裏也只是介紹了各自的職責,各個定義,以便有需要時該怎麼辦,可以怎麼辦,有個方向,而不是一昧地上網搜,卻不知道該搜啥,也無法判斷這是什麼問題。東西很多,用法靈活,講是不可能講完的,所以瞭解一下,讓自己能知道如何正確的走下去就是我的目標了。最後我們要與時俱進,一些關於gradle的更新(在Android Studio裏的),記得查看官網更新report。
註釋:
依賴管理:一個項目可能會用到第三發的庫,之前我們或許會採用手動添加jar或之類等的方式來支持這個依賴,而如果構建工具能進行依賴管理,就可以開源倉庫中獲取源代碼,然後集成到項目,開發者只需要一兩行來聲明某個依賴即可。當然也能進行本地的依賴管理了。
參考:
【2】Gradle 官網