监控Android模拟器的HTTP

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

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

  实施过程:

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

  解决方案:

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

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

  这下清楚了,模拟器压根不知道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通讯:

java代码:
  1. private HttpURLConnection createConnection(URL url){

  2. HttpURLConnection conn=null;

  3. try {
  4. conn=(HttpURLConnection)url.openConnection();
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }

  8. return conn;
  9. }
复制代码

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

java代码:
  1. private HttpURLConnection createConnectionWithProxy(URL url, String proxyAddress, int proxyPort) {

  2. HttpURLConnection conn = null;

  3. Proxy proxy=new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress,proxyPort));

  4. try {
  5. conn = (HttpURLConnection) url.openConnection(proxy);
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }

  9. return conn;
  10. }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值