導(dǎo)讀
<a name="label">1、初識(shí)build.gradle</a>
<a name="label">2、使用build.gradle文件</a>
<a name="label">3、settings.gradle文件</a>
(ps:由于Markdown在簡(jiǎn)書(shū)里對(duì)錨點(diǎn)的支持效果不是很好,就沒(méi)設(shè)置跳轉(zhuǎn))
一、初識(shí)build.gradle
在一個(gè)標(biāo)準(zhǔn)的AS工程中,最少都會(huì)有兩個(gè)build.gradle文件,其一在項(xiàng)目的根目錄,而另一個(gè)在module的根目錄里面。如下圖:

我們先來(lái)理了解下兩個(gè)build.gradle文件的區(qū)別?
AS的工程結(jié)構(gòu)其實(shí)可以理解為就是由module組成,但是只運(yùn)行有一個(gè)主module作為我們實(shí)際運(yùn)行的項(xiàng)目,其他module都是以依賴module形式存在,如上圖中所示:就僅有module——app,并且是我們當(dāng)前Demo的主module。AS中,每一個(gè)module都必須會(huì)有一個(gè)屬于自己的build.gradle文件<br />
主module:有個(gè)手機(jī)圖片標(biāo)識(shí)<br />
依賴module:有個(gè)類似列表柱狀圖片標(biāo)識(shí)<br >

了解了module后,回到我們問(wèn)題,其實(shí)就很好理解兩個(gè)build.gradle文件的區(qū)別了<br />
工程根目錄的build.gradle文件
項(xiàng)目構(gòu)建時(shí),會(huì)先找到該文件執(zhí)行構(gòu)建,里面的配置對(duì)整個(gè)工程全局有效,我們可以在這里做些全局性的配置,在創(chuàng)建一個(gè)新AS工程時(shí),會(huì)默認(rèn)創(chuàng)建該文件,并且添加相關(guān)默認(rèn)配置,如:gralde插件,jcenter倉(cāng)庫(kù),maven倉(cāng)庫(kù)。當(dāng)然也可以在這里自定義一些全局的設(shè)置,后面我們會(huì)提到<br >
module的build.gradle文件
構(gòu)建具體到每一個(gè)module時(shí),會(huì)執(zhí)行該文件,里面的配置僅對(duì)當(dāng)前module生效。在創(chuàng)建一個(gè)新module時(shí),也會(huì)默認(rèn)創(chuàng)建該文件,并且添加相關(guān)默認(rèn)配置,如我們Demo中主module app的build.gradle文件:
apply plugin: 'com.android.application'//聲明主module,com.android.application
android {//android工程配置
compileSdkVersion 25 //編譯sdk版本號(hào)
buildToolsVersion "25.0.2"http://編譯工具版本
defaultConfig {//工程默認(rèn)配置
applicationId "com.example.myapplication"http://程序運(yùn)行時(shí)真正的包名,可以與java中包名不同
minSdkVersion 15//最小sdk版本號(hào)
targetSdkVersion 25//目標(biāo)sdk版本號(hào)
versionCode 1//應(yīng)用程序的版本號(hào),以這里修改為準(zhǔn),manifest文件中配置無(wú)效
versionName "1.0"http://應(yīng)用程序的版本名,以這里修改為準(zhǔn),manifest文件中配置無(wú)效
}
buildTypes {//運(yùn)行方式配置,可以配置debug,release或者其他自定義
release {//release運(yùn)行方式執(zhí)行的配置
minifyEnabled false //混淆開(kāi)關(guān)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件
}
}
}
dependencies {//依賴配置
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
二、使用build.gradle文件
清楚了兩種build.gradle文件的區(qū)別后,那么我們就可以進(jìn)行些我們自定義的配置了;假想下這么一種場(chǎng)景,自己的工程如果有好幾個(gè)module,而每一個(gè)module都會(huì)有自己的build.gradle文件,因?yàn)槭莂ndroid工程,所以都會(huì)存在compileSdkVersion 、buildToolsVersion等一些默認(rèn)配置,有時(shí)候自己項(xiàng)目中明明是配置ok了,而且一直編譯沒(méi)有問(wèn)題,或許突然某一天,其他同時(shí)把他自己環(huán)境的一些配置提交上來(lái)了,那么可能就會(huì)出現(xiàn)原來(lái)好好的可以跑,突然就報(bào)錯(cuò)勒,當(dāng)然這解決起來(lái)也非常簡(jiǎn)單,會(huì)說(shuō)了,我把他改回來(lái)不就好了。但是我們能不能通過(guò)一些簡(jiǎn)單配置,這種問(wèn)題盡可能的減少出現(xiàn)呢?<br />
1.使用根目錄build.gradle文件,配置共有的屬性
build.gradle文件代碼,ext里面就是我們自定義的一些配置
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
ext {
compileSdkVersion=25
buildToolsVersion="25.0.2"
minSdkVersion=14
targetSdkVersion=25
versionCode=1
versionName="1.0"
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
使用代碼:
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
2.自動(dòng)使用簽名配置
在主module的build.gradle文件的android區(qū)域里面添加如下代碼,下面配置中,debug和release都配置了同一簽名
signingConfigs {
debugConfig {
keyAlias 'debug'
keyPassword '123456'
storeFile file('/debug.keystore')
storePassword '123456'
}
releaseConfig {
keyAlias 'debug'
keyPassword '123456'
storeFile file('/debug.keystore')
storePassword '123456'
}
}
3.快速區(qū)分調(diào)試環(huán)境和生產(chǎn)環(huán)境
上面僅僅配置好了簽名信息,運(yùn)行起來(lái)實(shí)際上仍然是沒(méi)效果的,這是因?yàn)槲覀冞€需要在運(yùn)行類型配置上進(jìn)行添加相關(guān)配置才能生效,同樣的也是在主module的build.gradle文件中進(jìn)行添加代碼,添加區(qū)域在buildTypes里面
buildTypes {
//調(diào)試環(huán)境
debug {
buildConfigField "boolean", "isDebug", "true"http://debug標(biāo)識(shí),方便項(xiàng)目里面一些只在debug模式下生效代碼做區(qū)分標(biāo)識(shí)
buildConfigField "String", "HOST", '"https://www.baidu.com/"'//項(xiàng)目里面,測(cè)試服務(wù)器地址
resValue "string", "app_name", "**測(cè)試版"http://配置了該屬性,需要在values中strings.xml里面把a(bǔ)pp_name刪掉,否則編譯會(huì)報(bào)錯(cuò),測(cè)試版本的APK名字,以區(qū)分正式測(cè)試不同版本
//混淆
minifyEnabled false
//前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debugConfig//使用上面簽名配置中的debugConfig配置
applicationIdSuffix'.debug'//區(qū)分debug版本的包名,會(huì)自動(dòng)在正式包名后面帶上.debug,方便測(cè)試服務(wù)器版本和正式服務(wù)器版本APK同時(shí)安裝
}
//發(fā)布環(huán)境
release {
buildConfigField "boolean", "isDebug", "true"
buildConfigField "String", "HOST", '"http://www.itdecent.cn/"'//項(xiàng)目里面,正式服務(wù)器地址
resValue "string", "app_name", "*****"http://配置了該屬性,需要在values中strings.xml里面把a(bǔ)pp_name刪掉,否則編譯會(huì)報(bào)錯(cuò),正式版本的APK名字,以區(qū)分正式測(cè)試不同版本
//混淆
minifyEnabled true
//前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置文件
signingConfig signingConfigs.releaseConfig//使用上面簽名配置中的releaseConfig配置
}
}
app_name的特殊處理
當(dāng)我們配置了app_name時(shí),需要去values中找到strings.xml文件,把里面的app_name刪除掉,否則編譯項(xiàng)目會(huì)報(bào)如下錯(cuò)誤,解決方案就是刪除strings.xml里面的app_name后重新構(gòu)建下就好了

有些配置我們?cè)撊绾卧陧?xiàng)目代碼中使用呢?<br />
比如測(cè)試正式服務(wù)器地址,debug標(biāo)識(shí)狀態(tài),我們?cè)撊绾问褂媚亍J紫热魏我粋€(gè)build.gradle修改了,都要重新構(gòu)建下才能生效。構(gòu)建完成后,我們就可以直接通過(guò)BuildConfig.配置的屬性名,進(jìn)行使用了,例如上述中的HOST:BuildConfig.HOST就可以取出我們上邊配置的url勒。<br />
配置了兩個(gè),具體什么時(shí)候取哪個(gè)呢?
這個(gè)具體取決于你運(yùn)行程序時(shí)AS里Build Variant設(shè)置了,點(diǎn)開(kāi)該設(shè)置,找到我們的主module,根據(jù)下圖我們可以看到默認(rèn)是debug配置,此時(shí)我們?nèi)绻枰褂胷elease的配置時(shí),只需要在此處進(jìn)行切換就好了

4.自動(dòng)按規(guī)范更改打包命名
在主module的build.gradle文件里,添加區(qū)域?yàn)閍ndroid{}
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
"demo-${variant.buildType.name}-${defaultConfig.versionName}.apk")//打包的命名為:demo-debug-1.0.apk(debug配置下)
// demo-release-1.0.apk(release配置下)
}
}
三、settings.gradle文件
這個(gè)文件里面所配置的是我們項(xiàng)目module信息,如果新導(dǎo)入進(jìn)來(lái)的module無(wú)法進(jìn)行添加依賴,那么需要檢查一下,在該文件中是否有添加該module,添加語(yǔ)法:
include ':app'//當(dāng)前Demo因?yàn)橹挥幸粋€(gè)app主module,所以就在打開(kāi)該文件只能看到這一條配置,如果需要添加其他module,直接把a(bǔ)pp替換成module名即可