Gradle小抄

一、瞭解

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個方面。

  1. 在腳本(*.gradle)裏我們定義任務,管理依賴。
  2. 在文件夾gradle裏我們管理不同版本的gradle,包括下載,升級等。
  3. 在配置文件裏我們管理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或之類等的方式來支持這個依賴,而如果構建工具能進行依賴管理,就可以開源倉庫中獲取源代碼,然後集成到項目,開發者只需要一兩行來聲明某個依賴即可。當然也能進行本地的依賴管理了。

參考:

【1】構建工具的進化:ant, maven, gradle

【2】Gradle 官網

【3】Android Plugin DSL Reference

【4】Build In Android Studio

【5】Gradle Release In Android Studio

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章