AS 自定義 Gradle plugin 插件 案例 MD

Markdown版本筆記我的GitHub首頁我的博客我的微信我的郵箱
MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@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 是插件名稱),在其中指定插件的實現類的全路徑類名:

implementation-class=com.helen.plugin.CookerPlugin

4、配置 build.gradle
在 build.gradle 中聲明用 groovy 開發

apply plugin: 'groovy'dependencies {compile gradleApi()compile localGroovy()
}repositories {mavenCentral()
}

5、編寫插件邏輯
插件代碼放在 src/main/groovy 下,實現 plugin,其實就是實現 Plugin<Project> 接口

package com.helen.pluginimport org.gradle.api.Plugin
import org.gradle.api.Projectclass CookerPlugin implements Plugin<Project> {@Overridevoid apply(Project project) {println "這里實現plugin的邏輯!"project.task('cooker-test-task').doLast { variant ->println "自定義任務-doLast"}.doFirst { variant ->println "自定義任務-doFirst"}}
}

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,添加如下內容:

apply plugin: 'maven'//添加maven plugin,用于發布我們的jar
uploadArchives {repositories {mavenDeployer {pom.groupId = 'com.helen.plugin'pom.artifactId = 'cooker-plugin'pom.version = 1.0repository(url: uri('../release'))   //文件發布目錄(相對當前 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

這里實現plugin的邏輯!

3、使用 cooker-plugin 中定義的 task
前面demo中,我們新建了兩個task: cooker-test-taskcustomTask, 我們可以通過兩種方式運行這兩個task,一種方式是雙擊 app > other 分類下的 task 名,一種是通過 gradlew 命令

cooker-test-task 打印的日志:

Executing tasks: [cooker-test-task]這里實現plugin的邏輯!
:app:cooker-test-task
自定義任務-doFirst
自定義任務-doLast

customTask 打印的日志:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395188.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學好Java的10個建議

1.克服慣性  將大塊任務細分為微任務。  2.關注大牛  你想學的或許是一門新的編程語言、應用框架或者是新的工具&#xff0c;一旦你確定了想要的是什么&#xff0c;就立刻去收集相應的優秀群體所做的一些優質的工作成果。這些可以從YouTube、Vimeo、HackerNews、各種博客…

中英文對照 —— 機械

0. 汽車 relay&#xff1a;繼電器&#xff0c;clutch&#xff1a;離合&#xff1b; motor&#xff1a;發動機&#xff08;馬達&#xff09;&#xff1b;檔位&#xff1a; park&#xff1a;停車擋braking&#xff1a;制動&#xff08;也就是剎車&#xff09;空擋&#xff1a;neu…

電子郵件鏈接mailto_“ 3個鏈接”電子郵件的歷史記錄以及曾經發送的每個鏈接的存檔...

電子郵件鏈接mailtoby Quincy Larson昆西拉爾森(Quincy Larson) “ 3個鏈接”電子郵件的歷史記錄以及曾經發送的每個鏈接的存檔 (The history of the “3 links” email and an archive of every link ever sent) It was March 2016. The freeCodeCamp community was growing.…

機票垂直搜索引擎的性能優化

機票垂直搜索引擎的性能優化 原文:機票垂直搜索引擎的性能優化一、行業背景與垂直搜索我們先了解一下機票的行業背景&#xff0c;下圖是由中航信統計的數據&#xff0c;藍色的曲線代表平均每公里的票價&#xff0c;紅色曲線指的是客運量。從2011年到2016年&#xff0c;無論是國…

2015國內征信機構大數據整合能力對比

自2001年起&#xff0c;大陸地區現代企業征信業進入在競爭中發展的階段&#xff0c;信用問題開始得到社會各界的廣泛關注&#xff0c;許多政府和民間投資的企業征信機構攜帶大量資本如雨后春筍般出現。 隨著企業征信行業環境不斷改善&#xff0c;信息透明度低的問題日益凸顯。大…

Unity3D 裝備系統學習Inventory Pro 2.1.2 基礎篇

前言 前一篇 Unity3D 裝備系統學習Inventory Pro 2.1.2 總結 基本泛泛的對于Inventory Pro 這個插件進行了講解&#xff0c;主要是想提煉下通用裝備系統結構和類體系。前兩天又讀了另一個插件 C# Inventory-uGui v2.0.1的源碼&#xff08;應該也是老外寫的&#xff09;&#xf…

Java項目問題_Java項目出現的問題01----學習

0 運行環境MyEcplise2016Tomcat8.01今天在html的表格提交跳轉時發現&#xff0c;想要提交到自己寫servlet程序中&#xff0c;卻發現總是出錯http://localhost:8080/Test4/Test4/fail.html多出一個項目路徑/Test4&#xff0c;但是程序沒有任何問題&#xff0c;最后發現是在Ecpli…

express-cli入門_使用Express.js入門

express-cli入門by Victor Ofoegbu由Victor Ofoegbu 使用Express.js入門 (Getting off the ground with Express.js) 使用Node.js框架編寫Web應用 (Writing web apps with the Node.js framework) A common moment of truth is when you develop a lot of applications that n…

《瘋狂前端開發講義jQuery+Angular+Bootstrap前端開發實踐》學習筆記

《瘋狂前端開發講義jQueryAngularBootstrap前端開發實踐》學習筆記 二〇一九年二月十三日星期三2時28分54秒 前提&#xff1a;本書適合有初步HTML、CSS、JavaScript基礎的讀者&#xff0c;或對企業應用前端開發不太熟悉的開發人員。 第1章&#xff1a;前端開發與Ajax技術 要點&…

混合云:公共云和私有云之間取得平衡的方式?

在可預見的未來&#xff0c;混合云是現實的&#xff0c;但真正的收獲是試圖找出企業最終朝向公共或私人資源是否平衡。 你在與任何技術供應商溝通時&#xff0c;也許會涉及到數據中心&#xff0c;但大多會提到云計算的三種方式&#xff1a;私有云&#xff0c;公共云&#xff0c…

騰騰流氓,云云更流氓(問微信怎樣接入支付寶支付),手賤的趕緊點,你會感謝我的...

草原上的兩匹馬&#xff01; 打從當年微信開始布局公眾號之初時&#xff0c;估計就已經想到了與支付寶正面沖突的場面&#xff0c;所以微信先來個瞞天過海&#xff0c;在春晚搞了個微信紅包&#xff0c;那叫一個火呀&#xff0c;此時的云云隱隱感覺到些許不安。 早期的微信開發…

java中的string是什么_什么是String

2017-07-28String和StringBufString namenew String("HuangWeiFeng");System。out。println(name"is my name");看似已經很精簡了&#xff0c;其實并非如此。為了生成二進制的代碼&#xff0c;要進行如下的步驟和操作&#xff1a;(1) 生成新的字符串 new S…

詳解華為與三星專利之爭 律師稱可能會打持久戰

華為技術有限公司(下稱“華為”)起訴三星&#xff0c;在近期中國企業起訴外企的“潮流”中掀起不小的漩渦。 “叫好聲”認為&#xff0c;這是已經擁有專利積累的中國企業在國際舞臺上的一次“實力亮相”&#xff0c;這件事本身就是中國制造業的勝利&#xff1b;“陰謀論者”認為…

租金 預測_如何預測租金并優化租賃期限,從而節省資金

租金 預測by Zhen Liu劉震 如何預測租金并優化租賃期限&#xff0c;從而節省資金 (How to Predict Rent and Optimize Your Lease Duration So You Can Save Money) In my last post, we talked about how to pick the best month to sign the lease based on seasonality. No…

java system load_關于java的System.load 和 System.loadLibrary

關于兩者的區別(參見http://blog.csdn.net/ring0hx/article/details/3242245)System.load 參數為庫文件的絕對路徑&#xff0c;可以是任意路徑。System.loadLibrary方法load的為相對路徑&#xff0c;即在java.library.path定義下的lib文件&#xff0c;文件名會更具不同的系統實…

東進技術南亞創捷

深圳市東進技術在其海外市場拓展中取得又一驕人戰績&#xff0c;于四月下旬與印度One97通信公司簽訂了長期戰略合作協議&#xff0c;One97將全面采用東進的全系列產品。同時簽訂的一期采購計劃&#xff0c;總裝機端口數約3萬線。該合約主要涉及東進技術的領先主打產品——Keygo…

如何在5分鐘內通過身份驗證構建RESTful API —全部從命令行(第1部分)

by Niharika Singh由Niharika Singh 如何在5分鐘內通過身份驗證構建RESTful API —全部從命令行(第1部分) (How to Build a RESTful API with Authentication in 5 minutes — all from your command line (Part 1)) If the title of this article excites you, then my frien…

MD5與SHA1

一、MD5 MD5消息摘要算法&#xff08;英語&#xff1a;MD5 Message-Digest Algorithm&#xff09;&#xff0c;一種被廣泛使用的密碼散列函數&#xff0c;可以產生出一個128位&#xff08;16字節&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于確保信…

java基本類型的默認值及其取值范圍

轉載于:https://www.cnblogs.com/billyu/p/5843845.html

tair client java_TFS(Taobao File System)Java Client 使用經驗

TFS Java客戶端的說明tfs-client-java版本選擇&#xff1a;---------------------------------------tfs-client-java的版本有&#xff1a;release-2.0.0/tfs-with-large-2.1.1/tfs-client-java-2.1.3/release-2.2.2/release-2.2.3/release-2.2.4/release-2.2.6/最終我選用了tf…