Android如何自定义Gradle插件
Android-如何自定義gradle插件
自定義gradle插件可以實現定制自己的構建流程,以達到復用目的;
##1. 自定義插件方式
自定義插件有三種方式
添加腳步
在你的app項目的build.gradle中直接使用groovy腳步語言編寫插件
這樣方式好處是插件能自動變異且被包含到構建腳步中,你無需做任何處理;缺點是插件到邏輯都放到都build.gradle中去了,增加了腳步的復雜度且無法復用
添加buildSrc工程
在根目錄添加buildSrc子Module,這種方式比前一種好些,將插件的代碼統一放到buildSrc工程中去了,但還是做不到別的工程能夠使用它
單獨新建一個工程
這種方式最優,將插件集中在一個單獨的工程中,且發布到gradle后,別的工程能夠輕松復用它
##2. 自定義插件實現
###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上述命令表明需要執行一個hello任務 -q表示除去打印日志(錯誤日志除外);因為我們在插件中定義了一個hello任務,這個任務就是打印從gradle傳入的msg參數;
這樣一個簡單的插件就實現了,當然完全可以根據自己的業務需求實現自己的插件
##2.2 第二種------添加buildSrc Module
在根工程中添加手工添加一個buildSrc 目錄結構如下
新建自己插件類
圖片中的二個類都是groovy類(路徑必須是在src/main/groovy下),其實就是對應第一種在gradle腳步中寫的HelloPlugin和HelloConfigExtension類;
新建配置文件
在groovy同一層級新建resouces/META-INF/gradle-plugins目錄
新建一個名為youPluginId.properties 在里面添加
注意:這里面的文件的名稱就是你自定義插件的id,當你在主工程引用是需要使用此插件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
復制第二種方法中buildSrc中的src和build.gradle文件到plugin moudle中
因為第三種可以將自己插件發布到gradle上去,所以這里的build.gradle需要修改
格式如下,參考示例Demo
插件的發布
先去gradle官網注冊賬號,有的話直接登錄
展開AS中右側工具欄,找到你插件的module->plugin portal 右擊 login 執行即可
順利的話登錄會成功,點擊控制臺鏈接即可,接下來準備發布操作,右擊publishPlugins執行run即可,順利話,發布成功的話你會看到這樣
注意:每次發布的版本都不能是之前存在過的,否則會發布失敗
如果想直接通過控制臺操作,可以使用如下命令
./gradlew yourPluginModuleName:publishPlugins引用
當你發布插件成功后,你可以去官網搜索你發布的插件(通過插件id),已了解你發布插件的信息,里面有如何使用自自定義插件的說明
別的工程只要在根工程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" }//低版本寫法或者動態配置時需要 //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"本人發現高版本寫法也可以放到主工程的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之類的任務,而前二種則是可以的,如果要hook的話就使用靈活的第三種第二個方式,就能實現hook相關動作
插件的構成:打包后的插件其實就是一個jar它包含java,groovy這些類編譯成的字節碼,像python腳本文件會自動丟棄,所以你如果想在插件中調用python之類需要指定路徑,python文件不可以放到插件中去
2.5 插件的調試
1. 調試
方法一:開發插件時建議先使用第二種方式,這樣便于調試錯誤;等插件功能開發完畢后,再使用第三種方式發布集成引用;
方法二:使用本地倉庫調試
在你的插件模塊的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
再執行上傳操作即可(uploadArchives)
2. 其他工程引用
buildscript {repositories {mavenLocal() //addmavenCentral()...}dependencies {classpath 'yougroup:name:1.0.0' //add} }allprojects {repositories {mavenLocal() //addmavenCentral()...} } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Android如何自定义Gradle插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建Jenkins+Sonarqub+M
- 下一篇: 如何快速将Android库发布到JCen