在Android的App开发过程中,经常会有一些导致App进程崩溃的Framework层Bug,比如这里讲的Cookie同步引起的崩溃等问题。这种情况下,我们如果能拦截到Framework层的Api调用,对它做个包装把异常捕捉住,就可以避免这个问题了。
当时,纯Java层是做不到的,而Java中的Proxy机制也只能针对自己定义的类,系统Framework层的类就不管用了。这里面说一种通过借鉴Java的JNI机制来实现进程类任意Java方法拦截。
任何一个Java方法在C++层都对应一个Method类,如果是JNI方法的话,Method类的成员变量nativeFunc指向的就是JNI的Native实现,如果不是JNI方法,则指向Java方法实现,并调用dvmInterpret执行该Java方法。利用这种机制,我们就可以实现方法拦截了。假设我们有一个Java层方法Java_Method需要Hook,我们就把Hook方法Java_Method_Hook提供给Java_Method的C层Method,放放到其成员变量ins中。接下来再定义一个C层方法C_hookHandler,把这个方法赋给Method的nativeFunc成员变量,然后,当C_hookHandler被调用时,就可以通过调用ins成员变量中的Java_Method_Hook来做到对Java_Method拦截了。
更加详细和系统化的流程,可以参考下面这篇文章,或者Xposed源代码。
http://blog.csdn.net/luoshengyang/article/details/8914953
Xposed最大的不同是通过替换app_process来实现了对其它进程的Hack,就可以把方法拦截适用到任意进程了。
时间: 2024-11-03 21:03:35