背景:這一次分享一下關於android編譯插樁這個話題,在正常編寫代碼實現程序的邏輯外,還要使用一點點黑科技,拿起操做代碼無所不能的武器。html
記得去年曾經分享過xposed框架的使用,那是在系統層面去hook住方法,不足之處是系統要先刷入框架包,優勢是能夠對該系統裏面全部的app進行hookjava
是否能夠對咱們本身的應用進行代碼的修改?好比上面提到的有java hook,還有編譯插樁:下面是比較流行的框架android
而插樁的應用場景:apm,無埋點git
1. aspectJgithub
2. asm網絡
經過上面兩個圖能夠看出插樁後的代碼仍是有所區別,aspectJ採用插入方法的方式,這種代碼混淆的時候必定要注意,否則會出現找不到方法名。而asm採用直接把差別代碼嵌入原有的方法裏,顯然執行起來更加高效。app
1. 原代碼框架
2. 字節碼ide
3. asm代碼工具
能夠看出代碼相對來講是比較複雜的,可能須要工具才能正確去編寫asm代碼,好比idea插件bytecode outline
如圖所示:在編譯成.class文件後,執行asm步驟,對class文件進行處理。然後就把各類編譯後的文件打包進dex文件的過程。
一個簡單的demo,對一個方法進行asm插樁
自定義gradle plugin
guides.gradle.org/writing-gra…
Asm 字節碼插件: Asm Bytecode Outline
java字節碼: javac Apple.java javap -verbose Apple.class