目录
5.1确认需要hook操作对象OnClickListener实现的实例
5.2获取要hook干涉执行逻辑的拥有者(ListenerInfo对象);
5.3创建(hook对象)OnClickListener类实例代理类,在代理类内加入自己代码;
1.Hook是做什么的?(解决什么问题?)
API HOOK百度百科解释如下:
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等。 API HOOK 技术并不是计算机病毒专有技术,但是计算机病毒经常使用这个技术来达到隐藏自己的目的。
Hook可以帮助我们在Android中在SDK源代码逻辑执行过程中,通过代码手动拦截执行该逻辑,加入自己的代码逻辑;
例如常见的一些业务统计功能或者方法执行的性能监测功能我们都可以通过Hook技术进行拦截,加入自己代码逻辑;
以前都是通过友盟,百度创建ID和描述,需要开发将事件记录一个一个加入到需要统计的点上,很容易出现漏记的情况,修改需要重新发包;在APP开发过程中通常需要统计用户点击了那些按钮,页面的打开关闭,页面停留时长都可以通过Hook技术大大减小开发工作量和出错率;
2.HOOK技术如何改变API执行结果的?
最初有些人对某些api函数的功能不太满意,就产生了如何修改这些api,使之更好的服务于程序的想法,这样api hook就自然而然的出现了。
HOOK技术的难点,并不在于hook技术,而在于对SDK源码的学习和理解,找到使用HOOK的入口函数,进行拦截然后加入自己的代码;
3.使用Hook技术需要有实现Java反射和阅读源码的能力
3.1Java反射
Java反射常用类Class,Method,Field等;
SDK源码类有很多用@hide被隐藏的方法,成员,类无法直接访问,需要通过反射访问方法,成员,类等;
TextView
/**
* @return the size (in scaled pixels) of thee default text size in this TextView.
* @hide
*/
@ViewDebug.ExportedProperty(category = "text")
public float getScaledTextSize() {
return mTextPaint.getTextSize() / mTextPaint.density;
}
3.2SDK源码
需要阅读SDK源码找到入口函数,这样才能通过Hook技术进行拦截,添加自己的代码逻辑;当追踪源码时经常看见SDK源码大面积飘红;
所以,推荐从安卓官网下载整套源码,然后使用 SourceInsight
查看源码。
如果不需要跳来跳去的话,直接用 安卓源码网站 一步到位
4.Hook实现的通用思路
无论多么复杂的逻辑,当我们需要干涉执行,最终都是需要将自己的代码逻辑替换干涉执行的逻辑;
a.确认需要hook操作