以前介紹了Gradle插件的開發,此次會對功能進行一部分拓展,建議沒有讀過第一篇文章的朋友,先看一下Gradle插件學習筆記(一)java
以前的文章提到過,如何編寫一個插件,可是並不能經過外面傳遞參數進來,若是想使用一些自定義的參數可使用Extension,咱們能夠再創建一個MyExtension.groovyandroid
class MyExtension {
def aaa;
def bbb;
}
複製代碼
而後找到插件類(能夠參考上一篇文章):bash
public class TestPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create("deep", MyExtension)
project.afterEvaluate {
MyExtension extension = project['deep'];
String a = extension.aaa
String b = extension.bbb
println("deep:${a},${b}")
}
}
}
複製代碼
Project自己是支持拓展的,因此提供了create
方法,project.extensions.create("deep", MyExtension)
這句代碼的意思是將咱們的自定義的類做爲Project的一個屬性值,key是deep。app
這裏在普及一個小知識,項目中gradle執行的時候,會先解析setting.gradle,而後是build.gradle,若是想在解析build.gradle以前作點事,可使用
project.beforeEvaluate
若是想在解析build.gradle以後作點事能夠project.afterEvaluate。ide
因此咱們在解析完build.gradle以後,在訪問project中咱們設置的屬性,便可獲得build.gradle中設入的值。 來看個例子(其中hhh就是咱們寫的插件名字,這個上篇文章提到過):學習
apply plugin: 'hhh'
deep{
aaa="this is a"
bbb="this is b"
}
複製代碼
執行任務打印: 測試
經過上面的例子,我想到了正經的android工程不是也是這樣配置的嗎,咱們能夠測試一下。 都知道android工程中的project,樣式以下:gradle
android {
compileSdkVersion 26
buildToolsVersion "26.0.3"
defaultConfig {
applicationId "deep.com.testgroovy"
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
}
複製代碼
這些不都是project的一個拓展類嗎?咱們能夠測試一下,修改插件:ui
@Override
void apply(Project project) {
project.afterEvaluate {
println("包名:"+project['android']["defaultConfig"].applicationId)
}
複製代碼
我取project下的android,而後再取android下的defaultConfig,就能夠獲得包名,執行一下看看: this
果真能夠獲取包名,同理,在打包的時候能夠拿到更多的設置信息。好了今天有點時間,先寫這麼多吧,下篇文章具體說一下如何幹預android編譯 也歡迎關注個人公衆號,以後會推薦更多好用的組件庫。