【字节码插桩】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 AOP之字节码插桩
背景 本篇文章基于<网易乐得无埋点数据收集SDK>总结而成,关于网易乐得无埋点数据采集SDK的功能介绍以及技术总结后续会有文章进行阐述,本篇单讲SDK中用到的Android端AOP的实 ...
- 美团热修复Robust源码庖丁解牛(第一篇字节码插桩)
如果你想对java编译后的class文件做一些手脚的话,市面上有供你选择的asm.javassist.aspectJ(aop面向切面编程)等等,一般修改class文件的用途有你想统计一些东西,例如ap ...
- 大端字节序码流中取出2字节_字节码忍者的秘密
大端字节序码流中取出2字节 Java语言由Java语言规范(JLS)定义. 但是,Java虚拟机的可执行字节码由单独的标准Java虚拟规范(通常称为VMSpec)定义. JVM字节码由javac从Ja ...
- python 字节码_简单入门python字节码混淆
前言 我就是小菜鸡本鸡了,不是很会写东西,请各位大佬多多见谅.本文基于python2.7,因为python3并不是很懂. python文件如果要发布的话,有时候还是难免想保护一下自己的源码,有些人就直 ...
- 大端字节序码流中取出2字节_产生字节码
大端字节序码流中取出2字节 在这篇文章中,我们将看到如何为我们的语言生成字节码. 到目前为止,我们已经看到了如何构建一种语言来表达我们想要的东西,如何验证该语言,如何为该语言构建编辑器,但实际上我们还 ...
- java中字节码_聊聊Java的字节码
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身. 怀旧空吟闻笛赋,到乡翻似烂柯人. 沉舟侧畔千帆过,病树前头万 ...
- C语言会生成字节码文件吗,什么是字节码文件?
字节码文件是经过编译器预处理过的一种文件,是JAVA的执行文件存在形式, Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行.解释是通过Ja ...
- C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转
C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...
- GBK(国标码)英文是几个字节?
GBK(国标码)英文是几个字节? 很确定的说GBK不管中英文都是2字节,但是为什么我们试验的情况下为1字节?因为我们使用的是半角,当使用半角时候使用的使用的是ASCII 码,所以为一字节. 1个字符占 ...
最新文章
- LeetCode刷题记录3——237. Delete Node in a Linked List(easy)
- Perturbed Masking:和参数无关的预训练模型分析方法
- 字符集_第07期:有关 MySQL 字符集的 SQL 语句
- 重构技术架构首先解决组织架构
- Javascript开发的HTML5游戏的知识产权保护
- STM8单片机ADC连续扫描模式
- mysql打开慢查询_MySQL 开启慢查询日志的方法
- Ubuntu20.04安装ros教程(实测有用)
- JAVA超市综合管理信息区块链系统毕设论文
- linux使用触摸屏驱动程序,Linux触摸屏驱动
- MVG基站天线测量系统获盛路通信选用
- 数据分析~中国五大城市PM2.5数据分析01
- 如何在MSDN上获取Win7镜像
- 服务器智能阵列,HPE ProLiant Gen10 服务器智能阵列卡S100i SR Gen10 BIOS下开启阵列功能配置阵列并安装win2016系统...
- 三代Pacbio进行细菌16S全长测序
- 学计算机颈椎痛,近九成电脑族曾颈椎疼痛,怎么办?
- Leetcode算法——50、实现乘方运算
- 彻底解决烦人的win10更新
- linux学习——1.ping通百度
- trifecta_ui安装
热门文章
- php中time()和mktime()方法的区别
- 看一遍那些网络上晦涩的名词都弄明白了!
- [深入理解MySQL系列] - sort_buffer
- chrome下载离线安装包
- python文件IO操作
- 【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析...
- python——模块1、模块的分类
- Web API之service worker
- python-logging用法
- 简单的横向ListView实现(version 3.0)