美文网首页AndroidAndroid开发Android开发经验谈
(周期计划-6)从公司项目配置看Gradle(2.0)

(周期计划-6)从公司项目配置看Gradle(2.0)

作者: 咸鱼正翻身 | 来源:发表于2018-02-26 11:39 被阅读44次

    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

    相关文章

      网友评论

        本文标题:(周期计划-6)从公司项目配置看Gradle(2.0)

        本文链接:https://www.haomeiwen.com/subject/imtwzxtx.html