只是一个 ART Method Hook 的 demo
通过修改 ArtMethod 中 JIT Cache 指针指向的代码入口地址头部插入 trampoline 跳转到我们希望代理的方法的地址即可实现方法的替换
原理听起来简单,但有非常多的细节需要注意:
- static 方法是 lazy resolve 的,在没有被调用之前,ArtMethod 的入口函数是一个跳板函数,即 art_quick_resolution_trampoline。
- 所以在 hook 之前需要检查,如果为 art_quick_resolution_trampoline 则需要手动 resolve。
- 方法可能还没有被 AOT 编译,这时入口函数是解释执行的入口,遇到这种情况需要手动调用 JIT 编译。
- 代码逻辑一模一样的函数可能会复用同一段代码,这时可能会 hook 到自己不希望 hook 的函数。
- 所有 JNI 函数共享同一个入口
- Hook 的过程中最好 stop the world,否则可能会跟 JIT 并发写代码,导致 crash