ASM插桩

阅读 78

2021-09-18

https://blog.csdn.net/u013144863/category_10236998.html

Android ASM 插桩实践

1.什么是 ASM?一个字节码操作库,它可以直接修改已经存在的 class 文件或者生成 class 文件。

 ASM 的核心 API:

ClassReader:对具体的 class 文件进行读取与解析

ClassVisitor、AdviceAdapter:可以访问class文件的各个部分,比如方法、变量、注解等,用于修改 class 文件。

ClassWriter:将修改后的class文件通过文件流的方式覆盖掉原来的 class 文件,从而实现 class 修改;

2.基础 Java 字节码知识

字节码描述符

对于基本数据类型(byte char double float int long short boolean)以及代表无返回值的void类型都用一个大写字符来表示,对象类型则用字符“L”加对象的全限定名来表示(即把包名所有“.”换成了“/” ),一般对象类型末尾都会加一个“;”来表示全限定名的结束。



3.虚拟机执行字节码基础

虚拟机的内存分为堆内存与栈内存。堆内存所有线程共享,栈内存则线程私有,重点解释下栈内存。

总之我们知道每个线程对应的中会有若干栈帧,每个栈帧对应着相应的方法





4.一款 IDEA 的插件 ASM Bytecode Outline。它可以自动给你生成对应的 ASM 操作代码。

IDEA Java 工程:https://github.com/changer0/JavaASMDemo

Android 工程:https://github.com/changer0/ASMInjectDemo





Android Transform API

1.第三方插件在将编译后的类文件转换为 dex 文件之前对 .class 文件进行操作。

2.Transform API 

getName():用于指定 Transform 的名字,对应了该 Transform 所代表的 Task 的名称

isIncremental():方法指明是否支持增量编译。

getInputTypes():用于指定 Transform 的输入类型,可以作为输入过滤的一种手段。在 TransformManager 中定义了很多类型:

    CONTENT_CLASS // 代表 javac 编译成的 class 文件(一般用它)

    CONTENT_JARS

    CONTENT_RESOURCES // 这里的 resources 单指 java 的资源

    CONTENT_NATIVE_LIBS

    CONTENT_DEX

    CONTENT_DEX_WITH_RESOURCES

    DATA_BINDING_BASE_CLASS_LOG_ARTIFACT

getScopes():用于指定 Transform 的作用域。同样在 TransformManager 中定义了很多类型,常用的是 SCOPE_FULL_PROJECT,即代表所有 Project。

transform(TransformInvocation)







Android Gradle 插件基础

1.Gradle 构建生命周期

 Gradle 为了管理这些 Task 会在任何一个 Task 执行前构建一个 DAG 图(Directed Acyclic Graph,有向无环图)

2.自定义插件

特别:buildSrc 模块

精彩评论(0)

0 0 举报