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 模块