字节码插桩AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节码插桩AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )相关的知识,希望对你有一定的参考价值。





一、" 字节码插桩 " 技术简介



性能优化 , 插件化 , 热修复 , 等技术都需要用到 " 字节码插桩 " 相关技术 ;


OOP 面向对象编程 , 主要针对业务逻辑进行开发 , 3 3 3 大特点 封装 , 继承 , 多态 ;

AOP 面向切面编程 , 主要针对某个动作进行开发 ;

  • 如 : 给 android 中所有的 Activity 添加安全策略 , 如果每个页面逐个手动添加 , 可能存在遗漏 , 并且会造成代码冗余 ; 通过 AOP 面向切面编程 , 完成上述操作 ;

" 字节码插桩 " 技术应用 :

  • 代码生成 : 编译时生成代码 , 提高开发效率 , 减少手工工作量 , 降低出错概率 ;
  • 代码修改 : 为某些三方库添加崩溃 try catch 异常捕获机制 ;
  • 代码监控 : 编译时插桩 , 监控应用各种性能 , 如页面打开时间 , 页面停留时间 ; 友盟应该用了该技术 ;
  • 代码分析 : 使用编译时字节码插桩技术 , 自定义代码检查 ;

字节码插桩原理 : 使用 javac 编译出 .class 字节码文件之后 , 使用 ASM 或 AspectJ 修改 .class 字节码文件 , 然后使用 dx 工具将修改后的 .class 字节码文件打包到 .dex 文件中 ;





二、AspectJ 插桩工具



AspectJ 插桩工具 :

使用简单 : 使用 AspectJ 插桩工具修改字节码文件 , 不需要了解 .class 字节码文件的二进制格式 ;

成熟稳定 : 字节码操作 如果错了 1 1 1 个字节 , 整个字节码就无法正常工作 , 因此修改字节码操作 , 必须稳定 , 这也是插桩工具的必备条件 ;

固定切入点 : AspectJ 只能在固定的几个切入点插入 , 如 : 方法调用前 , 方法内部 , 异常前后 , 变量修改 ; 不能完成很细致的操作 , 如将某些特定规则的字节码序列作为切入点 ;

匹配规则 : AspectJ 的匹配规则类似于正则表达式 , 如 : 匹配 onXXX 方法 , 会匹配到 onCreate 方法 , 也会匹配到 onDestroy 方法 ;

性能低 : AspectJ 插入逻辑时 , 会添加一些额外冗余代码 , 生成的字节码肯定大于之前的字节码文件 , 对原来的性能也有一定影响 , 修改后的字节码文件 性能低于 修改前的字节码文件 ;





三、ASM 插桩工具



ASM 插桩工具 :

操作灵活 : 可以在字节码 任何位置 , 自定义修改 , 插入 , 删除 相关逻辑 ;

上手很难 : 使用 ASM 的前提是必须 对 Java 的 .class 字节码文件有比较深入的了解 ;

以上是关于字节码插桩AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )的主要内容,如果未能解决你的问题,请参考以下文章

Java 字节码插桩技术

看这一篇,你也可以自如的掌握字节码插桩

看这一篇,你也可以自如的掌握字节码插桩

Android字节码插桩——详细讲解 附带Demo

Android AOP编程——Gradle插件+TransformAPI+字节码插桩实战

Android AOP编程——Gradle插件+TransformAPI+字节码插桩实战