自定義Gradle插件

??最近在學(xué)習(xí)字節(jié)碼插樁技術(shù),利用字節(jié)碼插樁技術(shù),我們可以在編譯時(shí)期對(duì)字節(jié)碼進(jìn)行修改,達(dá)到完成一些特殊需求拙徽,比如埋點(diǎn)(可以聲明一個(gè)BaseActivity,在onCreate和onDestory中進(jìn)行埋點(diǎn))诗宣;統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間膘怕;熱修復(fù),ButterKnief召庞、Dagger等也用到了字節(jié)碼插樁技術(shù)岛心。
??在Android中要使用字節(jié)碼插樁技術(shù)需要完成三步:

  • 自定義Gradle插件 :自定義插件来破,重寫(xiě)apply方法,注冊(cè)自定義Transform
  • Transform Api使用:自定義Ttransform忘古,在transform方法中實(shí)現(xiàn)處理邏輯
  • Asm的使用: 在transform中使用Asm插入字節(jié)碼
    ??本文是實(shí)現(xiàn)第一步徘禁,自定義Gradle。
    ??實(shí)現(xiàn)自定義Gradle插件主要有三種方式:
    1.在build.gradle中定義髓堪,直接在module的build.gradle中實(shí)現(xiàn)送朱,缺點(diǎn):只能在本項(xiàng)目中使用,不好復(fù)用旦袋。
    2.buildSrc中使用骤菠。這種方式需要在項(xiàng)目中新建一個(gè)model命名為buildSrc,這個(gè)目錄就用來(lái)存放自定義插件疤孕,缺點(diǎn):只能在本項(xiàng)目中使用,不好復(fù)用央拖。
    3.獨(dú)立Module中使用祭阀。這種方式就是完全獨(dú)立開(kāi)發(fā)一個(gè)Module,并且可以上傳至maven庫(kù)鲜戒,可以隨便用专控。
    由于三種方式實(shí)現(xiàn)都差不多,前兩種局限性比較大遏餐,所以本文只對(duì)第三種進(jìn)行記錄伦腐。
    1、新建Android Module選擇Android Library類(lèi)型即可
    ??除去src/main和build.gradle其余文件都刪除失都,并清除build.gradle內(nèi)容柏蘑,將以下內(nèi)容填入build.gradle,并同步gradle
apply plugin: 'groovy'

dependencies {
    //gradle sdk
    implementation gradleApi()
    //groovy sdk
    implementation localGroovy()
}

2粹庞、新建groovy文件咳焚,實(shí)現(xiàn)插件邏輯
??在src/main目錄下新建groovy目錄,在groovy目錄下新建com.example.clean目錄(名字自取即可),在該目錄下新建CleanPlugin.groovy文件庞溜,文件有一個(gè)綠色的G標(biāo)記革半,表示系統(tǒng)識(shí)別為groovy文件,可以導(dǎo)入gradle api流码。如果沒(méi)有出現(xiàn)綠色標(biāo)志又官,可以將文件名改為小寫(xiě)試試。

新建插件文件

??這個(gè)cleanplugin.groovy就是我們要實(shí)現(xiàn)插件的主要邏輯漫试,我們需要聲明一個(gè)類(lèi)來(lái)實(shí)現(xiàn)Plugin<Project>接口六敬,在apply中實(shí)現(xiàn)主要邏輯。

package com.example.clean
import org.gradle.api.Plugin
import org.gradle.api.Project;

class cleanplugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println("clean plugin")
    }
}


??注意記得導(dǎo)入包目錄商虐,否則會(huì)導(dǎo)致找不到插件實(shí)現(xiàn)類(lèi)
3觉阅、聲明插件
??在src/main目錄下新建resource目錄崖疤,接著新建META-INF目錄,繼續(xù)新建gradle-plugins目錄典勇,再新建com.example.firstplugin.properties文件(名字自取)劫哼,注意文件名即為到時(shí)候其他項(xiàng)目中引用的插件名,在該文件中寫(xiě)入如下內(nèi)容

//插件實(shí)現(xiàn)類(lèi)
implementation-class=com.example.clean.cleanplugin

4割笙、將插件上傳至maven庫(kù)
??在插件的build.gradle文件中添加插件groupid权烧、version等參數(shù)和上傳maven地址

apply plugin: 'maven-publish'
publishing {
    publications {
        mavenJava(MavenPublication) {

            //其他項(xiàng)目使用插件時(shí)的方式:classpath 'com.example.clean:firstplug:1.0.0'
            //三個(gè)參數(shù)
            groupId 'com.example.clean'
            artifactId 'firstplug'
            version '1.0.0'

            from components.java

        }
    }
}

publishing {
    repositories {
        maven {
            // maven地址,可以是本地地址也可以是遠(yuǎn)程地址
            url uri('C:/Android/repos')
        }
    }
}

最終build.gradle文件內(nèi)容如下:

apply plugin: 'groovy'
apply plugin: 'maven-publish'

dependencies {
    //gradle sdk
    implementation gradleApi()
    //groovy sdk
    implementation localGroovy()
}

publishing {
    publications {
        mavenJava(MavenPublication) {

            //其他項(xiàng)目使用插件時(shí)的方式:classpath 'com.example.clean:firstplug:1.0.0'
            //三個(gè)參數(shù)
            groupId 'com.example.clean'
            artifactId 'firstplug'
            version '1.0.0'

            from components.java

        }
    }
}

publishing {
    repositories {
        maven {
            // maven地址伤溉,可以是本地地址也可以是遠(yuǎn)程地址
            url uri('C:/Android/repos')
        }
    }
}

??同步gradle般码,在右側(cè)的gradle目錄中,找到clean下的publish任務(wù)乱顾,并運(yùn)行publish板祝,將插件上傳至maven庫(kù)。


運(yùn)行publish任務(wù)走净,上傳插件至maven庫(kù)

??運(yùn)行成功后券时,在本地的repos目錄下可以找到上傳的插件


本地maven庫(kù)的插件

5、引用插件
??在項(xiàng)目的根build.gradle文件中伏伯,添加插件引用和maven庫(kù)地址橘洞,最終build.gradle文件內(nèi)容如下:

buildscript {
   
   repositories {
       google()
       jcenter()
       maven {//local maven repo path
           url uri('C:/Android/repos')
       }
   }
   dependencies {
       classpath 'com.android.tools.build:gradle:3.6.1'
       classpath 'com.example.clean:firstplug:1.0.0'
       

       // NOTE: Do not place your application dependencies here; they belong
       // in the individual module build.gradle files
   }
}

同步gradle,在app module的build.gradle文件中添加插件说搅,如下:

//原文件的android插件
apply plugin: 'com.android.application'
//添加自定義插件炸枣,插件名即為com.example.firstplugin.properties文件名
apply plugin: 'com.example.firstplugin'

自定義插件名即為com.example.firstplugin.properties文件名,同步build.gradle弄唧,運(yùn)行app下的bulid任務(wù)


插件運(yùn)行成功

出現(xiàn)"clean plugin"适肠,即自定義插件中apply方法中輸出的日志,表示插件運(yùn)行成功套才。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迂猴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子背伴,更是在濱河造成了極大的恐慌沸毁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傻寂,死亡現(xiàn)場(chǎng)離奇詭異息尺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疾掰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)搂誉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人静檬,你說(shuō)我怎么就攤上這事炭懊〔⒓叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵侮腹,是天一觀的道長(zhǎng)嘲碧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)父阻,這世上最難降的妖魔是什么愈涩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮加矛,結(jié)果婚禮上履婉,老公的妹妹穿的比我還像新娘。我一直安慰自己斟览,他們只是感情好毁腿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著苛茂,像睡著了一般狸棍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上味悄,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音塌鸯,去河邊找鬼侍瑟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丙猬,可吹牛的內(nèi)容都是我干的涨颜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茧球,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庭瑰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起抢埋,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弹灭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揪垄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體穷吮,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年饥努,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捡鱼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酷愧,死狀恐怖驾诈,靈堂內(nèi)的尸體忽然破棺而出缠诅,到底是詐尸還是另有隱情,我是刑警寧澤乍迄,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布管引,位于F島的核電站,受9級(jí)特大地震影響就乓,放射性物質(zhì)發(fā)生泄漏汉匙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一生蚁、第九天 我趴在偏房一處隱蔽的房頂上張望噩翠。 院中可真熱鬧,春花似錦邦投、人聲如沸伤锚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屯援。三九已至,卻和暖如春念脯,著一層夾襖步出監(jiān)牢的瞬間狞洋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工绿店, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吉懊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓假勿,卻偏偏與公主長(zhǎng)得像借嗽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子转培,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容