Android Plugin Transform 初探

dim.red

環(huán)境: android gradle 2.3

transform api

一 概況

transform 開始于1.5.0-beta1 可以用于在android 打包,class轉(zhuǎn)換成dex 過程中,加入開發(fā)者自定義的處理邏輯. 他也可以處理native.只是native 這里處理的是so 文件的,再加工難度比較大.

二 定義

ContentType:
CLASSES,
RESOURCES,
DEX,
NATIVE_LIBS,
CLASSES_ENHANCED,
JACK
ContentType表示文件的類型. CLASSES 這個是javac 編譯成class文件
RESOURCES: 這里的resources 單指Java 的資源.
DEX 這個是class 文件dx 編譯成的dex 文件.
比較可惜的是自定義的 transform 無法處理這些文件. 具體原因看后面.
Scope:
PROJECT(0x01),
PROJECT_LOCAL_DEPS(0x02),
SUB_PROJECTS(0x04),
SUB_PROJECTS_LOCAL_DEPS(0x08),
EXTERNAL_LIBRARIES(0x10),
TESTED_CODE(0x20),
PROVIDED_ONLY(0x40)

通過 Scope 和ContentType可以組成一個資源流.即PROJECT 和CLASSES ,表示了主項目中java 編譯成的class 組成的一個資源流,SUB_PROJECTS 和 CLASSES ,表示的是本地子項目中的java 編譯的class 資源流.

三 transform 的作用

transform 是來處理和轉(zhuǎn)換這些流的.
transform 中存在兩種資源流,一種是會被消費掉.一種只是參與了轉(zhuǎn)換過程.并不會被消費掉.

資源流存儲在一個資源池. transform 從這個資源池收集這兩種流.然后經(jīng)過一定的規(guī)則轉(zhuǎn)換生成新的資源流放到這個池子里. 同時將未消耗的資源流也放回這個池子里去,下一個transform 重復(fù)之前的流程.

api

Set<ContentType> getInputTypes():定義了你要處理的類型;
Set<Scope> getScopes():你要消耗資源流的范圍;
Set<Scope> getReferencedScopes():轉(zhuǎn)換過程中需要資源流的范圍,在轉(zhuǎn)換過程中不會被消耗,轉(zhuǎn)換結(jié)束后, 會將資源流放回資源池去.
Set<ContentType> getOutputTypes() 轉(zhuǎn)換輸出類型,默認是getInputTypes()

四 transform工作原理

對外注冊api:

 android.registerTransform(new XTransform());
 android.registerTransform(new XTransform(), dependencies)

內(nèi)部注冊api

TransformManager.addTransform();

gradle 會收集一些原始的資源流, 同時這些流可能還會有依賴task的,類似前置任務(wù),比如說PROJECT 的CLASSES 需要依賴avac 的task 的任務(wù).NATIVE_LIBS 需要依賴于ndk 的task ,這個也是可以理解的, 因為project 的class 產(chǎn)生是需要通過javac 的任務(wù)生成的. 同時如果你的transform 需要處理或者依賴這些資源流, 會被自動的被依賴上這些task.當gradle 收集完原始的資源流以后, gradle 開始注冊transform,因為注冊的transform是有順序的,所以先注冊的先處理資源流, 如果先注冊的transform 消耗掉的資源.后續(xù)的transform 就無法處理了, 但是他可以處理前面transform 生成的資源流.(比方說有一個transformA 消耗了PROJECT 的CLASSES.同時經(jīng)過轉(zhuǎn)換生成了PROJECT 的CLASSES, 那下一個transformB如果要消耗和處理PROJECT 的CLASSES,那么他處理的是就是transformA轉(zhuǎn)換的資源流而不是gradle收集資源流.)

自定義的transform之所以不能處理Dex 文件,是因為Dex 是由DexTransform|MultiDexTransform 由CLASSES 轉(zhuǎn)成dex, 而自定義的transform 的注冊在DexTransform|MultiDexTransform 之前,意思是自定義transform 注冊的時候資源池里面還沒dex的資源流.所以它無法處理Dex;

五 再講資源流

說是流,其實是一個個文件的集合.原始的資源流是在Configuration 階段中,收集成一個個文件的聚合. 而transform 生成的資源流是怎樣的是,它其實是一個根目錄(build/transforms/xxx)為基準,根據(jù)規(guī)則生成的一個個目錄. gradle 通過TransformOutputProvider這個類幫我們簡化這個步驟.

六 尾巴

  1. 雖然從getReferencedScopes() 可以獲取到資源流,但是你不應(yīng)該對這個資源流做任何的改動.因為這個可能作為下一個transform的輸入. 同時這個資源流里面的文件.可能是一個全局的文件. 你的更改,將不僅僅影響到這個工程.甚至其他工程.
  • 顆粒太大:處理是的流,無法處理流里面的單個文件. 就是說如果你只是想單單處理某個文件. 你將不得不處理整個流. 造成多余的copy,以及磁盤的占用.
  • 自定義的transform 無法處理Dex
  • 自定義的transform 無法使用自定義ContentType
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤克,一起剝皮案震驚了整個濱河市戳杀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖俩莽,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督暂,死亡現(xiàn)場離奇詭異拨脉,居然都是意外死亡矛市,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門优俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來京办,“玉大人,你說我怎么就攤上這事帆焕〔研觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵叶雹,是天一觀的道長财饥。 經(jīng)常有香客問我,道長折晦,這世上最難降的妖魔是什么钥星? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮满着,結(jié)果婚禮上谦炒,老公的妹妹穿的比我還像新娘。我一直安慰自己风喇,他們只是感情好宁改,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魂莫,像睡著了一般还蹲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙考,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天秽誊,我揣著相機與錄音,去河邊找鬼琳骡。 笑死,一個胖子當著我的面吹牛讼溺,可吹牛的內(nèi)容都是我干的楣号。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炫狱!你這毒婦竟也來了藻懒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤视译,失蹤者是張志新(化名)和其女友劉穎嬉荆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酷含,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡鄙早,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椅亚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片限番。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呀舔,靈堂內(nèi)的尸體忽然破棺而出弥虐,到底是詐尸還是另有隱情,我是刑警寧澤媚赖,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布霜瘪,位于F島的核電站,受9級特大地震影響惧磺,放射性物質(zhì)發(fā)生泄漏颖对。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一豺妓、第九天 我趴在偏房一處隱蔽的房頂上張望惜互。 院中可真熱鬧,春花似錦琳拭、人聲如沸训堆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坑鱼。三九已至,卻和暖如春絮缅,著一層夾襖步出監(jiān)牢的瞬間鲁沥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工耕魄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留画恰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓吸奴,卻偏偏與公主長得像允扇,于是被迫代替她去往敵國和親缠局。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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