Gradle外掛學習筆記(二)

mymdeep發表於2018-01-25

之前介紹了Gradle外掛的開發,這次會對功能進行一部分擴充,建議沒有讀過第一篇文章的朋友,先看一下Gradle外掛學習筆記(一)


Extension

之前的文章提到過,如何編寫一個外掛,但是並不能通過外面傳遞引數進來,如果想使用一些自定義的引數可以使用Extension,我們可以再建立一個MyExtension.groovy

class MyExtension {
    def aaa;
    def bbb;
   
}
複製程式碼

然後找到外掛類(可以參考上一篇文章):

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。

這裡在普及一個小知識,專案中gradle執行的時候,會先解析setting.gradle,然後是build.gradle,如果想在解析build.gradle之前做點事,可以使用project.beforeEvaluate如果想在解析build.gradle之後做點事可以project.afterEvaluate。

所以我們在解析完build.gradle之後,在訪問project中我們設定的屬性,即可得到build.gradle中設入的值。 來看個例子(其中hhh就是我們寫的外掛名字,這個上篇文章提到過):

apply plugin: 'hhh'
deep{
    aaa="this is a"
    bbb="this is b"
}
複製程式碼

執行任務列印:

Gradle外掛學習筆記(二)

android

通過上面的例子,我想到了正經的android工程不是也是這樣配置的嗎,我們可以測試一下。 都知道android工程中的project,樣式如下:

android {
 compileSdkVersion 26
    buildToolsVersion "26.0.3"
    defaultConfig {
        applicationId "deep.com.testgroovy"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }
}

複製程式碼

這些不都是project的一個擴充類嗎?我們可以測試一下,修改外掛:

    @Override
    void apply(Project project) {

        project.afterEvaluate {
                println("包名:"+project['android']["defaultConfig"].applicationId)
        }
複製程式碼

我取project下的android,然後再取android下的defaultConfig,就可以得到包名,執行一下看看:

Gradle外掛學習筆記(二)
果然可以獲取包名,同理,在打包的時候可以拿到更多的設定資訊。

總結

好了今天有點時間,先寫這麼多吧,下篇文章具體說一下如何幹預android編譯 也歡迎關注我的公眾號,之後會推薦更多好用的元件庫。

Gradle外掛學習筆記(二)

相關文章