β

如何调试 Android 上 HTTP(S) 流量

Android Cool Posts 385 阅读

前面的话

在Android开发中我们常常会和API 打交道,可能你不想,但是这是避不开的。大部分情况下,调试发送网络请求和接收响应的过程都是十分痛苦的。

有多少次我们经过调试发现API的调用失败仅仅是因为我们的编码错了或者丢失了一个HTTP头部参数?在调试的过程中,我们发现出现错误的原因千奇百怪。 总之我们要看到最终的请求是什么样子的不是一件容易的事情,响应也是如此

如果碰到困难,请使用代理

解决这样的问题有各种各样的方法和门道,但是我今天要分享的是在我看来最快,最容易也是最可行的方法。

由于调试HTTP请求和响应是相当繁琐的(调试HTTPS更加繁琐),因此在这种前提下你能使用的最好工具就是 代理 。当然,你肯定知道什么是代理,所以我就不啰嗦它的定义了。

现有的代理工具中它们的用法,特性以及操作系统的兼容性都各不相同,如何选择一款合适的代理呢?要我说,简单点,就用 mitmproxy

mitmproxy

我已经无法用语言来形容mitmproxy的方便和强大了。用 mitmproxy 官网上的介绍一句话,就是“ an interactive, SSL-capable man-in-the-middle proxy for HTTP with a console interface ”。没错,你可以通过控制台来操作它;没错,它还支持HTTPS;没错,它允许“对流量进行拦截,检测,修改和回放”;没错,它还是跨平台的,因为它是用Python写的。对了,我说了它是 完全免费 的这件事了吗?

使用它也是相当容易的。一旦你安装了它,便可通过在控制台输入以下命令启动它:

$ mitmproxy [-b IP_ADDR] [-p PORT]

代理已经在运行,你可以开始拦截网络流量了。接下来你就需要配置Android手机,将所有的流量都重定向到之前命令里设置的代理服务器地址上去(IP_ADDR + PORT)。

代理设置App: “Proxy Settings”

现在我们需要在Android手机上进行代理配置。具体步骤如下:

  1. 进入Android的Wi-Fi设置
  2. 长按当前连接的网络
  3. 选择“修改网络”选项
  4. 勾选“显示高级选项”
  5. 启用代理服务器并将代理设置为“手动”
  6. 输入之前设置好的的IP地址和端口。

如果要禁用代理同理。现在Android端的设置就大功告成了。

是不是觉得上面的步骤有点头疼?不急!幸亏还有 Proxy Settings 这个App。用了 Proxy Settings ,上面繁琐的步骤就变得异常简单了。有了这个轻量级的App,你只需 轻轻一点 ,便可轻松地开启或禁用网络连接里的代理设置。

Proxy Settings 的使用截图
Proxy Settings 的使用截图

通过 Proxy Settings ,你可以创建多个代理配置。当你想要启用其中一个,只需点击当前连接的网络,启用代理,并选择你需要的配置。如果你要禁用代理,点击连接,并禁用它。

就这么简单,对了,它还不需要root权限哦?

那如何调试 HTTPS?

正如前面所提到的,mitmproxy还支持HTTPS拦截。这个特性让你在保持API endpoint 不变的情况下调试生产环境里的API变得异常方便。然而由于HTTPS的 工作方式 ,我们需要 安装一个自定义的SSL证书 ,让mitmproxy对所拦截的流量进行解密。

听起来HTTPS拦截的步骤好像有点麻烦,其实很简单。你只需按照mitmproxy官网的这篇 设置指南 便可轻易地完成设置。记得在启动mitmproxy的时候需要额外添加一个参数,如下命令所示:

$ mitmproxy -a IP_ADDR -p PORT —-no-upstream-cert

不过此处还有个小问题。 Android是以一种加密的形式来保存SSL证书的,而这种加密的形式即用户设置的手机解锁信息。也就是说,你在Android上安装任何SSL证书之前,系统都会提示你设置解锁手机的方式,比如输入PIN码,密码或者是某种图案。

调试3G/4G

3G/4G这种情况下设置代理更难了。系统设置中没有为3G/4G连接提供代理设置接口。但是!你可以通过你的手机“移动热点”功能来实现在3G/4G这种情况下设置代理。你要准备的就是:

  1. 一台可以连接3G/4G网络的Android手机
  2. 一台开启了“开发者模式”的手机(另一台了)
  3. 你的笔记本电脑

接下来的步骤就简单啦:

  1. 在第一台手机上激活“移动热点”功能
  2. 将你的笔记本电脑和第二台手机(“开启了开发者模式”)连上移动热点
  3. 在笔记本电脑上启动 mitmproxy,并将IP地址设为hotspot所对应的(通常是192.168.43.xxx 之类的)
  4. 在第二台手机上使用Proxy Settings设置代理

OK,在3G/4G这种情况下设置代理就是这样子的。

总结

到目前为止,我还试过其他两种代理工具, Charles Fiddler 。 但是 mitmproxy完爆他们两个。 Charles 可能是在功能,灵活性以及操作系统支持这几个方面和mitmproxy最接近的,但是它一不免费,二不开源。 对于 Fiddler , 它只能在Windows平台上使用。

mitmproxy + Proxy Settings 的结合让我省了不少心,我希望它们也能为你所用。

如果你有更好的解决方法,记得告诉我。 ☺

本文翻译自音乐App musiXmatch 公司高级Android工程 Sebastiano Gottardo 。原文地址: https://medium.com/@rotxed/how-to-debug-http-s-traffic-on-android-7fbe5d2a34

UPDATE:有同学反应对这个工具到底怎么使用不是很清楚,于是我打算在本文基础上再增加一些实践相关的文字,后来发现篇幅过于臃肿,干脆新写了 一篇关于mitmproxy实践的文章 ,希望能给大家一些启发。

作者:Android Cool Posts
A Android fan‘s tech blog.
原文地址:如何调试 Android 上 HTTP(S) 流量, 感谢原作者分享。

发表评论