當新建一個Android Studio項目后岂昭,會自動生成一些Gradle配置文件墓拜,了解
Gradle構建腳本
是學習Gradle的必要知識之一赃磨。
[Settings 文件]
上圖是Android工程的的目錄結構,在根目錄下有一個非常重要的文件settings.gradle
初婆,這個文件稱為設置文件
机打,設置文件大多數(shù)的作用都是為了配置子工程矫户,也就是Module。
Android工程支持多Module残邀,如果項目中存在app皆辽、app1、app2芥挣、app3驱闷、app4、app5這幾個Module九秀,那么需要在設置文件中配置這幾個Module遗嗽,配置方式可以是:
也可以這么配置
如果某個Module用不到,可以不要配置這個Module鼓蜒。
接下來,看一下以下項目結構
默認情況下征字,Module文件夾的位置都在項目的根目錄都弹,那么,有沒有辦法調(diào)整Module在項目中的路徑呢匙姜?
答案是:有的
為了優(yōu)化工程結構畅厢,我們會將一些業(yè)務層的Module單放入一個文件夾中,在項目的根目錄下新建一個名稱為business
的文件夾氮昧,將app1
框杜、app2
、app3
袖肥、app4
咪辱、app5
放入到business
文件夾中,在設置文件中椎组,重新執(zhí)行Module的目錄油狂,配置代碼如下:
include ':app'
include ':app1'
project(':app1').projectDir = new File(rootDir, 'business/app1')
include ':app2'
project(':app2').projectDir = new File(rootDir, 'business/app2')
include ':app3'
project(':app3').projectDir = new File(rootDir, 'business/app3')
include ':app4'
project(':app4').projectDir = new File(rootDir, 'business/app4')
include ':app5'
project(':app5').projectDir = new File(rootDir, 'business/app5')
當然,如果不指定Module的路徑,那么默認就是根目錄专筷。
[Build文件]
我們都知道弱贼,使用工具創(chuàng)建一個Android工程,會默認構建一個項目磷蛹,那么構建項目的入口在哪里呢吮旅?
在項目的根目錄下找到文件build.gradle
,這個一個工程的Build文件
味咳,這個文件是構建項目的起始點鸟辅。
先來看一下Build文件的代碼
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
buildscript:
主要功能是下載并引用一些插件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
dependencies代碼塊中主要放置一些項目必要的插件,當新建項目時莺葫,必然會默認加載一個gradle插件
classpath "com.android.tools.build:gradle:4.0.0"
當前gradle的插件版本是4.0.0匪凉。
當然,也可以自定義一個插件捺檬,將自定義的插件放入dependencies代碼塊中加載再层。
repositories代碼塊決定了插件下載的遠程倉庫,先從google倉庫中下載堡纬,如果google倉庫中找不到對應的插件聂受,那么會在jcenter倉庫中尋找對應的插件。
allprojects:
主要功能是下載所有Module下的依賴
allprojects {
repositories {
google()
jcenter()
}
}
allprojects對應著所有Module下的依賴烤镐,repositories代碼塊指定了那些依賴下載的地址蛋济。
這里,有一個閉包的概念炮叶,所有碗旅,如果在閉包上添加小括號是沒有語法錯誤的,代碼如下:
buildscript ({
repositories ({
google()
jcenter()
})
dependencies ({
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
})
})
allprojects ({
repositories ({
google()
jcenter()
})
})
構建一個Android工程镜悉,會執(zhí)行大量的任務(task)祟辟,出了一些自帶的task之外,還以自定義協(xié)議task侣肄,可以將自定義task放在Build文件來執(zhí)行旧困,代碼如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
//...
}
allprojects {
//...
}
task clean(type: Delete) {
delete rootProject.buildDir
}
task test1{
println 'test1'
}
task test2{
println 'test2'
}
task test3{
println 'test3'
}
task test4{
println 'test4'
}
task test5{
println 'test5'
}
[Projects和Tasks]
學習Gradle必須要理清楚Projects和tasks的概念,我們都知道稼锅,一個Android項目吼具,由若干個Module組成,這些Module就是Projects矩距,然而拗盒,每個Project的構建都是由多個Task來構建的,Task是一個命令剩晴,或者說是一個操作锣咒,由于一個Project是由多個Task來構建的侵状,所以可以理解為多個Task就是一個Project
。
[創(chuàng)建一個新的任務]
方法一:
task test{
doLast {
println 'doLast'
}
doFirst {
println 'doFirst'
}
}
方法二:
tasks.create('test'){
doLast {
println 'doLast'
}
doFirst {
println 'doFirst'
}
}
補充:doFirst
優(yōu)先被執(zhí)行毅整,doLast
最后被執(zhí)行趣兄。
[任務依賴]
task test1{
println 'test1'
}
task test2(dependsOn: test1){
println 'test2'
}
以上代碼的意思是:test2依賴于test1,所以在執(zhí)行test2之前必然會執(zhí)行test1悼嫉。
[自定義屬性]
定義一個屬性:
ext.aa = 1
定義多個屬性:
ext{
age = 18
name = 'zhangsan'
}
還可以使用sourceSets定義屬性艇潭,代碼如下:
sourceSets {
main{
resourcesDir = 'main/res'
}
test{
resourcesDir = 'test/res'
}
}
task testC{
sourceSets.each {
println "${it.name}的resourcesDir是:${it.resourcesDir}"
}
}
[腳本即代碼,代碼也是腳本]
在Build文件中可以使用Groovy語言戏蔑,比如使用Groovy語言定義一個方法蹋凝,代碼如下:
def function() {
def sum = 1+2
println sum
}
task testD{
function()
}
[本章完...]