gradle插件的開發方式 就目前知道有二種html
1.直接在gradle文件內用groovy寫,並直接引用java
2.建立buildSrc目錄單獨編譯再引用android
實現原理上同樣的,可是第二種更易於管理與發佈,因此本文便以第二種方式來實踐 文末爲會附上第一種方式的實踐代碼web
tips:基於
buildSrc
下groovy的就不記錄了,大同小異。着重記錄使用kotlin來自定義插件markdown
只能叫這個名字,
buildSrc
是gradle預留的插件開發目錄 固然這只是android studio環境下的方式,其餘方式參考官方文檔便可 編譯提示 'buildSrc' cannot be used as a project name as it is a reserved name 從settings.gradle裏刪除buildSrc從新編譯就行,這畢竟是在android開發工具下,稍有水土不服app
若是不用kotlin 能夠忽略 使用groovy時除了java版本號之外其餘都可刪除 順帶一提代碼位置在
src/main/kotlin
與src/main/java
均可以 不過只有一個有效,優先java目錄jvm
// 使用 plugins 塊語法應用插件
plugins {
// 應用 kotlin 插件
id 'org.jetbrains.kotlin.jvm' version '1.3.72'
}
repositories {
google()
jcenter()
}
dependencies {
// 僅在編譯時使用 Grdale-API 依賴
// compileOnly gradleApi() 目前暫時不知道gradleApi的做用 因此保持註釋
// 在插件源碼中添加 kotlin 標準庫依賴
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
複製代碼
android studio IDE下,建立完buildSrc會自動生成一個插件類,但它沒繼承插件接口ide
須要稍微改改函數
class GrockPlugin :Plugin<Project> {
override fun apply(project: Project) {
println("GrockPlugin apply")
}
}
複製代碼
若是找不到Plugin這個接口,不要慌。依賴一下gradle就行 打開
buildSrc
的build.gradle 添加依賴,gradle_version是項目根目錄的gradle插件版本工具
dependencies {
implementation "com.android.tools.build:gradle:$gradle_version"
}
複製代碼
按照文檔要求整個聲明文件便可
按以下目錄建立一個[外部引用時的插件名稱].properties
文件
|____main
| |____resources
| | |____META-INF
| | | |____gradle-plugins
| | | | |____com.grock.properties
複製代碼
如上此插件名爲com.grock
打開[外部引用時的插件名稱].properties文件,在其中指定插件類
implementation-class=com.grock.plugin.GrockPluginJava
複製代碼
新建一個module 引用便可
apply plugin:'com.grock'
複製代碼
sync 查看日誌
GrockPlugin apply
複製代碼
爲何快馬加鞭要先搞個拓展函數呢,基於目前的思考這東西能拿來當配置,因此優先嚐試學習 相似於常見的android{}函數同樣
open class GrockExtension {
var name= "GrockExtension original-name"
}
複製代碼
override fun apply(project: Project) {
//建立拓展函數,拓展函數名稱,拓展函數類
val extensionFun = project
.extensions.create("grockName",GrockExtension::class.java)
project.afterEvaluate {
println("GrockPlugin-kotlin afterEvaluate:${extensionFun.name}")
}
}
複製代碼
建立代碼很好理解,最後兩行的意義何在呢?爲何不直接打印呢? 緣由很是簡單,建立完拓展函數,插只是建立完這個拓展函數而在afterEvaluate回調時,插件已完成準備階段,拓展函數都已讀取,此時才能獲取到拓展函數內的值
apply plugin:'com.grock'
grockName{
name "newName"
}
複製代碼
打印內容:
GrockPlugin-kotlin afterEvaluate:newName
複製代碼
插件代碼:
class GrockPlugin implements Plugin<Project>{
@Override
void apply(Project target) {
println "GrokcPlugin apply"
// 建立拓展函數,聲明拓展函數名 傳入拓展類
def extension = target.extensions.create("nameFunction",GrockExtension)
target.afterEvaluate {//放在插件加完後執行,避免擴展函數未建立完成就訪問
println " apply extension.name=${extension.name}"
}
}
}
class GrockExtension{
def name = "GrockExtension"
}
//從上到下逐個執行
apply plugin:GrockPluginJava
nameFunction {
name("extension-name") //setName("s")
}
複製代碼
插件引用:直接引用插件類
groovy語法上能夠省略class
apply plugin:GrockPlugin
複製代碼
參考: