Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具。它使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置。
為什么需要全局配置?
伴隨項(xiàng)目模塊化開(kāi)發(fā)、組件化開(kāi)發(fā)以及插件化開(kāi)發(fā)等模式的出現(xiàn),為方便在不同module中設(shè)置版本號(hào)等配置信息,可以通過(guò)配置全局變量來(lái)統(tǒng)一管理所有module的公共配置信息。
全局配置方式
1. 使用ext屬性配置
//1.1 在項(xiàng)目build.gradle中使用ext屬性
ext {
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //構(gòu)建工具的版本,其中包括了打包工具aapt、dx等
compileSdkVersion : 28 //
minSdkVersion : 16 //
targetSdkVersion : 28 //
versionCode : 1
versionName : "1.0.0"
}
//1.2 在某個(gè)module的build.gradle中使用配置
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
}
2. 使用config.gradle配置
//2.1 在項(xiàng)目的根目錄下新建config.gradle文件
//2.2 將gradle中的公共信息寫(xiě)入config.gradle文件中
ext {
android = [
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //構(gòu)建工具的版本,其中包括了打包工具aapt、dx等
compileSdkVersion : 28, //
minSdkVersion : 16, //
targetSdkVersion : 28, //
versionCode : 1,
versionName : "1.0.0",
]
}
//2.3 在主項(xiàng)目的build.gradle中申明一下
apply from: "config.gradle"
//2.4 在項(xiàng)目中引用公共配置
android {
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
}
}
//個(gè)人完整的config.gradle配置
//config.gradle用于統(tǒng)一配置項(xiàng)目中各常量和依賴庫(kù)
//使用在項(xiàng)目根build.gradle上方添加 apply from: "config.gradle"
//然后使用"rootProject.ext"對(duì)象調(diào)用各屬性,例如 rootProject.ext.android.compileSdkVersion、daggerLibs.api、daggerLibs.values()
ext {
//項(xiàng)目包名集合
packageMap = [
"app": "app的包名"
]
android = [
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //構(gòu)建工具的版本,其中包括了打包工具aapt、dx等
compileSdkVersion : 28, //
minSdkVersion : 16, //
targetSdkVersion : 28, //
versionCode : 1,
versionName : "1.0.0",
]
libVersions = [
junit : '4.12',
supportLibraryVersion : '27.1.1',
supportVersion : '28.0.3',
constraintLibraryVersion: "1.1.2",
]
androidSupport = "com.android.support"
testLibs = [
junit: "junit:junit:${libVersions.junit}",
]
depLibs = [
junit : 'junit:junit:4.12',
support: [
appcompatV4 : "${androidSupport}:support-v4:${libVersions.supportLibraryVersion}",
appcompatV7 : "${androidSupport}:appcompat-v7:${libVersions.supportLibraryVersion}",
cardview : "${androidSupport}:cardview-v7:${libVersions.supportLibraryVersion}",
design : "${androidSupport}:design:${libVersions.supportLibraryVersion}",
recyclerview: "${androidSupport}:recyclerview-v7:${libVersions.supportLibraryVersion}",
constraint : "${androidSupport}.constraint:constraint-layout:${libVersions.constraintLibraryVersion}",
],
]
}
ext.common = [
packageTime : "${new Date().format("yyyyMMdd.HHmm.ss.SSS", TimeZone.getTimeZone("GMT+08:00"))}",
AARBackupDir: "${rootDir}/aarBackupDir/",
]
def config = rootProject.ext.android
//配置當(dāng)前project和其subproject的所有project(module)
subprojects {
beforeEvaluate {
println '配置階段開(kāi)始前的監(jiān)聽(tīng)回調(diào)'
}
afterEvaluate {
println '配置階段完成以后的回調(diào)'
}
gradle.buildStarted {
println 'build開(kāi)始的回調(diào)監(jiān)聽(tīng)'
}
gradle.buildFinished {
println 'build完畢后的回調(diào)監(jiān)聽(tīng)'
}
gradle.beforeProject {
println 'gradle執(zhí)行前的回調(diào)監(jiān)聽(tīng)'
}
gradle.afterProject {
println 'gradle執(zhí)行前的回調(diào)監(jiān)聽(tīng)'
}
//在所有子build.gradle(module)文件中添加android 字段
afterEvaluate { project ->//回調(diào)
if (project.hasProperty('android')) {//存在android 字段
android {
compileSdkVersion config.compileSdkVersion
buildToolsVersion config.buildToolsVersion
defaultConfig {
minSdkVersion config.minSdkVersion
targetSdkVersion config.targetSdkVersion
versionCode config.versionCode
versionName config.versionName
multiDexEnabled true
ndk {
//設(shè)置支持的SO庫(kù)架構(gòu)
//'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
// 注:放開(kāi)'arm64-v8a'會(huì)找不到騰訊人臉識(shí)別的類庫(kù)包,>=android7.0 手機(jī)會(huì)崩潰
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
}
}
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility app.sourceCompatibilityVersion
targetCompatibility app.targetCompatibilityVersion
}
//關(guān)閉Android Studio的PNG合法性檢查的
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
//減少編譯錯(cuò)誤和忽略 lint 檢查
packagingOptions {
//Espresso excludes
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'LICENSE.txt'
//Android studio默認(rèn)會(huì)有so文件進(jìn)行壓縮優(yōu)化,加入以下配置可以不壓縮so
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
//doNotStrip "*/x86/*.so"
}
//程序在buid的時(shí)候,會(huì)執(zhí)行l(wèi)int檢查,有任何的錯(cuò)誤或者警告提示,都會(huì)終止構(gòu)建,我們可以將其關(guān)掉
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
abortOnError false
}
// dex預(yù)處理和最多八線程
dexOptions {
// incremental true
preDexLibraries true
maxProcessCount 8
}
//關(guān)閉不需要task
tasks.whenTaskAdded { task ->
if (task.name.contains("lint")
|| task.name.contains("Aidl")
|| task.name.contains("mockableAndroidJar")
|| task.name.contains("UnintTest")
|| task.name.contains("AndroidTest")
|| task.name.contains("Ndk")
|| task.name.contains("Jni")
) {
task.enabled = false
}
}
}
}
}
}