
获得徽章 19
- 今天分享一个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
展开21 - 好无聊啊,在线抽一位掘友请他喝奶茶,满100人开抽,公平公正公开。抽奖由本人取1-100的数字开始抽选,开始第一位写一,第二位写二,重复以第一位先答者为先,不可重复做答,否则失去获奖资格。而且奶茶由本人亲自挑选,过敏体质要提前说明,因为本人有卷,快要过期了,所以赶紧花出去才是王道。
记得点赞和关注
519107