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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监控Android模拟器的HTTP访问情况?相关的知识,希望对你有一定的参考价值。

问题场景:在调试某个应用时,需要监控应用与服务器之间的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,再次运行应用程序,这次可以了(截图和上图大同小异,略)。
参考技术A 使用SocketSniff 网络监控软件完美解决,没有那么蛋疼的配置!

如何从 android http get 访问本地端口 8080 url

【中文标题】如何从 android http get 访问本地端口 8080 url【英文标题】:How do you access a local port 8080 url from an android http get 【发布时间】:2011-10-19 14:08:00 【问题描述】:

我有一个位于本地 tomcat 实例上的 RESTful Web 服务。

我正在尝试通过我的应用程序中的 get 访问 url,但出现错误:主机未解析

我尝试从我的 android 模拟器浏览器访问此 url 以确认那里的连接,但我也无法访问它。屏幕上出现警告:“下载 125562.bin 需要 sd 卡”

我没有在我的 url 中使用 localhost,但看起来像:

http://192.168.1.2:8080/service/0/12345

直接返回json

有谁知道为什么我不能在 android 模拟器中访问它?我可以从我的计算机浏览器和 iPhone 上成功地点击这个相同的地址,它会带回 json。

android 处理其他端口是否不同于标准端口 80?是这个url没有扩展的问题吗?

【问题讨论】:

【参考方案1】:

Android-Emulator 有一个虚拟路由器,它将 Emulators 网络与主机网络断开。

但是,此路由器也是网络的一部分,使您能够使用 IP 10.0.2.2 访问在本地计算机上运行的服务器。

所以你会使用:

http://10.0.2.2:8080/service/0/12345

【讨论】:

【参考方案2】:

您需要使用 10.0.2.2 来模拟本地计算机的“localhost”。

见Emulator Networking

【讨论】:

以上是关于如何监控Android模拟器的HTTP访问情况?的主要内容,如果未能解决你的问题,请参考以下文章

Android模拟器不会关闭

Android模拟器:如何监控网络流量?

如何从 android http get 访问本地端口 8080 url

在没有互联网访问的情况下运行 Android 模拟器 [关闭]

如何监控我的应用在 android 中发出的 HTTP(获取、发布等)请求

如何通过 HttpRequest 从连接的 Android 设备访问本地 tomcat