AOP之Transform

Transform簡介

是Android官方提供給開發(fā)者在項目構(gòu)建階段即由class到dex轉(zhuǎn)換期間修改class文件的一套api泳桦。

我們可以通過Gradle插件來注冊我們編寫的Transform花鹅。注冊后的Transform會被Gradle包裝成一個Gradle Task,這個TransForm Task會在java compile Task執(zhí)行完畢后運行痢法。

Gradle插件

自定義gradle插件有三種方式

  • Build script gradle文件崇堰,構(gòu)建腳本內(nèi)座享,不過這種只能在文件內(nèi)使用
  • buildSrc project 可以在自己的工程內(nèi)隨意使用帝嗡,但是其他工程就無法使用
屏幕快照 2019-07-23 上午9.54.35.png

WubaTimeAssist.properties文件中需要實現(xiàn)這樣一行代碼

com.plugin.TestPlugin是你實現(xiàn)Plugin<Project>類的路徑
implementation-class= com.plugin.TestPlugin
  • Standalone project 單獨項目的插件,可以隨意一個工程去引用坟桅,前提是需要發(fā)布到本地倉庫或者maven私服
    工程結(jié)構(gòu)與buildSrc project 差不多华望,但是需要發(fā)布maven,上傳腳本桦卒,upload task


    屏幕快照 2019-07-23 上午10.04.33.png

Transform API

  • TransformInput:就是對輸入的class文件轉(zhuǎn)變成目標(biāo)字節(jié)碼文件立美,目前它包括兩部分:DirectoryInput與JarInput。
  • DirectoryInput:就是項目編譯的所有目錄結(jié)構(gòu)及其目錄下的源碼文件方灾,可以借助于它來修改輸出文件的目錄結(jié)構(gòu)建蹄、已經(jīng)目標(biāo)字節(jié)碼文件。
  • JarInput:所有本地jar包或遠(yuǎn)程jar包裕偿,可以借助于它來動態(tài)添加jar包洞慎。
  • TransformOutputProvider:Transform的輸出,可以通過它來獲取輸出路徑

繼承自Transform 的類需要實現(xiàn)幾個重要方法

  • getName()就是指定自定義的Transform的名字嘿棘。
  • 自定義的這個Transform處理的輸入類型劲腿,現(xiàn)在的就是兩種類型即分為class文件或者java資源(resource)
  @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }
  • 該方法是定義你tranform的作用范圍,整個工程鸟妙,當(dāng)前工程等
 @Override
    public Set<QualifiedContent.Scope> getScopes() {
        return TransformManager.SCOPE_FULL_PROJECT
    }

注冊Transform

注意這里是以開源項目DroidAssist為例子

class DroidAssistPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create("droidAssistOptions", DroidAssistExtension)
        //對整個工程的處理
        if (project.plugins.hasPlugin(AppPlugin.class)) {
            AppExtension extension = project.extensions.getByType(AppExtension)
            extension.registerTransform(
                    new DroidAssistTransform(project, true))
        }
       //只對lib工程做處理
        if (project.plugins.hasPlugin(LibraryPlugin.class)) {
            LibraryExtension extension = project.extensions.getByType(LibraryExtension)
            extension.registerTransform(
                    new DroidAssistTransform(project, false))
        }
    }
}

關(guān)于Extension

注冊的名字焦人,可以在gradle文件中配置,類似與一種bean重父,可以獲取到gradle文件中相應(yīng)的值花椭,用來做一些輸入控制
project.extensions.create("droidAssistOptions", DroidAssistExtension)

gradle文件中
droidAssistOptions {
    enable true
    logLevel 3
    config file("droidassist.xml")
    logDir file("${project.buildDir.absolutePath}/logs")
}

參考

官方API文檔:
http://google.github.io/android-gradle-dsl/javadoc/2.1/com/android/build/api/transform/Transform.html
http://www.reibang.com/p/031b62d02607

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市房午,隨后出現(xiàn)的幾起案子矿辽,更是在濱河造成了極大的恐慌,老刑警劉巖郭厌,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袋倔,死亡現(xiàn)場離奇詭異,居然都是意外死亡折柠,警方通過查閱死者的電腦和手機宾娜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扇售,“玉大人碳默,你說我怎么就攤上這事贾陷≡悼簦” “怎么了嘱根?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷懈。 經(jīng)常有香客問我该抒,道長,這世上最難降的妖魔是什么顶燕? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任凑保,我火速辦了婚禮,結(jié)果婚禮上涌攻,老公的妹妹穿的比我還像新娘欧引。我一直安慰自己,他們只是感情好恳谎,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布芝此。 她就那樣靜靜地躺著,像睡著了一般因痛。 火紅的嫁衣襯著肌膚如雪婚苹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天鸵膏,我揣著相機與錄音膊升,去河邊找鬼。 笑死谭企,一個胖子當(dāng)著我的面吹牛廓译,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播债查,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼非区,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攀操?” 一聲冷哼從身側(cè)響起院仿,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎速和,沒想到半個月后歹垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颠放,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年排惨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碰凶。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡暮芭,死狀恐怖鹿驼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辕宏,我是刑警寧澤畜晰,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站瑞筐,受9級特大地震影響凄鼻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聚假,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一块蚌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘格,春花似錦峭范、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至政敢,卻和暖如春其徙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喷户。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工唾那, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褪尝。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓闹获,卻偏偏與公主長得像,于是被迫代替她去往敵國和親河哑。 傳聞我的和親對象是個殘疾皇子避诽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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