1. 常見用法
1. 在ext這個map中放字符串或者基本數(shù)據類型
在android的rootProject的build.gradle中众羡,定義如下代碼塊
ext {
? ? compileSdkVersion = 25
? ? buildToolsVersion = "26.0.0"
? ? minSdkVersion = 14
? ? targetSdkVersion = 22
? ? appcompatV7 = "com.android.support:appcompat-v7:$androidSupportVersion"
}
然后在app模塊下窖剑,通過
rootProject.ext.compileSdkVersionrootProject.ext.buildToolsVersion
這種方式來訪問在根目錄build.gradle下定義的變量消略。
2. 在ext這個map中再map
新建一個config.gradle文件
在里面填充
ext {
? ? //創(chuàng)建了一個名為android的瘪菌,類型為map的變量般此,groovy中可以用[]來創(chuàng)建map類型朦肘。那么就是一個map下面又創(chuàng)? ?
? ? //建了一個map担映,且名字叫做android砍濒。
? ? android = [
? ? ? ? ? ? compileSdkVersion: 23,
? ? ? ? ? ? buildToolsVersion: "23.0.2",
? ? ? ? ? ? minSdkVersion? ? : 14,
? ? ? ? ? ? targetSdkVersion : 22,
? ? ]
? ? dependencies = [
? ? ? ? ? ? appcompatV7': 'com.android.support:appcompat-v7:23.2.1',
? ? ? ? ? ? design? ? ? : 'com.android.support:design:23.2.1'
? ? ]
}
然后在根目錄的build.gradle的頭部應用這個腳本:
apply from: "config.gradle"
那么在app/build.gradle中淋肾,可以直接這樣用:
android {
? ? compileSdkVersion rootProject.ext.android.compileSdkVersion
? ? buildToolsVersion rootProject.ext.buildToolsVersion
? ? defaultConfig {
? ? ? ? applicationId "com.wuxiaolong.gradle4android"
? ? ? ? minSdkVersion rootProject.ext.android.minSdkVersion
? ? ? ? targetSdkVersion rootProject.ext.android.targetSdkVersion
? ? ? ? versionCode 1
? ? ? ? versionName "1.0"
? ? }
...
dependencies {
? ? compile fileTree(dir: 'libs', include: ['*.jar'])
? ? testCompile 'junit:junit:4.12'
? ? compile rootProject.ext.dependencies.appcompatV7
? ? compile rootProject.ext.dependencies.design
}
3. 在ext這個map中放入函數(shù)類型的變量
//用{}來創(chuàng)建函數(shù)類型對象,即閉包爸邢,賦值給變量myMethodext.myMethod = { param1, param2 ->? ? // 閉包體}
比如在rootProject中創(chuàng)建樊卓,那么任何一個其他的project對象都可以通過下面的方式訪問到這個方法。
rootProject.ext.myMethod("1","2")
2. 是什么:
根據ext屬性的官方文檔杠河,ext屬性是ExtensionAware類型的一個特殊的屬性碌尔,本質是一個Map類型的變量,而
ExtentionAware接口的實現(xiàn)類為Project,Settings,Task,SourceSet等券敌,ExtentionAware可以在運行時擴充屬性唾戚,而這里的ext,就是里面的一個特殊的屬性而已待诅。如下圖:
關于ExtensionAware的大概的解釋:該接口的子類型為Project,Settings,Task,SourceSet叹坦,他們都有一個變量叫做extensions(我猜想該變量也是一個類似map的實現(xiàn)原理),可以往該變量中放置屬性卑雁。
3. 使用ext屬性的優(yōu)勢
用ext屬性募书,和直接在build.gradle中用def定義變量的好處是什么?
ext屬性可以伴隨對應的ExtensionAware對象在構建的過程中被其他對象訪問测蹲,例如你在rootProject中聲明的ext中添加的內容莹捡,就可以在任何能獲取到rootProject的地方訪問這些屬性,而如果只在rootProject/build.gradle中用def來聲明這些變量扣甲,那么這些變量除了在這個文件里面訪問之外篮赢,其他任何地方都沒辦法訪問。
這是因為在build.gradle中直接定義的屬性文捶,只是作為gradle構建的生命周期中的Configuration階段的局部變量而已(我在Gradle構建的生命周期和其對象的理解中猜想該階段是在執(zhí)行Project對象的構造函數(shù))荷逞,而往ext屬性中寫入變量,則可以在整個構建的生命周期都訪問到那些變量粹排。
此外要注意,ext屬性是屬于擁有他的相應的對象的涩澡,比如Project對象顽耳,因此只要能訪問到對應的Project對象,就能訪問到對應的ext屬性
thanks:
http://wuxiaolong.me/2016/03/31/gradle4android2/
https://stackoverflow.com/questions/37186108/gradle-def-vs-ext