Android 編譯插樁之--自定義Gradle插件
欲窮千里目,更上一層樓。
(王之煥《登鸛雀樓》)
一、前言
最近在學習字節碼插樁相關的知識,剛起步就遇到了自定義gradle插件的一個問題,被絆了好久,特此記錄下來。
這裏是自定義gradle插件的官方文檔地址,可以先行參考。文中介紹了三種方法來創建插件,本文僅以Standalone project方法,也就是新建單獨的工程來編寫插件並提供給其他工程使用的方法。
二、自定義流程
使用AndroidStudio分別新建ASMDemo和ASMDemoPlugin工程。
ASMDemoPlugin就是提供插件的工程,ASMDemo自然就是使用插件的工程。我們先寫編寫插件工程的相關代碼。
2.1、ASMDemoPlugin工程
2.1.1、新建module並修改
切換到Project模式,然後在工程中新建module,名稱例如plugin,點擊Finish。等待module創建完成後我們需要刪除一些不需要的文件,如下圖所示選中的文件都可以刪除:
刪除完成後文件結構如下:
2.1.2、添加依賴
然後打開plubin模塊下的build.gradle文件將原來的內容全部刪除,並添加如下代碼:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = 'com.cooloongwu.plugin'
pom.artifactId = 'asm.plugin'
pom.version = '1.0.0'
//生成的插件存放地址
repository(url: uri('F:/Repo'))
}
}
}
依賴了groovy相關的api等,至於groovy估計認爲它就是java的一種方言好了。
uploadArchives 節點下指定了我們要生成插件的相關信息:pom.groupId,pom.artifactId,pom.version,這裏需要留意下下文我們會用到。以及生成插件的倉庫地址存放在本機文件的 F盤Repo目錄下。
然後構建項目。
2.1.3、編寫Groovy類
接下來我們就需要編寫groovy代碼了:在plugin模塊的src.main文件夾下新建groovy文件夾,然後新建包,最後新建PluginDemo.groovy文件【as中沒有groovy文件的直接支持,我們可以直接新建File並填寫文件名爲:PluginDemo.groovy】。
文件結構如下:
PluginDemo.groovy文件中代碼如下,只是在apply插件的時候打印出來一條信息,方便在其他工程中apply插件的時候檢查是否成功:
package com.cooloongwu.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class PluginDemo implements Plugin<Project> {
@Override
void apply(Project project) {
System.out.println("========== this is a log just from PluginDemo ==========")
}
}
2.1.4、添加Properties
在plugin模塊的src.main文件夾下,新建resources文件夾,然後繼續新建META-INF文件夾,然後在META-INF文件夾下新建gradle-plugins文件夾【注意!!一定要一個一個文件夾來新建,千萬不要直接新建META-INF.gradle-plugins文件夾,這樣就不是一層層的文件夾了,而是一個文件夾。千萬跟創建包的時候區分開來,否則就是浪費一下午的時間來尋找原因】。新建完成後AndroidStudio顯示出來如下圖所示:
然後在gradle-plugins文件夾下新建 myplugin.properties,此時的myplugin就是要ASMDemo工程要依賴的插件名。下文會講述使用位置,注意這裏的名稱就是你需要使用的插件名稱即可。
2.1.5、生成插件
經過上述的步驟之後,我們在右側的gradle欄中依次選擇:
ASMDemoPlugin => plugin => Tasks => upload => uploadArchives,然後執行uploadArchives任務。
任務執行完畢後可以在你定義的插件倉庫中看到生成的插件了,例如我這裏在F盤Repo文件夾:
接下來就看我們怎麼使用了。
2.2、AMSDemo工程
首先在工程的build.gradle文件中添加相應的修改:
buildscript {
repositories {
...
maven{
url uri('F:/Repo')
}
}
dependencies {
...
classpath 'com.cooloongwu.plugin:asm.plugin:1.0.0'
}
}
首先添加本地插件maven倉庫的地址,也就是我們在插件工程中定義的生成並存儲插件的文件夾 F:/Repo。然後添加插件依賴,這裏可以看到依賴插件的路徑是以在插件工程中配置的
【pom.groupId】、【pom.artifactId】、【pom.version】 並以冒號分隔的形式來組織的。
接下來在app模塊下的build.gradle文件夾中直接應用插件:
...
apply plugin: 'myplugin'
可以看到,這裏應用的插件名稱爲 myplugin,也就是在插件工程中resources/META-INF/build-plugins文件夾下定義的 myplugin.properties 文件的文件名。
這時,可以直接點擊大象圖標構建項目了,不出意外的話,在底部Build的信息欄中你已經可以看到打印出來的我們想要的信息了:
三、注意事項
- META-INF/gradle-plugins文件夾的創建,千萬別偷懶在新建的時候直接寫成META-INF.gradle-plugins,這樣就是一個文件夾了,而不是一個目錄;
- xxx.properties 中xxx是插件的名稱,也就是其他項目在apply plugin: 'xxx’時候使用的;
- 依賴插件的classpath就是在插件工程的build.gradle中配置的【pom.groupId】、【pom.artifactId】、【pom.version】;
- 目前只是將插件生成到了本機的倉庫中,後續可以自行搭建maven倉庫上傳,方便組內其他人使用;
四、總結
我就是在注意事項的第一點栽了跟頭,耽誤一下午的時間,席八!!歸根到底還是自己知識儲備不夠,經驗不足,努力~ 奮鬥~ !!
最後說下,我最近寫的一些文章知識點基本快串聯起來了。下面是相關的文章:
AndroidStudio加速之–(一)構件倉庫Artifactory
Android NDK、JNI之–(四)so打包發佈aar
AndroidStudio加速之–(三)發佈aar到Artifactory
Android 編譯插樁之–自定義Gradle插件