Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
为什么需要全局配置?
伴随项目模块化开发、组件化开发以及插件化开发等模式的出现,为方便在不同module中设置版本号等配置信息,可以通过配置全局变量来统一管理所有module的公共配置信息。
全局配置方式
1. 使用ext属性配置
//1.1 在项目build.gradle中使用ext属性
ext {
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //构建工具的版本,其中包括了打包工具aapt、dx等
compileSdkVersion : 28 //
minSdkVersion : 16 //
targetSdkVersion : 28 //
versionCode : 1
versionName : "1.0.0"
}
//1.2 在某个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 在项目的根目录下新建config.gradle文件
//2.2 将gradle中的公共信息写入config.gradle文件中
ext {
android = [
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //构建工具的版本,其中包括了打包工具aapt、dx等
compileSdkVersion : 28, //
minSdkVersion : 16, //
targetSdkVersion : 28, //
versionCode : 1,
versionName : "1.0.0",
]
}
//2.3 在主项目的build.gradle中申明一下
apply from: "config.gradle"
//2.4 在项目中引用公共配置
android {
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
}
}
//个人完整的config.gradle配置
//config.gradle用于统一配置项目中各常量和依赖库
//使用在项目根build.gradle上方添加 apply from: "config.gradle"
//然后使用"rootProject.ext"对象调用各属性,例如 rootProject.ext.android.compileSdkVersion、daggerLibs.api、daggerLibs.values()
ext {
//项目包名集合
packageMap = [
"app": "app的包名"
]
android = [
androidToolsVersion: '28.0.3',
buildToolsVersion : '28.0.3', //构建工具的版本,其中包括了打包工具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
//配置当前project和其subproject的所有project(module)
subprojects {
beforeEvaluate {
println '配置阶段开始前的监听回调'
}
afterEvaluate {
println '配置阶段完成以后的回调'
}
gradle.buildStarted {
println 'build开始的回调监听'
}
gradle.buildFinished {
println 'build完毕后的回调监听'
}
gradle.beforeProject {
println 'gradle执行前的回调监听'
}
gradle.afterProject {
println 'gradle执行前的回调监听'
}
//在所有子build.gradle(module)文件中添加android 字段
afterEvaluate { project ->//回调
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 {
//设置支持的SO库架构
//'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
// 注:放开'arm64-v8a'会找不到腾讯人脸识别的类库包,>=android7.0 手机会崩溃
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
}
//关闭Android Studio的PNG合法性检查的
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
//减少编译错误和忽略 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默认会有so文件进行压缩优化,加入以下配置可以不压缩so
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
//doNotStrip "*/x86/*.so"
}
//程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
abortOnError false
}
// dex预处理和最多八线程
dexOptions {
// incremental true
preDexLibraries true
maxProcessCount 8
}
//关闭不需要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
}
}
}
}
}
}