Android 工程师进阶 34 讲:第04讲:编译插桩操纵字节码,实现不可能完成的任务
定义
所谓编译插桩就是在代码编译期间修改已有的代码或者生成新代码。实际上,我们项目中经常用到的 Dagger、ButterKnife 甚至是 Kotlin 语言,它们都用到了编译插桩的技术。
理解编译插桩之前,需要先回顾一下 Android 项目中 .java 文件的编译过程:
从上图可以看出,我们可以在 1、2 两处对代码进行改造。
在
.java
文件编译成.class
文件时,APT、AndroidAnnotation 等就是在此处触发代码生成。在
.class
文件进一步优化成.dex
文件时,也就是直接操作字节码文件,也是本课时主要介绍的内容。这种方式功能更加强大,应用场景也更多。但是门槛比较高,需要对字节码有一定的理解。
第二种方式的过程如下图:
一般情况下,我们经常会使用编译插桩实现如下几种功能:
日志埋点;
性能监控;
动态权限控制;
业务逻辑跳转时,校验是否已经登录;
甚至是代码调试等。