1. gradle自定义常量的原因
在多module中,gradle文件里存在大量常量,而且基本上是相同的。在项目或者依赖库版本升级的时候,修改起来十分的不友好。一两个module时可能无所谓,但是正常开发中可能涉及到十几个module的情况,一方面是修改起来十分不友好,工作量太大,一方面可能出现漏改的情况,导致依赖冲突、打包失败等的问题。这个时候就可以通过自定义全局常量来改变这种情况。
2. 自定义常量的方法
gradle可以通过ext来自定义常量,要做到常量共用的话,就要在根节点下的build.gradle文件中进行常量定义。
写法1
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {
android = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
applicationId : "com.geeboo.jetpackproject",
minSdkVersion : 16,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
libs = [
libAndroidAppcompat: 'androidx.appcompat:appcompat:1.1.0',
libAndroidConstraintlayout: 'androidx.constraintlayout:constraintlayout:1.1.3',
libJunit: 'junit:junit:4.12',
libTestJunit: 'androidx.test.ext:junit:1.1.1',
libTestEspresso: 'androidx.test.espresso:espresso-core:3.2.0'
]
}
直接在build.gradle中进行定义,这种方式在自定义常量太多时,看起来似乎不太舒服,而且根结点的gradle中经常需要配置一些其他的东西,可能导致整个文件一大堆代码。所以还可以用插件的方式单独进行常量定义
写法2
在根目录下创建一个common.gradle文件(文件名称随意)专门用来定义常量
ext {
android = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
applicationId : "com.xxx.xxx",
minSdkVersion : 16,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
libs = [
libAndroidAppcompat: 'androidx.appcompat:appcompat:1.1.0',
libAndroidConstraintlayout: 'androidx.constraintlayout:constraintlayout:1.1.3',
libJunit: 'junit:junit:4.12',
libTestJunit: 'androidx.test.ext:junit:1.1.1',
libTestEspresso: 'androidx.test.espresso:espresso-core:3.2.0'
]
}
然后在根节点下的build.gradle中添加 apply from: file(‘common.gradle’)
apply from: file('common.gradle')
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
3. 使用常量的方法
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation libs.libAndroidAppcompat
implementation libs.libAndroidConstraintlayout
testImplementation libs.libJunit
androidTestImplementation libs.libTestJunit
androidTestImplementation libs.libTestEspresso
}
跟未修改前的代码对比一下,修改后的看起来简直不能太爽。