編譯插樁介紹

概念

編譯插樁就是在代碼編譯期間修改修改已有的代碼或者生成新的代碼佛呻。
編譯插樁技術(shù)從對代碼修改的時機上來說可以分為兩種:
Java 文件:在編譯最開始的時候介入带猴,動態(tài)生成 Java 文件历极,之后編譯器將生成的 Java 文件編譯成 class 文件丢胚,像 ButterKnife绍哎、Dagger 都是通過 這種方式生成代碼的央碟。對應的技術(shù)主要是APT(Annotation Process Tools

字節(jié)碼文件:在生成 class 文件后介入遍蟋,直接修改 class文件的字節(jié)碼吹害,達到修改代碼的目的。常用的字節(jié)碼編程框架有AspectJ虚青、Javassist它呀、ASM

bytecodeprogress.png

什么是字節(jié)碼?

Java 字節(jié)碼是Java虛擬機執(zhí)行的一種指令格式棒厘。Java源文件經(jīng)Java編譯器后得到Java字節(jié)碼(.class)文件纵穿。Java字節(jié)碼(.class)文件可以看作是Java虛擬機的可執(zhí)行文件。這些字節(jié)碼(.class)文件擁有足夠的元數(shù)據(jù)來解析類中的所有元素:類名稱绊谭、方法政恍、屬性以及 Java 字節(jié)碼(指令)

如何查看字節(jié)碼

這里拿AndroidStudio舉例,所有基于IDEA的IDE應該都一樣达传。
在Settings -> Tools中添加External Tools篙耗,輸入Name和下面三要素,保存即可

  • $JDKPath$\bin\javap
  • -c -verbose $FileClass$
  • $OutputPath$

showbytesetting.png

每次生成字節(jié)碼之前記得先build/rebuild一下工程宪赶,不然會失敗
showbytecode.png

簡單分析下字節(jié)碼構(gòu)成

byte1.png
byte2.png
byte3.png
  • kotlin文件查看方式
showkotlin.png

Android字節(jié)碼編程

在安卓中宗弯,編譯過程是由gradle task來執(zhí)行的,Gradle1.5以后提供了transform-api可以在代碼轉(zhuǎn)化為.class文件之后再打包成dex文件之前對它進行處理搂妻,所以我們可以自定義transform蒙保,在appcompileDebugJavaWithJavac這個gradle task之后就會走我們自定義的transform。

使用場景

  • 代碼生成欲主。除了 Dagger邓厕、ButterKnife 這些常用的注解生成框架,Protocol Buffers扁瓢、數(shù)據(jù)庫 ORM 框架也都會在編譯過程生成代碼详恼。代碼生成隔離了復雜的內(nèi)部實現(xiàn),讓開發(fā)更加簡單高效引几,而且也減少了手工重復的勞動量昧互,降低了出錯的可能性。
  • 代碼監(jiān)控。除了網(wǎng)絡監(jiān)控和耗電監(jiān)控敞掘,我們可以利用編譯插樁技術(shù)實現(xiàn)各種各樣的性能監(jiān)控叽掘。為什么不直接在源碼中實現(xiàn)監(jiān)控功能呢?首先我們不一定有第三方 SDK 的源碼玖雁,其次某些調(diào)用點可能會非常分散更扁,例如想監(jiān)控代碼中所有 new Thread() 調(diào)用,通過源碼的方式并不那么容易實現(xiàn)赫冬。
  • 代碼修改疯潭。我們在這個場景擁有無限的發(fā)揮空間,例如某些第三方 SDK 庫沒有源碼面殖,我們可以給它內(nèi)部的一個崩潰函數(shù)增加 try catch竖哩,或者說替換它的圖片庫等。我們也可以通過代碼修改實現(xiàn)無痕埋點脊僚。
  • 代碼分析相叁。上一期我講到持續(xù)集成,里面的自定義代碼檢查就可以使用編譯插樁技術(shù)實現(xiàn)辽幌。例如檢查代碼中的 new Thread() 調(diào)用增淹、檢查代碼中的一些敏感權(quán)限使用等。事實上乌企,F(xiàn)indbugs 這些第三方的代碼檢查工具也同樣使用的是編譯插樁技術(shù)實現(xiàn)虑润。

插樁實踐

Javassist+gradle transform+annotation 實現(xiàn)方法耗時統(tǒng)計

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市加酵,隨后出現(xiàn)的幾起案子拳喻,更是在濱河造成了極大的恐慌,老刑警劉巖猪腕,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗澈,死亡現(xiàn)場離奇詭異,居然都是意外死亡陋葡,警方通過查閱死者的電腦和手機亚亲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腐缤,“玉大人捌归,你說我怎么就攤上這事×朐粒” “怎么了惜索?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绍在。 經(jīng)常有香客問我门扇,道長,這世上最難降的妖魔是什么偿渡? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任臼寄,我火速辦了婚禮,結(jié)果婚禮上溜宽,老公的妹妹穿的比我還像新娘吉拳。我一直安慰自己,他們只是感情好适揉,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布留攒。 她就那樣靜靜地躺著,像睡著了一般嫉嘀。 火紅的嫁衣襯著肌膚如雪炼邀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天剪侮,我揣著相機與錄音拭宁,去河邊找鬼。 笑死瓣俯,一個胖子當著我的面吹牛杰标,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彩匕,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼腔剂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驼仪?” 一聲冷哼從身側(cè)響起掸犬,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绪爸,沒想到半個月后登渣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡毡泻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年胜茧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇味。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呻顽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丹墨,到底是詐尸還是另有隱情廊遍,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布贩挣,位于F島的核電站喉前,受9級特大地震影響没酣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卵迂,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一裕便、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧见咒,春花似錦偿衰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宝当,卻和暖如春视事,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庆揩。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工郑口, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盾鳞。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓犬性,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腾仅。 傳聞我的和親對象是個殘疾皇子乒裆,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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