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