近期要做网络请求数据统计(主要是为了监控频繁请求和流量异常)。
由于项目中使用了多种网库发送请求,有HttpClient,HttpUrlConnection,Volley等,如果只是在所有请求发送和返回的地方加上统计,未免显得太low,工作量也大。
于是想到用Hook的方法,将所有发送和返回请求的地方替换成我们自己的方法,就能对其为所欲为。
在Android里提到Hook就不能不提两个大神级的项目,Xposed和Cydia Substrate,它们功能太强大,运行的条件也苛刻,都需要设备root。只好敬而远之。
Legend https://github.com/asLody/legend
《解析 dex 文件结构 - 索引区和数据区(三) - ClassDefs》(http://kiya.space/2015/11/21/parse-dex-file-part-classdefs/)
《Dex文件格式详解》(http://www.blogfshare.com/dex-format.html)
Hook的原理
《Dalvik虚拟机原理及Xposed hook原理》(http://www.jianshu.com/p/b29a21a162ad)
#######
实用功能
#######
1,在native层执行java层的方法
方法1:
dalvik中使用Thread来执行方法
AOSP/dalvik/vm/interp/Stack.c
void dvmCallMethod(Thread* self, const Method* method, Object* object, ....) {
......
}
Thread如何获取?
Thread* self = dvmThreadSelf();
方法2:
通用,使用JNIEnv来执行
JNIEnv::CallObjectMethod(jclass object, jmethodID method);
其中method的获取:
jmethodID method = JNIEnv::GetMethodID(jclass, "method_name", xxxx);