第八章 gradle自動化建構系列文章 之 gradle中的屬性
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL4I1R2dXT09CXt92YuIXdn1Wauk2Lc9CX6MHc0RHaiojIsJye.gif)
檢視 “Android自動化建構系列” 全部文章
gradle屬性定義概要
在gralde項目中,每個project都會對應一個build.gradle 檔案,編譯過程中 build.gradle 都會被編譯為 .project位元組碼,所有的腳本gradle檔案最終會被編譯器編譯成 .script位元組碼,是以所有的腳本相當于在一個project類中書寫的
上面是中
gradle
類的源代碼,主要定義了一下的文法規範
project
名稱 | 解釋 | 備注 |
---|---|---|
build.gradle | 工程預設的配置檔案讀取路徑 | 每個項目都會有包括根項目和子項目 |
: | gralde工程中工程或者任務的分隔符 | 所有作業系統中通用 |
build | 存放每個工程的産出 | 每個項目對應自己的一個 |
gradle.property |
項目演變改造
通過前幾個部分的接觸我們發現 gradle不是一個簡單的腳本而是一個完整的程式設計架構,如果我們還是以腳本的特征看待未免顯得太低端了,本着學以緻用我們應該一步步的改進我們的項目
在學習gradle之前我的項目是這樣的,在工程的 build.gradle 檔案中我隻會寫字元串和值得配置
上面這樣配置本身沒有什麼問題,隻是分類不明确,就像雜亂的檔案夾裡面存放着雜亂的屬性,不利于代碼的統一管理和維護
還有一個更緻命的缺陷,當我們的項目變動需要更改依賴配置或者依賴配置的時候,我們需要手動的對每個項目的gradle.build檔案更改,工作你量大,效率低而且很容易出錯,導緻打包失敗
因為原有的方案不完美,我們要對項目進行演變
1. 使用 ext{} 定義擴充屬性
我們可以在項目中定義ext擴充屬性,并且在項目中直接引用,如下圖
//定義擴充屬性
ext {
mMinSdkVersion = 16
mTargetSdkVersion = 26
mVersionCode = 1
mVersionName ="1.0"
}
android {
compileSdkVersion 26
buildTypes {
defaultConfig {
applicationId "com.example.demomore"
minSdkVersion this.mMinSdkVersion
targetSdkVersion this.mTargetSdkVersion
versionCode this.mVersionCode
versionName this.mVersionName
}
}
上面的擴充屬性是定義在一個工程檔案中的,實際開發項目必然包含非常多的庫工程,替換依賴檔案的時候我們不可能逐個修改,太費時間而且非常容易出錯,導緻無法打包
進一步演變,既然子工程可以擷取 rootProject
那我們也可以擷取 rootProject
定義的擴充屬性, 于是我們可以在 rootProject
定義公共的擴充屬性,在子 project中使用
rootProject
rootProject
rootProject
1. 在rootproject 中定義擴充屬性
2. 在子 project中直接引用這些屬性
備注:其實我們是可以這樣簡化書寫的
這樣使用的原因很簡單,gradle 規定父project的所有屬性都是可以被子project繼承的,可以在子project中直接使用
編譯依舊完美,同樣完成了我沒想要的效果
在進一步演化,我們完成最終的版本(通過引入gradle檔案的方式完成)
1. 在項目的根工程或子工程位置定義xxx.gradle檔案
2. 在這個檔案中定義配置資料等,比如可以使用數組的形式,每個部分定義一個數組
//用來存放項目中的所有配置,統一管理而不是每個moudle自己寫一份,
// 修改起來更加友善
ext {
android = [compileSdkVersion: 25,
buildToolsVersion: '25.0.3',
minSdkVersion : 17,
targetSdkVersion : 22,
versionCode : 1,
versionName : "1.0.0"]
signingConfigs = [storeFile : "electicPowerAppKey.jks",
storePassword: "123456789",
keyAlias : "ElecticPower",
keyPassword : "123456789"]
java = [sourceCompatibility: JavaVersion.VERSION_1_7,
targetCompatibility: JavaVersion.VERSION_1_7]
dependencies = [multidex : "com.android.support:multidex",
gson : "com.google.code.gson:gson:2.8.0",
okhttp : "com.squareup.okhttp3:okhttp:3.9.0",
recyclerview: "com.android.support:recyclerview-v7:25.4.0"]
}
- 效如下
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
3. 在rootProject中引入這個gradle檔案,基本類似c的或java的
include
import
apply from: this.file("common.gradle")
-
預設會從調用的項目位置向子項目中查找,直到找到這個gradle檔案,如果找不到會報錯 not found ,修改一下路徑直到找到這個檔案就可以了apply from:file(String path)
4. 在需要完成配置的子項目中配置應用我們完成的調用
- 執行編譯完美運作
總結: 通過上面的演化,我們實作了功能分離,當我們想要項目中的依賴庫檔案更新的時候我們隻需要修改 common.gradle 檔案
2. 通過gradle.properties定義擴充屬性
1. 在檔案 property檔案中定義操作屬性(注意隻支援鍵值對方式的定義)
2. 在setting.gradle中這樣使用
if(hasProperty("isLoadMyLibrary")?isLoadMyLibrary.toBoolean():false){
include ':mylibrary'
}
注意,我們這屬性有可能回去不到,我們使用 hasproperty判斷屬性的存在與否
直接用屬性擷取的值時object類型的,需要我們轉換成我們需要的類型
當然我們還可以将SDK相關的屬性配置在這個地方,然後可以在這個項目工程中去使用
android {
//注意,如果定義屬性的名稱在這個項目工程中已經存在,那麼定義将會失敗,報錯屬性找不到
compileSdkVersion mCompileSdkVersion.toInteger()
....
}