写过windows编辑的同学肯定对当时的特别强大的HOOK记忆犹新,不管是什么系统事件,都能捕捉住,那么在android中,如何实现Hook机制呢。
hook,又叫钩子,通常是指对一些方法进行拦截。这样当这些方法被调用时,也能够执行我们自己的代码,这也是面向切面编程的思想(AOP)
android中,本身并不提供这样的拦截机制,但是有时候,我们可以在一些特殊的场合实现一种的Hook方法。
大致思路:
1. 找到需要Hook方法的系统类(最好是单例的情况)
2. 利用java的动态代理这个系统类
3. 使用反射的方法把这个系统类替换成你的动态代理类
这里,我们以最常见到的拦截 Activity的生命周期为例。经过研究观察,我们发现在android.app.ActivityManagerNative中有一个gDefault属性,这个属性是static final的,返回的是一个singleton的IActivityManager。
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager More ...create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
这个就给我们可以操作的入口。
有了目标之后,就可以用自己的动态代理