文章

字节码总结

字节码总结

字节码基础

字节码文件中具体保存了哪些东西?

tbban

JVM 之 class 加载过程

8edh2
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的 _ 类加载机制。

ASM 字节码插桩框架

ASM 工作在哪个阶段?

uc4wj

  1. 在.java 文件编译成.class 文件时,APT 工作在这个阶段
  2. 在.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 之间的区别

  1. INVOKEVIRTUAL 调用类的方法
  2. INVOKESPECIAL 调用父类
  3. INVOKESTATIC 调用静态方法

用 ASM 在项目都做了哪些事情?

Transform+ASM 实现指定方法的 try catch,可用于修复三方 sdk 的 crash

输出方法执行耗时

可用于分析 ui-thread 方法耗时情况

隐私合规方法检测

  1. 扫描 dex 找到在隐私列表中的 api,打印出来,并将调用替换掉 ""nullemptyList()
  2. 如 getImei,getDeviceId(), wifi 等
本文由作者按照 CC BY 4.0 进行授权