【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )
文章目錄
- 一、" 字節(jié)碼插樁 " 技術(shù)簡介
- 二、AspectJ 插樁工具
- 三、ASM 插樁工具
一、" 字節(jié)碼插樁 " 技術(shù)簡介
性能優(yōu)化 , 插件化 , 熱修復(fù) , 等技術(shù)都需要用到 " 字節(jié)碼插樁 " 相關(guān)技術(shù) ;
OOP 面向?qū)ο缶幊?/font> , 主要針對業(yè)務(wù)邏輯進(jìn)行開發(fā) , 333 大特點 封裝 , 繼承 , 多態(tài) ;
AOP 面向切面編程 , 主要針對某個動作進(jìn)行開發(fā) ;
- 如 : 給 Android 中所有的 Activity 添加安全策略 , 如果每個頁面逐個手動添加 , 可能存在遺漏 , 并且會造成代碼冗余 ; 通過 AOP 面向切面編程 , 完成上述操作 ;
" 字節(jié)碼插樁 " 技術(shù)應(yīng)用 :
- 代碼生成 : 編譯時生成代碼 , 提高開發(fā)效率 , 減少手工工作量 , 降低出錯概率 ;
- 代碼修改 : 為某些三方庫添加崩潰 try catch 異常捕獲機(jī)制 ;
- 代碼監(jiān)控 : 編譯時插樁 , 監(jiān)控應(yīng)用各種性能 , 如頁面打開時間 , 頁面停留時間 ; 友盟應(yīng)該用了該技術(shù) ;
- 代碼分析 : 使用編譯時字節(jié)碼插樁技術(shù) , 自定義代碼檢查 ;
字節(jié)碼插樁原理 : 使用 javac 編譯出 .class 字節(jié)碼文件之后 , 使用 ASM 或 AspectJ 修改 .class 字節(jié)碼文件 , 然后使用 dx 工具將修改后的 .class 字節(jié)碼文件打包到 .dex 文件中 ;
二、AspectJ 插樁工具
AspectJ 插樁工具 :
使用簡單 : 使用 AspectJ 插樁工具修改字節(jié)碼文件 , 不需要了解 .class 字節(jié)碼文件的二進(jìn)制格式 ;
成熟穩(wěn)定 : 字節(jié)碼操作 如果錯了 111 個字節(jié) , 整個字節(jié)碼就無法正常工作 , 因此修改字節(jié)碼操作 , 必須穩(wěn)定 , 這也是插樁工具的必備條件 ;
固定切入點 : AspectJ 只能在固定的幾個切入點插入 , 如 : 方法調(diào)用前 , 方法內(nèi)部 , 異常前后 , 變量修改 ; 不能完成很細(xì)致的操作 , 如將某些特定規(guī)則的字節(jié)碼序列作為切入點 ;
匹配規(guī)則 : AspectJ 的匹配規(guī)則類似于正則表達(dá)式 , 如 : 匹配 onXXX 方法 , 會匹配到 onCreate 方法 , 也會匹配到 onDestroy 方法 ;
性能低 : AspectJ 插入邏輯時 , 會添加一些額外冗余代碼 , 生成的字節(jié)碼肯定大于之前的字節(jié)碼文件 , 對原來的性能也有一定影響 , 修改后的字節(jié)碼文件 性能低于 修改前的字節(jié)碼文件 ;
三、ASM 插樁工具
ASM 插樁工具 :
操作靈活 : 可以在字節(jié)碼 任何位置 , 自定義修改 , 插入 , 刪除 相關(guān)邏輯 ;
上手很難 : 使用 ASM 的前提是必須 對 Java 的 .class 字節(jié)碼文件有比較深入的了解 ;
總結(jié)
以上是生活随笔為你收集整理的【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字节码插桩】Android 打包流程
- 下一篇: 【Binder 机制】进程通信 | 用户