1. 程式人生 > >在Android App開發中實現任意Java方法的攔截

在Android App開發中實現任意Java方法的攔截

在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,就可以把方法攔截適用到任意程序了。