Android如何自定义Gradle插件
Android-如何自定義gradle插件
自定義gradle插件可以實現(xiàn)定制自己的構(gòu)建流程,以達到復(fù)用目的;
##1. 自定義插件方式
自定義插件有三種方式
添加腳步
在你的app項目的build.gradle中直接使用groovy腳步語言編寫插件
這樣方式好處是插件能自動變異且被包含到構(gòu)建腳步中,你無需做任何處理;缺點是插件到邏輯都放到都build.gradle中去了,增加了腳步的復(fù)雜度且無法復(fù)用
添加buildSrc工程
在根目錄添加buildSrc子Module,這種方式比前一種好些,將插件的代碼統(tǒng)一放到buildSrc工程中去了,但還是做不到別的工程能夠使用它
單獨新建一個工程
這種方式最優(yōu),將插件集中在一個單獨的工程中,且發(fā)布到gradle后,別的工程能夠輕松復(fù)用它
##2. 自定義插件實現(xiàn)
###2.1 第一種------添加腳步
在你的主工程app module的build.gradle中直接添加腳步
Example:
class HelloConfigExtension {String msg = 'Hello gradle plugin' }class HelloPlugin implements Plugin<Project> {void apply(Project project) {// Add the 'hello' extension objectdef extension = project.extensions.create('hello', HelloConfigExtension)project.task('hello') {doLast {println extension.msg}}} }// Apply the plugin apply plugin: HelloPlugin//Config the extension hello{msg = 'hello from gradle' }在控制臺輸入 ./gradlew -q hello
> gradle -q hello hello from gradle上述命令表明需要執(zhí)行一個hello任務(wù) -q表示除去打印日志(錯誤日志除外);因為我們在插件中定義了一個hello任務(wù),這個任務(wù)就是打印從gradle傳入的msg參數(shù);
這樣一個簡單的插件就實現(xiàn)了,當(dāng)然完全可以根據(jù)自己的業(yè)務(wù)需求實現(xiàn)自己的插件
##2.2 第二種------添加buildSrc Module
在根工程中添加手工添加一個buildSrc 目錄結(jié)構(gòu)如下
新建自己插件類
圖片中的二個類都是groovy類(路徑必須是在src/main/groovy下),其實就是對應(yīng)第一種在gradle腳步中寫的HelloPlugin和HelloConfigExtension類;
新建配置文件
在groovy同一層級新建resouces/META-INF/gradle-plugins目錄
新建一個名為youPluginId.properties 在里面添加
注意:這里面的文件的名稱就是你自定義插件的id,當(dāng)你在主工程引用是需要使用此插件id號進行引用
#這里面要替換成你自己的全路徑插件名 implementation-class=com.fzm.plugin.PostBuildPlugin新建build.gradle
在buildSrc目錄下新建,并添加如下腳步即可
apply plugin: 'groovy'dependencies {compile gradleApi()compile localGroovy() }repositories {mavenCentral() }這樣第二中自定義插件寫法步驟就介紹完畢類,如何引用呢?很簡單
,你可以在你的主工程app moudle的build.gradle 添加如下腳步
2.3 第三種------單獨工程
插件的編寫
新建一個Android工程,再新建一個專門編寫插件的module
復(fù)制第二種方法中buildSrc中的src和build.gradle文件到plugin moudle中
因為第三種可以將自己插件發(fā)布到gradle上去,所以這里的build.gradle需要修改
格式如下,參考示例Demo
插件的發(fā)布
先去gradle官網(wǎng)注冊賬號,有的話直接登錄
展開AS中右側(cè)工具欄,找到你插件的module->plugin portal 右擊 login 執(zhí)行即可
順利的話登錄會成功,點擊控制臺鏈接即可,接下來準(zhǔn)備發(fā)布操作,右擊publishPlugins執(zhí)行run即可,順利話,發(fā)布成功的話你會看到這樣
注意:每次發(fā)布的版本都不能是之前存在過的,否則會發(fā)布失敗
如果想直接通過控制臺操作,可以使用如下命令
./gradlew yourPluginModuleName:publishPlugins引用
當(dāng)你發(fā)布插件成功后,你可以去官網(wǎng)搜索你發(fā)布的插件(通過插件id),已了解你發(fā)布插件的信息,里面有如何使用自自定義插件的說明
別的工程只要在根工程build.gradle添加類似如下代碼即可
//較高gradle版本寫法:Build script snippet for plugins DSL for Gradle 2.1 and later: plugins {id "com.fzm.post.build.plugin" version "1.0.21" }//低版本寫法或者動態(tài)配置時需要 //Build script snippet for use in older Gradle versions or where dynamic configuration is required: buildscript {repositories {maven {url "https://plugins.gradle.org/m2/"}}dependencies {classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"} }apply plugin: "com.fzm.post.build.plugin"本人發(fā)現(xiàn)高版本寫法也可以放到主工程的build.gradle前提要放在apply plugin:xxxxx前面;而第二中寫法比較靈活,因為apply plugin:"your plugin id"可以放到 別的插件之后,這樣你可以做很多的事情;
2.4 差異(也許對你灰常有用哦)
插件引用方式
不知道大家又沒注意這三種引用插件的方式其實是有差別的
第一種
第二種:
app plugin: yourPluginId第三種:
//way 1 //add in app project's build.gradleplugins {id 'pluginId' version "plugiVersion" }//way 2 //add in root project's build.gradle buildscript {repositories {maven {url "https://plugins.gradle.org/m2/"}}dependencies {classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"} }//add in app project's build.gradle apply plugin: "com.fzm.post.build.plugin"前二中都是直接在主工程build.gradle 直接使用且可以放到apply plugin: ‘com.android.application’ 后面哦,
第三種第一種引用方式只能放到apply plugin: xxx前面
這種差異意味著第三種第一個方式不能攔截assemleDebug/Release之類的任務(wù),而前二種則是可以的,如果要hook的話就使用靈活的第三種第二個方式,就能實現(xiàn)hook相關(guān)動作
插件的構(gòu)成:打包后的插件其實就是一個jar它包含java,groovy這些類編譯成的字節(jié)碼,像python腳本文件會自動丟棄,所以你如果想在插件中調(diào)用python之類需要指定路徑,python文件不可以放到插件中去
2.5 插件的調(diào)試
1. 調(diào)試
方法一:開發(fā)插件時建議先使用第二種方式,這樣便于調(diào)試錯誤;等插件功能開發(fā)完畢后,再使用第三種方式發(fā)布集成引用;
方法二:使用本地倉庫調(diào)試
在你的插件模塊的build.gradle文件加入如下代碼
repositories {mavenLocal() //addmavenCentral() }// 指定本地上傳的路徑 def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath //adduploadArchives {repositories {mavenDeployer {repository(url: localMavenRepo) //addsnapshotRepository(url: localMavenRepo) //add}} }./gradlew clean install
再執(zhí)行上傳操作即可(uploadArchives)
2. 其他工程引用
buildscript {repositories {mavenLocal() //addmavenCentral()...}dependencies {classpath 'yougroup:name:1.0.0' //add} }allprojects {repositories {mavenLocal() //addmavenCentral()...} } 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android如何自定义Gradle插件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建Jenkins+Sonarqub+M
- 下一篇: 如何快速将Android库发布到JCen