如何监控Android模拟器的HTTP访问情况

原创 2010年08月22日 15:14:00

前几个月,在调试某个应用时,需要监控应用与服务器之间的HTTP通讯。从搜索引擎找到的方案几乎全错。要么是人云亦云,要么是只能满足旧的平台版本,要么根本就是臆测。不得其解之际,用比较复杂的方法解决了。昨天想起来,觉得太过窝囊,于是重整旗鼓,终于在官方文档上找到一点启发。把真正能解决问题的方案写下来,一方面给同样遇到问题的朋友一点帮助,另一方面也是提醒自己,官方文档是解决问题的第一方案,但读文档也有讲究。不读文档、不思考,一遇问题就上网搜,结果大概都会事倍功半。

 

问题场景:在调试某个应用时,需要监控应用与服务器之间的HTTP通讯。

 

解决思路:第一时间想到Fiddler2。Android官方文档提到用TCPDump获得通讯封包或实时监控,好是好,有点高射炮打蚊子的意思。Fiddler2这个工具,界面友好,功能足够使用,可以说是Windows上最好的HTTP监控工具。Fiddler2用起来很方便,运行之后,即在本机建立一个代理(缺省设置为127.0.0.1:8888),其他访问HTTP的应用程序,把代理设为同一地址和端口即可。

 

实施过程:

 

按照文档的指导,在启动模拟器时,使用 -http-proxy参数,设置127.0.0.1:8888为模拟器的上网代理,结果失败。Fiddler2没有抓到通讯应答。

 

上网搜索,许多文章或帖子(包括英文的和中文的)都说要修改模拟器的系统设置数据库,添加一条HTTP_PROXY的记录。尝试后失败。

 

解决方案:

 

再细读文档中有关模拟器的部分,看到Network Address Space一段,忽有所悟。这段文字是这么写的——

 

Each instance of the emulator runs behind a virtual router/firewall service that isolates it from your development machine's network interfaces and settings and from the internet. An emulated device can not see your development machine or other emulator instances on the network. Instead, it sees only that it is connected through Ethernet to a router/firewall.

 

(译文)模拟器在虚拟路由器/防火墙服务后面运行,这套路由器/防火墙服务隔离于开发机的网络界面、设置,也与互联网相隔离。模拟设备不能访问开发机或网络上的其他模拟器。它看到的只是自己通过以太网连接到一个路由器/防火墙。

 

这下清楚了,模拟器压根不知道127.0.0.1是个啥地址,也压根访问不到。在127.0.0.1上设置的代理,自然也抓不到任何通讯应答了。文档接着写道,这个虚拟防火墙/路由器管理从10.0.2.2至10.0.2.24,模拟器的IP地址是10.0.2.15,而模拟器看到的开发机地址则是10.0.2.2。也就是说,从模拟器的立场看,Fiddler2是在10.0.2.2上运行的。

 

于是用emulator命令加上avd -http-proxy 10.0.2.2:8888参数启动模拟器,在模拟器上运行browser,访问任何web地址,可以看到,Fiddler2抓到了HTTP通讯:

 

 

在自己的应用程序中打开创建HttpURLConnection,访问同一网址(下面只是创建连接的代码,访问代码略):

 

private HttpURLConnection createConnection(URL url){
  
  HttpURLConnection conn=null;
  
  try {
   conn=(HttpURLConnection)url.openConnection();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  return conn;
 }

 

这次Fiddler2没能抓到通讯。但应用程序访问网页是成功的。只在启动模拟器时加上-http-proxy参数还不够,应用程序创建连接时,也要指定HTTP代理才行:

 

private HttpURLConnection createConnectionWithProxy(URL url, String proxyAddress, int proxyPort) {
  
  HttpURLConnection conn = null; 
     
   Proxy proxy=new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress,proxyPort));
   
   try {
    conn = (HttpURLConnection) url.openConnection(proxy);
   } catch (IOException e) {
    e.printStackTrace();
   } 
  
  return conn;
 }

 

调用上述方法,传入代理地址10.0.2.2和端口8888,再次运行应用程序,这次可以了(截图和上图大同小异,略)。

 

这个问题其实很简单,关键还是1、对Android的熟悉程度;2、好好阅读文档。但是,什么也代替不了思考。其他问题的解决也是同理。

 

 

如何监控Android模拟器的HTTP访问情况

前几个月,在调试某个应用时,需要监控应用与服务器之间的HTTP通讯。从搜索引擎找到的方案几乎全错。要么是人云亦云,要么是只能满足旧的平台版 本,要么根本就是臆测。不得其解之际,用比较复杂的方法解决了。...
  • asmcvc
  • asmcvc
  • 2013年08月28日 15:08
  • 3713

网站基本访问情况监控,全面了解网站访问情况~

一、监控内容定义SUM服务器监控软件对网站基本访问情况的监控,主要包括以下几个方面:最近一个自然分钟、小时、日内页面访问量(PV)、访问人次(UV)、最大在线人数(OV)、当前在线人数(一分钟内同时在...
  • zhetaosum2010
  • zhetaosum2010
  • 2010年10月20日 15:51
  • 270

监控Android模拟器的HTTP

问题场景:在调试某个应用时,需要监控应用与服务器之间的HTTP通讯.   解决思路:第一时间想到Fiddler2.Android官方文档提到用TCPDump获得通讯封包或实时监控,好是好,有点高...
  • code_farmer
  • code_farmer
  • 2011年10月20日 11:27
  • 1046

监控自己APP的http/https网络请求的地址和请求耗时

关于监控http/https网络请求的思路, 目前想到两种实现思路:第一种实现思路是hook http请求的根接口, 第二种实现思路是aop/动态代理....
  • kslinabc
  • kslinabc
  • 2016年06月28日 14:57
  • 5971

用Android访问本地站点---(localhost,10.0.2.2)要区别

不知道大家是否想试一下用Android模拟器如何访问自己建的Web站点呢? 下面我将讲一下如何实现. Step 1:我用的Tomcat作为本地服务器,在Webapps这个目录里,把我的名为kankon...
  • Android_Tutor
  • Android_Tutor
  • 2009年12月13日 11:01
  • 23352

如何监控SharePoint 2013站点的访问情况?

如果一个公司正在使用SharePoint作为企业数据管理平台的话,作为公司的IT Administrator可能需要了解每个Site Collection的访问情况,某个页面,文档的点击率,修改和...
  • ShelleyLiu0415
  • ShelleyLiu0415
  • 2015年10月15日 16:32
  • 1135

Android模拟器访问本机服务IP地址

10.0.2.2
  • zengmingen
  • zengmingen
  • 2016年12月21日 12:33
  • 616

让安卓模拟器访问本地服务器

我使用的是Android Studio自带的模拟器,只要把访问URL的IP改成“10.0.2.2”即可,例如我的 http://10.0.2.2/ZhiJi/ContentManager.php,就...
  • a735311619
  • a735311619
  • 2017年11月04日 19:36
  • 199

android模拟器访问电脑本机

做一个website,让android模拟器连上,然后访问数据库,android模拟器如果想访问本地(电脑)的话不能用localhost,也不能用127.0.0.1,这些都会让模拟器访问自身,因为它把...
  • zhyl8157121
  • zhyl8157121
  • 2012年08月15日 19:31
  • 3484

如何在Android模拟器上访问电脑本地的Web应用

在你的开发机器上启动一个Tomcat服务,在电脑的浏览器上输入http://localhost:8080/就能够访问到Tomcat的主页面;那么,如果我们想在Android模拟器的浏览器上来访问,可以...
  • ccd0602
  • ccd0602
  • 2016年04月26日 16:12
  • 1417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何监控Android模拟器的HTTP访问情况
举报原因:
原因补充:

(最多只允许输入30个字)