文章目录
一、" 字节码插桩 " 技术简介
二、AspectJ 插桩工具
三、ASM 插桩工具
一、" 字节码插桩 " 技术简介
性能优化 , 插件化 , 热修复 , 等技术都需要用到 " 字节码插桩 " 相关技术 ;
OOP 面向对象编程 , 主要针对业务逻辑进行开发 , 3 33 大特点 封装 , 继承 , 多态 ;
AOP 面向切面编程 , 主要针对某个动作进行开发 ;
如 : 给 Android 中所有的 Activity 添加安全策略 , 如果每个页面逐个手动添加 , 可能存在遗漏 , 并且会造成代码冗余 ; 通过 AOP 面向切面编程 , 完成上述操作 ;
" 字节码插桩 " 技术应用 :
代码生成 : 编译时生成代码 , 提高开发效率 , 减少手工工作量 , 降低出错概率 ;
代码修改 : 为某些三方库添加崩溃 try catch 异常捕获机制 ;
代码监控 : 编译时插桩 , 监控应用各种性能 , 如页面打开时间 , 页面停留时间 ; 友盟应该用了该技术 ;
代码分析 : 使用编译时字节码插桩技术 , 自定义代码检查 ;
字节码插桩原理 : 使用 javac 编译出 .class 字节码文件之后 , 使用 ASM 或 AspectJ 修改 .class 字节码文件 , 然后使用 dx 工具将修改后的 .class 字节码文件打包到 .dex 文件中 ;
二、AspectJ 插桩工具
AspectJ 插桩工具 :
使用简单 : 使用 AspectJ 插桩工具修改字节码文件 , 不需要了解 .class 字节码文件的二进制格式 ;
成熟稳定 : 字节码操作 如果错了 1 11 个字节 , 整个字节码就无法正常工作 , 因此修改字节码操作 , 必须稳定 , 这也是插桩工具的必备条件 ;
固定切入点 : AspectJ 只能在固定的几个切入点插入 , 如 : 方法调用前 , 方法内部 , 异常前后 , 变量修改 ; 不能完成很细致的操作 , 如将某些特定规则的字节码序列作为切入点 ;
匹配规则 : AspectJ 的匹配规则类似于正则表达式 , 如 : 匹配 onXXX 方法 , 会匹配到 onCreate 方法 , 也会匹配到 onDestroy 方法 ;
性能低 : AspectJ 插入逻辑时 , 会添加一些额外冗余代码 , 生成的字节码肯定大于之前的字节码文件 , 对原来的性能也有一定影响 , 修改后的字节码文件 性能低于 修改前的字节码文件 ;
三、ASM 插桩工具
ASM 插桩工具 :
操作灵活 : 可以在字节码 任何位置 , 自定义修改 , 插入 , 删除 相关逻辑 ;
上手很难 : 使用 ASM 的前提是必须 对 Java 的 .class 字节码文件有比较深入的了解 ;