Android 工程师进阶 34 讲:第04讲:编译插桩操纵字节码,实现不可能完成的任务

定义

所谓编译插桩就是在代码编译期间修改已有的代码或者生成新代码。实际上,我们项目中经常用到的 Dagger、ButterKnife 甚至是 Kotlin 语言,它们都用到了编译插桩的技术。

理解编译插桩之前,需要先回顾一下 Android 项目中 .java 文件的编译过程:

🎷 编译插桩 - 图1

从上图可以看出,我们可以在 1、2 两处对代码进行改造。

  1. .java 文件编译成 .class 文件时,APT、AndroidAnnotation 等就是在此处触发代码生成。

  2. .class 文件进一步优化成 .dex 文件时,也就是直接操作字节码文件,也是本课时主要介绍的内容。这种方式功能更加强大,应用场景也更多。但是门槛比较高,需要对字节码有一定的理解。

第二种方式的过程如下图:
🎷 编译插桩 - 图2

一般情况下,我们经常会使用编译插桩实现如下几种功能:

  • 日志埋点;

  • 性能监控;

  • 动态权限控制;

  • 业务逻辑跳转时,校验是否已经登录;

  • 甚至是代码调试等。