[发明专利]基于函数拦截技术的手机APP性能数据采集方法有效
申请号: | 201510373885.4 | 申请日: | 2015-07-01 |
公开(公告)号: | CN104951375B | 公开(公告)日: | 2017-12-08 |
发明(设计)人: | 吴少阳 | 申请(专利权)人: | 北京博睿宏远数据科技股份有限公司 |
主分类号: | G06F9/54 | 分类号: | G06F9/54 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100020 北京*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 函数 拦截 技术 手机 app 性能 数据 采集 方法 | ||
技术领域
本发明涉及一种手机APP性能数据采集方法,尤其涉及一种基于函数拦截技术的手机APP性能数据采集方法。
背景技术
随着移动互联网的蓬勃发展,各种各样的手机应用客户端(以下简称APP)出现在我们的手机中。目前应用市场中绝大部分的APP都需要有网络交互,网络交互的性能直接影响着APP的用户体验。因此了解全国甚至全球各个地区使用APP的网络性能数据,才能找到提高APP用户体验的方法,这是很多移动互联网公司关心的问题。
现有的网络性能数据获取方法有两种:
第一种是通过网卡抓包的方式来获得的,具体在智能手机上是用TCPDUMP(一种在Windows、Linux、Android上通用的抓包工具)来获得的。其原理,是通过注册虚拟底层网络协议,来获得对网络数据报文的处理权,从而捕获经过智能手机的Wi-Fi模块、2/3/4G数据模块的网络数据报文。利用TCPDUMP获取一款APP的网络性能数据的使用流程是:首先开启TCPDUMP,接着再启动APP,然后退出APP,最后停止TCPDUMP得到网络性能数据。
第二种是ADDRESS HOOK,针对APP进程,注入自己的动态库,并且替换APP进程中动态库外部依赖表中的函数地址来实现对网络函数调用的拦截。其原理是无论是java网络库还是定制JNI动态库来实现网络功能,最终都会经过中间一层的动态库来调用LibC中的真正网络函数。中间层动态库有一个外部依赖表,在中间层动态库被加载到内存的过程中,其外部依赖表会被填充LibC网络函数所在的地址。而前述网络调用过程都会查询这个外部依赖表来访问真正的网络函数。
举java网络库的调用过程来说明,见图1。java网络库会执行相应的类的native函数,转而执行到JNI动态库函数,JNI动态库函数在调用LibC相应的网络函数之前,会查找动态库中的外部项依赖表找到目标函数真实地址,最终函数执行完毕,会一级一级向上栈式返回,最终完成java网络库调用。
使用TCPDUMP抓包获取网络性能数据的缺点有:
1、TCPDUMP本身运行在各种型号的手机上的稳定性很差,经常遇到不能正常停止以及抓到不完整的pcap包的情况。
2、TCPDUMP捕获的是整个系统上的网络通信数据,不能识别出数据是来自哪个进程的。这会导致进行网络数据分析时会夹带非目标程序的DNS、TCP、UDP数据,这会导致基于数据做出的分析出现错误。
3、TCPDUMP的数据获取只能观察数据而不能修改数据。不能实现功能扩展。
ADDRESS HOOK的缺点:
1、替换所有进程加载的动态库函数表。这个导致初始化时间较长。
2、ADDRESS HOOK查找外部依赖项是根据函数名字来匹配的,如果自定义的动态库导出表中,存在与LibC中一样函数名的函数,并且该函数被其他动态库引用,那么HOOK之后可能导致程序执行出现崩溃。
3、动态链接的方式加载动态库来使用的函数,需要拦截dlsym函数。
4、Android中,对于使用函数指针来调用LibC网络库的调用方式,ADDRESS HOOK不能拦截。会导致性能数据不完全。
5这种方式容易被封堵,容易被安全性较高的代码绕过,从而达不到挂钩的效果。
发明内容
为了解决上述技术所存在的不足之处,本发明提供了一种基于函数拦截技术的手机APP性能数据采集方法。其特征在于:
所述采集方法的具体实施步骤为:
步骤一:
在目标APP启动之前,利用ptrace调用,向zyogte进程中注入自己的动态库S,并利用ADDRESS HOOK拦截fork方法,在fork替代函数中完成对LibC中的getaddrinfo,gethostbyname,connect,send,sendto,write,sendmsg,recv,recvfrom,read,recvmsg,close等网络函数和select,poll,epoll_wait等套接字事件监控函数的Inline Hook的初始化过程;这样,由于APP进程是由zygote复制(copy)出来的,当APP进程启动时,就已经完成了对APP进程的Inline Hook;
步骤二:
Inline Hook完成之后,启动app进程,发生网络交互时,应用程序会调用被拦截的网络函数,程序的执行过程是:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京博睿宏远数据科技股份有限公司,未经北京博睿宏远数据科技股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510373885.4/2.html,转载请声明来源钻瓜专利网。
- 上一篇:排序加速处理器、方法、系统和指令
- 下一篇:调度系统的消息队列处理方法