文章目录

  • 一、" 字节码插桩 " 技术简介
  • 二、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 插桩工具 )相关推荐

  1. Android AOP之字节码插桩

    背景   本篇文章基于<网易乐得无埋点数据收集SDK>总结而成,关于网易乐得无埋点数据采集SDK的功能介绍以及技术总结后续会有文章进行阐述,本篇单讲SDK中用到的Android端AOP的实 ...

  2. 美团热修复Robust源码庖丁解牛(第一篇字节码插桩)

    如果你想对java编译后的class文件做一些手脚的话,市面上有供你选择的asm.javassist.aspectJ(aop面向切面编程)等等,一般修改class文件的用途有你想统计一些东西,例如ap ...

  3. 大端字节序码流中取出2字节_字节码忍者的秘密

    大端字节序码流中取出2字节 Java语言由Java语言规范(JLS)定义. 但是,Java虚拟机的可执行字节码由单独的标准Java虚拟规范(通常称为VMSpec)定义. JVM字节码由javac从Ja ...

  4. python 字节码_简单入门python字节码混淆

    前言 我就是小菜鸡本鸡了,不是很会写东西,请各位大佬多多见谅.本文基于python2.7,因为python3并不是很懂. python文件如果要发布的话,有时候还是难免想保护一下自己的源码,有些人就直 ...

  5. 大端字节序码流中取出2字节_产生字节码

    大端字节序码流中取出2字节 在这篇文章中,我们将看到如何为我们的语言生成字节码. 到目前为止,我们已经看到了如何构建一种语言来表达我们想要的东西,如何验证该语言,如何为该语言构建编辑器,但实际上我们还 ...

  6. java中字节码_聊聊Java的字节码

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身. 怀旧空吟闻笛赋,到乡翻似烂柯人. 沉舟侧畔千帆过,病树前头万 ...

  7. C语言会生成字节码文件吗,什么是字节码文件?

    字节码文件是经过编译器预处理过的一种文件,是JAVA的执行文件存在形式, Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行.解释是通过Ja ...

  8. C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转

    C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...

  9. GBK(国标码)英文是几个字节?

    GBK(国标码)英文是几个字节? 很确定的说GBK不管中英文都是2字节,但是为什么我们试验的情况下为1字节?因为我们使用的是半角,当使用半角时候使用的使用的是ASCII 码,所以为一字节. 1个字符占 ...

最新文章

  1. LeetCode刷题记录3——237. Delete Node in a Linked List(easy)
  2. Perturbed Masking:和参数无关的预训练模型分析方法
  3. 字符集_第07期:有关 MySQL 字符集的 SQL 语句
  4. 重构技术架构首先解决组织架构
  5. Javascript开发的HTML5游戏的知识产权保护
  6. STM8单片机ADC连续扫描模式
  7. mysql打开慢查询_MySQL 开启慢查询日志的方法
  8. Ubuntu20.04安装ros教程(实测有用)
  9. JAVA超市综合管理信息区块链系统毕设论文
  10. linux使用触摸屏驱动程序,Linux触摸屏驱动
  11. MVG基站天线测量系统获盛路通信选用
  12. 数据分析~中国五大城市PM2.5数据分析01
  13. 如何在MSDN上获取Win7镜像
  14. 服务器智能阵列,HPE ProLiant Gen10 服务器智能阵列卡S100i SR Gen10 BIOS下开启阵列功能配置阵列并安装win2016系统...
  15. 三代Pacbio进行细菌16S全长测序
  16. 学计算机颈椎痛,近九成电脑族曾颈椎疼痛,怎么办?
  17. Leetcode算法——50、实现乘方运算
  18. 彻底解决烦人的win10更新
  19. linux学习——1.ping通百度
  20. trifecta_ui安装

热门文章

  1. php中time()和mktime()方法的区别
  2. 看一遍那些网络上晦涩的名词都弄明白了!
  3. [深入理解MySQL系列] - sort_buffer
  4. chrome下载离线安装包
  5. python文件IO操作
  6. 【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析...
  7. python——模块1、模块的分类
  8. Web API之service worker
  9. python-logging用法
  10. 简单的横向ListView实现(version 3.0)