天天看點

(周期計劃-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)寫在前面開始尾聲
個人公衆号

繼續閱讀