(周期计划-6)从公司项目配置看Gradle(2.0)
2018年技术周期计划:周期计划-6(2018/2/5-2018/2/11)
写在前面
https://www.jianshu.com/p/8242dcc90f91
之前写过一篇博客,博客内容是关于项目中对Gradle的配置升级。主要好处是更方便的管理依赖库的版本问题,和更方便的进行App的版本信息的升级。
那么这次的博客内容,是基于上一篇博客内容的一次升级。其内容不光是用于进一步方便去管理依赖库,也增加了一些gradle上使用的小技巧。
开始
1.0时代的gradle配置,我们是在dependencies.gradle中这么配置版本信息,也就是说版版本号直接写在了dependencies.gradle中。
ext {
compileSdkVersion = 26
buildToolsVersion = "26.0.2"
targetSdkVersion = 22
minSdkVersion = 19
supportLibraryVersion = '25.3.1'
//省略部分内容
}
而2.0的gradle配置,把版本号又进行了一次抽取,把版本号信息,全部写在了gradle.properties文件之中。让我们来看一下代码:
gradle.properties内容
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.2
TARGET_SDK_VERSION=22
MIN_SDK_VERSION=19
ANDROID_SUPPORT_VERSION='25.3.1'
dependencies.gradle改进后内容
ext {
//这种写法是没有必要的了,只为了循序渐进的展示过程
compileSdkVersion = COMPILE_SDK_VERSION
buildToolsVersion = BUILD_TOOLS_VERSION
targetSdkVersion = TARGET_SDK_VERSION
minSdkVersion = MIN_SDK_VERSION
supportLibraryVersion = ANDROID_SUPPORT_VERSION
//省略部分内容
}
这里涉及到一个知识点,那就是我们为什么能够在 dependencies.gradle中直接使用我们在gradle.properties中声明的变量,那是因为gradle.properties文件会被gradle所加载,而其中我们声明的变量可以当做一个全局的变量去使用。因此,我们就没有必要在ext中再多此一举的那么赋值了。我们直接在build.gradle中使用即可:
android {
buildToolsVersion BUILD_TOOLS_VERSION as String
compileSdkVersion COMPILE_SDK_VERSION as int
defaultConfig {
applicationId "包名"
minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int
}
//省略部分内容
}
子模块
到这里,主module的配置可以说一帆风顺,并没有什么问题。但是子模块就不适用这种方式了,因为我们的子module一般来说是一个相对独立的项目。我们有时可能不需要主module的配置信息,因此我们需要自己覆盖或者自定义。
因此我们的子module在使用这种方式去配置gradle时需要一个加载自定义properties文件的过程。
首先还是让我们先看一看子module的properties文件。这里我新建了一个叫做config.properties的文件。
config.properties内容
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.2
TARGET_SDK_VERSION=22
MIN_SDK_VERSION=16
因为这里我们使用了一个自定义的properties,因此我们需要自己去加载这个文件,去拿文件对应的值。
我们可以写一个方法,用于完成这项工作:
def getConfigProperty(String configName) {
def versionPropsFile = file('config.properties')
def versionProps = new Properties()
versionProps.load(versionPropsFile.newReader())
return versionProps.getProperty(configName)
}
我们如何使用呢?很简单,COMPILE_SDK_VERSION就是从config.properties文件中读取的值。
def COMPILE_SDK_VERSION = hasProperty('COMPILE_SDK_VERSION') ? property('COMPILE_SDK_VERSION') : getConfigProperty('COMPILE_SDK_VERSION')
因此我们在子module的gradle文件中可以很方便的这样去获取我们自定义的文件:
def COMPILE_SDK_VERSION = getConfigProperty('COMPILE_SDK_VERSION')
def BUILD_TOOLS_VERSION = getConfigProperty('BUILD_TOOLS_VERSION')
android {
compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION as String
//省略部分内容
}
当然到这里,可能很多朋友会觉得这样搞太麻烦了。其实这就是仁者见仁智者见智吧,如果觉得麻烦,通过这里的思路其实也可以转换成去gradle脚本的学习,也不失为一种收获吧。
小用法
上述内容都是我们在gradle文件中搞事情,那如果我们想在java文件中使用gradle.properties的内容怎么办?当然很好办。
buildTypes {
debug {
buildConfigField "String" "COMPILE_SDK_VERSION" "\"${COMPILE_SDK_VERSION}\""
}
//省略部分内容
}
这样声明完之后,我们可以直接在java文件中这样使用BuildConfig.COMPILE_SDK_VERSION
我们还可以定义成xml中使用的变量。
buildTypes {
debug {
resValue "string", "compile_sdk_version", "\"${COMPILE_SDK_VERSION}\""
}
//省略部分内容
}
这样声明过后,我们可以直接在xml中这么调用@string/compile_sdk_version
尾声
Gradle的小小用法先暂时记录到这,以后会保持对Gradle的学习与记录。
本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect