今天分享一个hook的优雅写法:
背景:
某些场景下对外没有提供可以回调的方法进行处理,但是我们需要这部分回调。(最频繁的一个场景就是我们希望可以拿到主线程的handlerCallback从而实现生命周期的检测)
作用:
Hook的作用就是希望我们能够代替某个对象做处理。
操作:
首先我们需要提供Hook之后我们的操作但是也不能破坏原有的行为。因此我们需要接受原对象为参数,在逻辑中只处理我们希望处理的某个部分其余的交给源对象去做;并返回我们hook的新对象,以便在合适时机进行替换。这部分可以简化成Lambda传入。

该部分操作也叫作swap函数。将源对象参数传入得到hook之后的对象,在合适时机调用swap函数进行替换源对象操作。

例如下端代码
// 1. Hook mH.mCallback
swapActivityThreadHandlerCallback { mCallback /*原对象*/ ->
// uninstallActivityThreadHandlerCallback:用于取消 Hook
uninstallActivityThreadHandlerCallback = {
swapActivityThreadHandlerCallback {
mCallback
}
}


// 使用反射修改
ActivityThread 的主线程消息循环的 mH.mCallback
// swap 是一个 lambda 表达式,参数为原对象,返回值为注入的新对象
private fun swapActivityThreadHandlerCallback(swap: (Handler.Callback?) -> Handler.Callback?) {
参考:
作者:彭旭锐
juejin.cn
展开
2