近期要做網(wǎng)絡(luò)請求數(shù)據(jù)統(tǒng)計(主要是為了監(jiān)控頻繁請求和流量異常)照瘾。
由于項目中使用了多種網(wǎng)庫發(fā)送請求,有HttpClient厂捞,HttpUrlConnection餐屎,Volley等檀葛,如果只是在所有請求發(fā)送和返回的地方加上統(tǒng)計,未免顯得太low腹缩,工作量也大屿聋。
于是想到用Hook的方法空扎,將所有發(fā)送和返回請求的地方替換成我們自己的方法,就能對其為所欲為润讥。
在Android里提到Hook就不能不提兩個大神級的項目勺卢,Xposed和Cydia Substrate,它們功能太強大象对,運行的條件也苛刻,都需要設(shè)備root宴抚。只好敬而遠(yuǎn)之勒魔。
Legend https://github.com/asLody/legend
《解析 dex 文件結(jié)構(gòu) - 索引區(qū)和數(shù)據(jù)區(qū)(三) - 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.reibang.com/p/b29a21a162ad)
#######
實用功能
#######
1,在native層執(zhí)行java層的方法
方法1:
dalvik中使用Thread來執(zhí)行方法
AOSP/dalvik/vm/interp/Stack.c
void dvmCallMethod(Thread* self, const Method* method, Object* object, ....) {
......
}
Thread如何獲裙角冠绢?
Thread* self = dvmThreadSelf();
方法2:
通用,使用JNIEnv來執(zhí)行
JNIEnv::CallObjectMethod(jclass object, jmethodID method);
其中method的獲瘸3薄:
jmethodID method = JNIEnv::GetMethodID(jclass, "method_name", xxxx);