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)寫在前面開始尾聲