天天看點

第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性

第八章 gradle自動化建構系列文章 之 gradle中的屬性

第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性

檢視 “Android自動化建構系列” 全部文章

gradle屬性定義概要

第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性

在gralde項目中,每個project都會對應一個build.gradle 檔案,編譯過程中 build.gradle 都會被編譯為 .project位元組碼,所有的腳本gradle檔案最終會被編譯器編譯成 .script位元組碼,是以所有的腳本相當于在一個project類中書寫的

第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
上面是

gradle

project

類的源代碼,主要定義了一下的文法規範
名稱 解釋 備注
build.gradle 工程預設的配置檔案讀取路徑 每個項目都會有包括根項目和子項目
: gralde工程中工程或者任務的分隔符 所有作業系統中通用
build 存放每個工程的産出 每個項目對應自己的一個
gradle.property

項目演變改造

通過前幾個部分的接觸我們發現 gradle不是一個簡單的腳本而是一個完整的程式設計架構,如果我們還是以腳本的特征看待未免顯得太低端了,本着學以緻用我們應該一步步的改進我們的項目
在學習gradle之前我的項目是這樣的,在工程的 build.gradle 檔案中我隻會寫字元串和值得配置
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
上面這樣配置本身沒有什麼問題,隻是分類不明确,就像雜亂的檔案夾裡面存放着雜亂的屬性,不利于代碼的統一管理和維護
還有一個更緻命的缺陷,當我們的項目變動需要更改依賴配置或者依賴配置的時候,我們需要手動的對每個項目的gradle.build檔案更改,工作你量大,效率低而且很容易出錯,導緻打包失敗
因為原有的方案不完美,我們要對項目進行演變

1. 使用 ext{} 定義擴充屬性

我們可以在項目中定義ext擴充屬性,并且在項目中直接引用,如下圖
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
//定義擴充屬性
	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中使用

1. 在rootproject 中定義擴充屬性
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
2. 在子 project中直接引用這些屬性
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
備注:其實我們是可以這樣簡化書寫的
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
這樣使用的原因很簡單,gradle 規定父project的所有屬性都是可以被子project繼承的,可以在子project中直接使用
編譯依舊完美,同樣完成了我沒想要的效果

在進一步演化,我們完成最終的版本(通過引入gradle檔案的方式完成)

1. 在項目的根工程或子工程位置定義xxx.gradle檔案
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 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的

include

或java的

import

apply from: this.file("common.gradle")
           
  • apply from:file(String path)

    預設會從調用的項目位置向子項目中查找,直到找到這個gradle檔案,如果找不到會報錯 not found ,修改一下路徑直到找到這個檔案就可以了
4. 在需要完成配置的子項目中配置應用我們完成的調用
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
  • 執行編譯完美運作

總結: 通過上面的演化,我們實作了功能分離,當我們想要項目中的依賴庫檔案更新的時候我們隻需要修改 common.gradle 檔案

2. 通過gradle.properties定義擴充屬性

1. 在檔案 property檔案中定義操作屬性(注意隻支援鍵值對方式的定義)
第八章 gradle自動化建構系列文章 之 gradle中的屬性 第八章 gradle自動化建構系列文章 之 gradle中的屬性
2. 在setting.gradle中這樣使用
if(hasProperty("isLoadMyLibrary")?isLoadMyLibrary.toBoolean():false){
	include ':mylibrary'
}
           

注意,我們這屬性有可能回去不到,我們使用 hasproperty判斷屬性的存在與否

直接用屬性擷取的值時object類型的,需要我們轉換成我們需要的類型

當然我們還可以将SDK相關的屬性配置在這個地方,然後可以在這個項目工程中去使用
android {
	//注意,如果定義屬性的名稱在這個項目工程中已經存在,那麼定義将會失敗,報錯屬性找不到
	compileSdkVersion mCompileSdkVersion.toInteger()
	....
}
           

檢視 “Android自動化建構系列” 全部文章

繼續閱讀