推薦一個熱修復框架,無需重啟應用,即可修復代碼和資源,零私有api調用,適用於2.x~P。
https://github.com/ximsfei/Stark
作者:binbinqq86
連結:
https://blog.csdn.net/binbinqq86/article/details/81033746
本文由作者授權發布。
gradle插件可以幫助我們幹很多事情,類似一個工具,可以根據你自己想要的效果去定製自己的插件,本文就講解一下怎麼去實現自己的一個插件。
根據官網描述,自定義插件一共有三種方式:
https://docs.gradle.org/current/userguide/custom_plugins.html
Build script——gradle文件,構建腳本內,不過這種只能在文件內使用
buildSrc project——buildSrc工程,可以在自己的工程內隨意使用,但是其他工程就無法使用
Standalone project——單獨項目的插件,可以隨意一個工程去引用,前提是需要發布到本地倉庫或者maven私服
下面我們就三種方式分別去看一下怎麼實現~
gradle文件內,就是自己新建一個,或者在項目或者工程的build.gradle裡面去寫一個類,來繼承org.gradle.api.Plugin,並實現裡面的apply方法。廢話不多說,直接上代碼:
apply plugin: Plugin2
class Plugin2 implements Plugin<Project>{
@Override
void apply(Project target) {
println("this is a plugin in the file 'build.gradle'...")
}
}
我們build一下:
可以看到輸出了裡面的內容,這樣就完成了一個最簡單的插件開發,當然這裡沒有去做任何事情,只是列印一句話,後續我們會去開發一個比較實用的打包加固籤名apk的插件,這裡只是學會怎麼去做插件,但是這是插件只能在這個文件內引用,這樣局限性就比較大了,所以一般不採用此方式。
這種方式需要在工程下新建一個module,名字必須為buildSrc,我們看一下目錄結構:
這種結構就是groovy工程,在android studio裡面創建一個library的module,然後刪除main下面的java文件夾,新建一個groovy文件夾,新建包,groovy文件,新建resources/META-INF/gradle-plugins,然後在該文件夾下創建一個以.properties結尾的文件,前面部分就是我們要引用的插件名稱,文件內容如下:
implementation-class=com.tb.plugin.TbPlugin
這就是告訴這個插件對應的groovy具體的類。我們再來看看TbPlugin文件:
package com.tb.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class TbPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println('this is a buildSrc plugin...')
}
}
因為groovy完全兼容java,但是又進行了擴展,所以我們如果不會groovy語言,也可以直接使用java去寫代碼,注意插件必須繼承Plugin接口,然後就可以在apply方法去做自己想做的小工具了。。。
最後再來看一下build.gradle文件:
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
也是很簡單的幾句話,引入groovy插件,依賴gradle的api,groovy的api,然後就可以盡情的書寫代碼了。到此,buildSrc方式的自定義插件就結束了,來看一下怎麼引用吧~
// buildSrc下的插件
//此處插件id大小寫,中下劃線均可***
//apply plugin: 『com.tb.plugin-buildSrc』
//該方式可以不需要resources文件夾,直接引用插件全類名即可
//apply plugin: com.tb.plugin.TbPlugin
通過以上兩種方式都可以很方便的引用插件,如果是通過類全名,可以連resources文件夾都不需要了,簡單吧!最後看一下運行結果:
上面這種方式也有局限性,就是只能在自己的工程裡使用,如果想寫一個插件,到處都可以用,那樣才是我們的最終目的,這就需要單獨建立一個工程,我們在工程裡新建一個module:
目錄結構跟上面也基本上沒有差別,唯一不同的是build.gradle文件,我們來看一下:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
group='com.tb.plugin'
version='1.0.0'
archivesBaseName='module-plugin'
uploadArchives{
repositories {
mavenDeployer{
repository(url: uri('../tbModulePlugin'))
}
}
}
可以看到,不同的地方就是這種方式,因為需要其他工程也可以引用,所以就需要我們去發布成jar包,可以發布到本地,也可以直接把jar包放到lib下面,也可發布到maven倉庫,可以是私服,如果想給所有人都能用,也可以發布到jcenter倉庫。
關於maven的發布的相關知識,可以參考我的另外一篇文章:Android和Maven倉庫那些事本文就簡單說一下怎麼發布到本地maven倉庫。
https://blog.csdn.net/binbinqq86/article/details/81033716
首先我們需要引入maven插件,然後指定maven發布需要的三個要素:
groupId,artifactId,version。
這三個也是後面我們引用的時候需要指定的東西,通過這三個要素,maven就可以找到我們指定的插件,第一個就是分組的id,一般是公司域名倒過來,第二個是工程名,也可以不寫,默認就是項目名,第三個是版本號。
最後我們發布到當前父目錄,也就是根工程目錄下的tbPlugin文件夾下,我們點擊gradle窗口,找到該task,雙擊執行:
可以看到如上輸出,當然也可以使用gradle命令去執行,然後我們去tbPlugin文件夾看看:
可以看到,目錄結構就是我們前面定義的groupId,artifactId,version,裡面有我們需要的jar文件,這樣就可以在其他工程進行本地的引入了:
在工程的build.gradle文件添加如下依賴和倉庫地址:
然後就可以在其他module去引用了,也可在其他工程去引用,實質就是引用這個jar包。
apply plugin: 『com.tb.plugin.module』
build一下,看看結果:
列印出了我們的this is a module plugin…
至此三種自定義插件的方式就講完了,是不是很簡單~其實不止可以使用groovy去寫插件,還可以用java、kotlin等等你會的語言去寫,只需要我們在插件目錄的build.gradle文件加入相應的插件即可,比如java:
這裡我們引入了java-gradle-plugin這個插件,他自動包含了java插件,但是可以用腳本的方式去定義插件名和id,省去了resources文件夾和properties文件,然後我們就可以像寫java一樣去寫插件了,再比如kotlin:
我們只需要把groovy插件換成kotlin就可以用kotlin去編寫插件了,是不是很隨意!哈哈~
這裡有兩點需要說明一下:
為什麼引用的時候需要放到buildscript裡面,而不是allprojects裡面
為什麼採用的是classpath而不是compile或者api或者implementation
問題一:這是因為buildscript裡面的dependencies是gradle腳本使用的,而allprojects裡面的dependencies是給所有的項目使用的,而這裡我們寫的是插件,是給gradle用的,所以需要放到這裡,千萬不可混淆。
問題二:同樣也是因為gradle,classpath是gradle腳本用的,而另外的則是給項目使用的。
本文通過最簡單的方式,介紹了如何使用3種方式開發 Studio 插件,關於實際的應用場景,後面會再給大家推送。
最後放上源碼下載:
https://github.com/binbinqq86/groovy
推薦閱讀:
今日頭條適配方案
Android 有近10種動畫,你都知道嗎?
推薦4個不錯的開源項目
掃一掃 關注我的公眾號
如果你想要跟大家分享你的文章,歡迎投稿~
┏(^0^)┛明天見!