字节码总结
字节码总结
字节码基础
字节码文件中具体保存了哪些东西?
JVM 之 class 加载过程
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的 _ 类加载机制。
ASM 字节码插桩框架
ASM 工作在哪个阶段?
- 在.java 文件编译成.class 文件时,APT 工作在这个阶段
- 在.class 文件进一步优化成.dex 文件时,ASM 工作在这个阶段
ASM API
ASM Tree API 对象模型
一次性读入内存,类似 XML 文件解析中的 DOM 方式;耗内存
ASM Tree API 可以类比解析 XML 文件中的 DOM 方式,把整个类的结构读取到内存中,缺点是消耗内存多,但是编程比较简单。TreeApi 不同于 CoreAPI,TreeAPI 通过各种 Node 类来映射字节码的各个区域,类比 DOM 节点,就可以很好地理解这种编程方式。
ClassReader/ClassWriter
ASM Core API 事件模型(常见)
流式处理字节码文件,类型 XML 文件解析中的 SAX 方式;节约内存
ASM Core API 可以类比解析 XML 文件中的 SAX 方式,不需要把这个类的整个结构读取进来,就可以用流式的方法来处理字节码文件。好处是非常节约内存,但是编程难度较大。然而出于性能考虑,一般情况下编程都使用 Core API。
ClassReader、ClassWriter 和各种 Visitor 类(访问者模式)
字节码面试题
字节码相关 INVOKEVIRTUAL INVOKESPECIAL INVOKESTATIC 之间的区别
- INVOKEVIRTUAL 调用类的方法
- INVOKESPECIAL 调用父类
- INVOKESTATIC 调用静态方法
用 ASM 在项目都做了哪些事情?
Transform+ASM 实现指定方法的 try catch,可用于修复三方 sdk 的 crash
输出方法执行耗时
可用于分析 ui-thread 方法耗时情况
隐私合规方法检测
- 扫描 dex 找到在隐私列表中的 api,打印出来,并将调用替换掉
""
、null
或emptyList()
。 - 如 getImei,getDeviceId(), wifi 等
本文由作者按照 CC BY 4.0 进行授权