Android 編譯插樁之--自定義Gradle插件

欲窮千里目,更上一層樓。
(王之煥《登鸛雀樓》)

一、前言

最近在學習字節碼插樁相關的知識,剛起步就遇到了自定義gradle插件的一個問題,被絆了好久,特此記錄下來。
這裏是自定義gradle插件的官方文檔地址,可以先行參考。文中介紹了三種方法來創建插件,本文僅以Standalone project方法,也就是新建單獨的工程來編寫插件並提供給其他工程使用的方法。

二、自定義流程

使用AndroidStudio分別新建ASMDemoASMDemoPlugin工程。
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插件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章