Gradle插件系列(二)—— 配置自己的Transform

在上一篇夹囚,我們已經(jīng)知道了如何創(chuàng)建一個簡單的插件,這一節(jié)將在此基礎(chǔ)上繼續(xù)說說如何配置自己的Transform厅瞎。

1 轉(zhuǎn)換器 Transform

轉(zhuǎn)換器Transform是由Google提供,讓開發(fā)者可以在編譯后,打包前這段時期性芬,進行額外干預(yù)操作母谎,從而提供操作字節(jié)碼的時機瘦黑。

2 創(chuàng)建 Transform

創(chuàng)建自定義的FreeCoderTransform類,然后繼承至Transform奇唤。

public class FreeCoderTransform extends Transform {
    // 1
    @Override
    public String getName() { 
        return "freecoder";
    }

    // 2
    @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }

    // 3
    @Override
    public Set<? super QualifiedContent.Scope> getScopes() {
        return TransformManager.SCOPE_FULL_PROJECT;
    }

    // 4
    @Override
    public boolean isIncremental() {
        return false;
    }

    // 5
    @Override
    public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
        Collection<TransformInput> inputs = transformInvocation.getInputs();
        TransformOutputProvider outputProvider = transformInvocation.getOutputProvider();

        inputs.forEach(transformInput -> {
            transformInput.getJarInputs().forEach(jarInput -> {
                File dest = outputProvider.getContentLocation(jarInput.getName(), jarInput.getContentTypes(), jarInput.getScopes(), Format.JAR);
                try {
                    FileUtils.copyFile(jarInput.getFile(), dest);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            transformInput.getDirectoryInputs().forEach(directoryInput -> {
                File dest = outputProvider.getContentLocation(directoryInput.getName(), directoryInput.getContentTypes(), directoryInput.getScopes(), Format.DIRECTORY);
                try {
                    FileUtils.copyFile(directoryInput.getFile(), dest);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        });
    }
}

標(biāo)記1處:對應(yīng)自定義TransformTask名稱幸斥,同步完成后,會顯示在Gradle控制面板上咬扇,比如:transformClassesWithXXXForDebug甲葬。

標(biāo)記2、3處:定義了我們將要操作的編譯過程中具體哪些類型的文件懈贺,其中 2 的類型:

CONTENT_CLASS://class 文件

CONTENT_JARS: //jar包经窖,包括class文件與resource資源文件

CONTENT_RESOURCES // resource資源文件

CONTENT_NATIVE_LIBS // 本地libs

CONTENT_DEX // dex文件

CONTENT_DEX_WITH_RESOURCES // dex文件與resource資源文件

標(biāo)記 3 處:表示作用的項目范圍,SCOPE_FULL_PROJECT表示整個項目梭灿。

標(biāo)記 4 處:表示是否支持增量編譯画侣。

標(biāo)記 5 處:這里是個核心方法,需要覆蓋重寫堡妒,并且按Google提供的輸出目錄outputProvider上輸出配乱,否則將這個Transform引入會報錯。

transformInvocation.getInputs()獲取編譯后的所有class文件皮迟,transformInvocation.getOutputProvider()獲取Google提供的輸出目錄搬泥,我們把這些編譯后的文件做完處理后,然后再扔向該目錄伏尼,最終參與到打dex包的過程忿檩。

而后就是簡單的復(fù)制工作,至于處理爆阶,我們下一節(jié)講燥透,這個過程可以實現(xiàn)面向切面的編程代赁。

3 引入 Transform

如下:(接上一節(jié)代碼)


public class FreeCoderPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        final FreeCoderExtension extension = project.getExtensions()
                .create("freecoder", FreeCoderExtension.class);
        project.afterEvaluate(innerProject -> System.out.println("extension: " + extension.name));

        // 創(chuàng)建轉(zhuǎn)換器
        FreeCoderTransform freeCoder = new FreeCoderTransform();
        // 1
        BaseExtension baseExtension = project.getExtensions().getByType(BaseExtension.class);
        // 2
        baseExtension.registerTransform(freeCoder);
    }
}

標(biāo)記1處:BaseExtension指的就是Android打包過程中,com.android.application這個插件所包含的擴展兽掰,方便開發(fā)者在打包過程中進行相應(yīng)的干預(yù)芭碍。

標(biāo)記2處:把我們的Transform注冊進入該擴展中。

到此為止孽尽,我們就配置好了自己的Transform窖壕,下一節(jié),就來講講如果通過更改字節(jié)碼達到面向切面編程的效果杉女。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞻讽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熏挎,更是在濱河造成了極大的恐慌速勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎拐,死亡現(xiàn)場離奇詭異烦磁,居然都是意外死亡,警方通過查閱死者的電腦和手機哼勇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門都伪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人积担,你說我怎么就攤上這事陨晶。” “怎么了帝璧?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵先誉,是天一觀的道長。 經(jīng)常有香客問我的烁,道長褐耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任撮躁,我火速辦了婚禮漱病,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘把曼。我一直安慰自己,他們只是感情好漓穿,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布嗤军。 她就那樣靜靜地躺著,像睡著了一般晃危。 火紅的嫁衣襯著肌膚如雪叙赚。 梳的紋絲不亂的頭發(fā)上老客,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音震叮,去河邊找鬼胧砰。 笑死,一個胖子當(dāng)著我的面吹牛苇瓣,可吹牛的內(nèi)容都是我干的尉间。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼击罪,長吁一口氣:“原來是場噩夢啊……” “哼哲嘲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媳禁,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤眠副,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竣稽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱怕,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年毫别,在試婚紗的時候發(fā)現(xiàn)自己被綠了光涂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡拧烦,死狀恐怖忘闻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恋博,我是刑警寧澤齐佳,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站债沮,受9級特大地震影響炼吴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疫衩,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一硅蹦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闷煤,春花似錦童芹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至近顷,卻和暖如春生音,著一層夾襖步出監(jiān)牢的瞬間宁否,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工缀遍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慕匠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓域醇,卻偏偏與公主長得像台谊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歹苦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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