天天看点

(周期计划-6)从公司项目配置看Gradle(2.0)写在前面开始尾声

2018年技术周期计划:周期计划-6(2018/2/5-2018/2/11)

写在前面

https://www.jianshu.com/p/8242dcc90f91

之前写过一篇博客,博客内容是关于项目中对Gradle的配置升级。主要好处是更方便的管理依赖库的版本问题,和更方便的进行App的版本信息的升级。

感兴趣的看官,可以看看我的其他文章:

1、常用集合的源码分析:HashMap 2、Java反射实践:从反射中理解class 3、从公司项目配置看Gradle

那么这次的博客内容,是基于上一篇博客内容的一次升级。其内容不光是用于进一步方便去管理依赖库,也增加了一些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
2018年7月2号,我正式开始了自己的Android工作,为了能够让自己能够好好完成工作,并且能够快速得到技术提升。所以打算以公众号的方式去敦促自己学习,我会把自己日常的学习笔记发布到公众号上,如果可以,共同进步!~
(周期计划-6)从公司项目配置看Gradle(2.0)写在前面开始尾声
个人公众号

继续阅读