AS 自定义 Gradle plugin 插件 案例 MD
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
AS 自定義 Gradle plugin 插件 案例 MD
目錄
目錄AS 中自定義 Gradle plugin
編寫插件
傳遞參數
發布插件到倉庫
使用插件
AS 中自定義 Gradle plugin
參考1
參考2
結合 AndroidStudio,自定義Gradle plugin可以完成很多功能,比如:添加編譯依賴、進行Aspecj編譯、自動生成混淆配置。
項目中引入自定義 Gradle plugin 一般有三種方法:
- 直接寫在 build.gradle 中,這種方式的缺點是無法復用插件代碼,在其他項目中還得復制一遍代碼
- plugin 源碼放到 rootProjectDir/buildSrc/src/main/groovy 目錄下(沒用過)
- plugin 打包后發布到 maven 倉庫, 然后項目通過依賴的形式引入
下面介紹的是第 3 種方式
編寫插件
1、創建插件 module
新建一個Android工程,在這個工程里面新建一個Android Library,先起名叫 cooker-plugin 吧,我們將會用這個 library 寫 Gradle plugin
2、建立 plugin 的目錄結構
把這個 cooker-plugin 中除了build.gradle文件外的默認文件都刪除,然后按照下面新建文件:
- 在新建的module中新建文件夾src,接著在src文件目錄下新建main文件夾,在main目錄下新建groovy目錄,這時候groovy文件夾會被Android識別為groovy源碼目錄。
- 除了在main目錄下新建groovy目錄外,你還要在main目錄下新建resources目錄,同理resources目錄會被自動識別為資源文件夾。
- 在groovy目錄下新建項目包名,就像Java包名那樣。
- 在resources目錄下新建文件夾META-INF,META-INF文件夾下新建gradle-plugins文件夾。
這樣,就完成了gradle 插件的項目的整體搭建,之后就是小細節了。目前,項目的結構是這樣的:
3、聲明 plugin 信息
在 src/main/resources/META-INF/gradle-plugins 里聲明 plugin 信息,比如新建cooker-plugin.properties文件(文件名 cooker-plugin 是插件名稱),在其中指定插件的實現類的全路徑類名:
4、配置 build.gradle
在 build.gradle 中聲明用 groovy 開發
5、編寫插件邏輯
插件代碼放在 src/main/groovy 下,實現 plugin,其實就是實現 Plugin<Project> 接口
6、生成 plugin 插件
在 cooker-plugin 項目中,build 一下
任務完成以后,就能在build/libs下生成對應的 plugin 插件了
現在這個插件就能使用了,可以發布在本地倉庫或者 Maven 倉庫
傳遞參數
接下來我們介紹如何獲得自定義的參數
1、新建 PluginExtension.groovy,用于定義我們可以支持的參數:
class PluginExtension {def param1 = "param1 defaut"def param2 = "param2 defaut"def param3 = "param3 defaut" }我們希望能傳入嵌套的參數,所以再新建一個 PluginNestExtension.groovy:
class PluginNestExtension {def nestParam1 = "nestParam1 defaut"def nestParam2 = "nestParam2 defaut"def nestParam3 = "nestParam3 defaut" }2、新建一個 CustomTask.groovy,繼承 DefaultTask 類,使用 @TaskAction 注解標注實現的方法:
class CustomTask extends DefaultTask {@TaskActionvoid output() {println "param1 is ${project.pluginExt.param1}"println "param2 is ${project.pluginExt.param2}"println "param3 is ${project.pluginExt.param3}"println "nestparam1 is ${project.pluginExt.nestExt.nestParam1}"println "nestparam2 is ${project.pluginExt.nestExt.nestParam2}"println "nestparam3 is ${project.pluginExt.nestExt.nestParam3}"} }這里我們只是做了拿到了參數,然后做最簡單的輸出操作,使用 ${project.pluginExt.param1} 和 ${project.pluginExt.nestExt.nestParam1} 等拿到使用者設置的值。
3、在 apply 方法中建立映射關系:
project.extensions.create('pluginExt', PluginExtension) project.pluginExt.extensions.create('nestExt', PluginNestExtension) project.task('customTask', type: CustomTask)4、定義外部參數,這里我們定義了param1,param2,nestParam1,nestParam2,而param3和nestParam3保持默認。
pluginExt {param1 = 'app param1'param2 = 'app param2'nestExt {nestParam1 = 'app nestParam1'nestParam2 = 'app nestParam2'} }這樣之后,在執行customTask時就會輸出使用者對自定義的參數設置的值
發布插件到倉庫
發布到倉庫的方式有很多,下面只介紹利用 mavenDeployer 插件發布在本地倉庫
1、引入 mavenDeplayer 插件
修改 cooker-plugin 的 build.gradle,添加如下內容:
2、用 uploadArchices 發布
運行 uploadArchives 就能在設置的倉庫路徑中生成 cooker-plugin 了
使用插件
1、在 build.gradle 中引入 cooker-plugin
buildscript {repositories {jcenter()maven {url uri('release') //cooker-plugin 所在的倉庫,這里是本地目錄(相對當前 build.gradle 的路徑)}}dependencies {classpath 'com.android.tools.build:gradle:3.2.1'classpath 'com.helen.plugin:cooker-plugin:1.0' //引入cooker-plugin} } apply plugin: 'cooker-plugin'2、我們編譯 App 的時候 cooker-plugin 就會介入了
每次 clean/build 時, 在 Gradle Console 可以看到我們的 log
3、使用 cooker-plugin 中定義的 task
前面demo中,我們新建了兩個task: cooker-test-task和customTask, 我們可以通過兩種方式運行這兩個task,一種方式是雙擊 app > other 分類下的 task 名,一種是通過 gradlew 命令
cooker-test-task 打印的日志:
Executing tasks: [cooker-test-task]這里實現plugin的邏輯! :app:cooker-test-task 自定義任務-doFirst 自定義任務-doLastcustomTask 打印的日志:
Executing tasks: [customTask]這里實現plugin的邏輯! :app:customTask param1 is app param1 param2 is app param2 param3 is param3 defaut nestparam1 is app nestParam1 nestparam2 is app nestParam2 nestparam3 is nestParam3 defaut到此為止, 自定義Gradle plugin的基本過程就介紹完了。
2019-2-11
轉載于:https://www.cnblogs.com/baiqiantao/p/10362507.html
總結
以上是生活随笔為你收集整理的AS 自定义 Gradle plugin 插件 案例 MD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Do you have an Engli
- 下一篇: 梦到杀羊是什么意思周公解梦