Android运行数据收集思考

       分享是最好的学习,这个从高中时代就深入体会.但是后来因为自己的懒惰,没能坚持做下去,心里空落的很.

       适逢这段时间做移动终端的运行监控,今天工作暂告一段落,把这几天对Android App运行监控思路总结总结.一是工作的总结,一是防止遗忘,因为人最容易遗忘,还有就是扔一块砖,希望能引出高手的玉.

       工作背景

       监控App对服务的请求执行情况,了解App可用性能以及运行性能,为定位运行问题提供数据\技术支持.

       监控的业务拓扑如下:
Android运行数据收集思考
 

      

       监控思路

       监控主体思路是多维分析。因为问题的产生往往是很多条件交织在一起,在一定的条件下发生。从多个纬度对进行分析,由整体到局部,整体纵观全局,局部察觉毫发,从而最终定位问题所在。多维分析图示如下:


Android运行数据收集思考
 

       监控的技术思路如下:


Android运行数据收集思考
 

       Android App对云端的请求主要分成两种,一种是原生App里通过网络协议,如常见的Http协议向云端请求,对云端返回响应进行处理,生成包含云端数据的页面展现;还有一种是通过WebView的方式,直接调用云端的Web内容。

       通过Http网络协议请求,通过在请求关键点埋点的方式可以获取到请求信息。实现原理是在编译Java代码是通过instrument技术,找到调用http相关业务代码,在前后埋入点. 这样只能获取到请求整体时间,不能细化DNS解析时间\TCP连接时间\请求发送时间\等待响应时间\接收响应时间.但这样的好处是,可以做到非侵入式,对业务App没有太大的侵入,但是不足也是埋点不全.

        Android上的Java毕竟不是JavaVM上的Java,一些Aop相关技术,如CGLib或者Javaassist均不能直接使用.Android虚拟机运行的字节码是Dalvik字节码.只有在运行时干预Dalvik字节码,才可以做到既非倾入式又埋点全. 思路听起来比较好,但对Android的Dalvik虚拟机不熟悉,需要进一研究.

        还有一种方法可以获取请求各阶段过程,那就是修改HttpClient实现,App使用改版的Httpclient而不是Android自带的HttpClient.但这样话,对业务代码有一定的侵入.当然了,如果完全使用自己的Http Client实现或者对Apache Httpclient比较熟悉,可以通过Hook方式接入的话,也不是问题.

        对WebView请求的URI监控,通过WebClient实现,不过只可以获取到URI的整体时间以及包含子请求的开始执行时间.

        以上对Http请求\Web请求的监控均采用各自的方案,但是,如果对Android或者Linux底层比较熟悉化,直接开发网络检测工具,类似Tcpdump和Wireshark的工具,直接在TCP过滤请求数据,这样既非倾入式,又监控全面,同时还提供了整体的一站式解决,不管是Http请求还是通过Webview的请求,或者通过Intent激活其他Webbrowser的请求,均可以获取到详细数据.

      

       后续工作

       希望能对Android NDK开发以及Linux网络编程有更深入的了解,从而能做到在不侵入App的开发的条件下,能完成对App全流量的监控.

        痴人痴想,努力成真.

相关推荐