如何调试 Android 上 HTTP(S) 流量
http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/
如何调试 Android 上 HTTP(S) 流量
前面的话
在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写的。对了,我说了它是完全免费的这件事了吗?
使用它也是相当容易的。一旦你安装了它,便可通过在控制台输入以下命令启动它:
1
|
$ mitmproxy [-b IP_ADDR] [-p PORT]
|
代理已经在运行,你可以开始拦截网络流量了。接下来你就需要配置Android手机,将所有的流量都重定向到之前命令里设置的代理服务器地址上去(IP_ADDR + PORT)。
代理设置App: “Proxy Settings”
现在我们需要在Android手机上进行代理配置。具体步骤如下:
- 进入Android的Wi-Fi设置
- 长按当前连接的网络
- 选择“修改网络”选项
- 勾选“显示高级选项”
- 启用代理服务器并将代理设置为“手动”
- 输入之前设置好的的IP地址和端口。
如果要禁用代理同理。现在Android端的设置就大功告成了。
是不是觉得上面的步骤有点头疼?不急!幸亏还有Proxy Settings 这个App。用了Proxy Settings,上面繁琐的步骤就变得异常简单了。有了这个轻量级的App,你只需轻轻一点,便可轻松地开启或禁用网络连接里的代理设置。

通过Proxy Settings ,你可以创建多个代理配置。当你想要启用其中一个,只需点击当前连接的网络,启用代理,并选择你需要的配置。如果你要禁用代理,点击连接,并禁用它。
就这么简单,对了,它还不需要root权限哦?
那如何调试 HTTPS?
正如前面所提到的,mitmproxy还支持HTTPS拦截。这个特性让你在保持API endpoint 不变的情况下调试生产环境里的API变得异常方便。然而由于HTTPS的工作方式,我们需要安装一个自定义的SSL证书,让mitmproxy对所拦截的流量进行解密。
听起来HTTPS拦截的步骤好像有点麻烦,其实很简单。你只需按照mitmproxy官网的这篇设置指南便可轻易地完成设置。记得在启动mitmproxy的时候需要额外添加一个参数,如下命令所示:
1
|
$ mitmproxy -a IP_ADDR -p PORT —-no-upstream-cert
|
不过此处还有个小问题。Android是以一种加密的形式来保存SSL证书的,而这种加密的形式即用户设置的手机解锁信息。也就是说,你在Android上安装任何SSL证书之前,系统都会提示你设置解锁手机的方式,比如输入PIN码,密码或者是某种图案。
调试3G/4G
3G/4G这种情况下设置代理更难了。系统设置中没有为3G/4G连接提供代理设置接口。但是!你可以通过你的手机“移动热点”功能来实现在3G/4G这种情况下设置代理。你要准备的就是:
- 一台可以连接3G/4G网络的Android手机
- 一台开启了“开发者模式”的手机(另一台了)
- 你的笔记本电脑
接下来的步骤就简单啦:
- 在第一台手机上激活“移动热点”功能
- 将你的笔记本电脑和第二台手机(“开启了开发者模式”)连上移动热点
- 在笔记本电脑上启动 mitmproxy,并将IP地址设为hotspot所对应的(通常是192.168.43.xxx 之类的)
- 在第二台手机上使用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 上 HTTP(S) 流量的更多相关文章
- Chrome远程调试Android上Chrome的页面
下载最新的google chrome canary 手机chrome开启usb网页调试,如图所示: 在终端运行 ? SHELL adb forward tcp:9222 localabstract:c ...
- gdb 远程调试android进程 -转
什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...
- gdb 远程调试android进程
原文:http://blog.csdn.net/xinfuqizao/article/details/7955346?utm_source=tuicool 什么是gdb 它是gnu组织开发的一个强大的 ...
- 移动端Chrome Inspect调试 (Android通过Chrome Inspect调试WebView的H5)(ios手机safari,chrome调试 windows)(如果inspect的时候,是空白)
ios +chrome调试 引用https://segmentfault.com/a/1190000015428430 iTunes ios-webkit-debug-proxy-1.8-win64- ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- 如何通过Chrome远程调试android设备上的Web网站
网上的帖子很多,但很多都是老版本的,试过了,根本不管用,花了一天时间,终于在本机试验通过了,特记录下来,以备用.有需要的朋友也可以参考.先上一张图,看看PC端chrome上调试的效果: 左边是手机的模 ...
- Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences
Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...
- 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- Eclipse中调试Android技巧
Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...
随机推荐
- 在android 5.0以上,如何判断当前应用是在前台还是后台
今天在做项目时遇到这个问题,本来很简单的,但是在Android 5.1 的系统上运行却出错了,在网上查找答案后发现原来是在android 5.0 之后getRunningTask()方法被废弃,失效了 ...
- 【论文阅读】HydraPlus-Net: Attentive Deep Features for Pedestrian Analysis
转载请注明出处:https://www.cnblogs.com/White-xzx/ 原文地址:https://arxiv.org/abs/1709.09930 Github: https://git ...
- 《剑指offer》二叉树镜像
剑指offer简单题,但是能一下写对也需要小心考虑细节. 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / / 5 7 9 11 ...
- .NetCore 中扩展ExceptionLess 实现链式方法添加操作日志
在使用ExceptionLess添加日志的时候,发现还是有一些写法上的个人觉得不爽的地方,比如添加Info日志 ExceptionlessClient.Default.CreateLog(source ...
- Cname与A记录(Address)区别
Cname与A记录(Address)区别A记录是解析域名到IP,Cname是解析域名到另外一个域名. 一台服务器可以布置多个网站,也可以有多个域名,如如域名A----->A记录-----> ...
- 【LOJ】#2509. 「AHOI / HNOI2018」排列
题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...
- jQuery中click(),bind(),live()的区别(转)
原文:http://www.jquery001.com/click%28%29-bind%28%29-live%28%29-delegate%28%29.html click(),bind(),liv ...
- IE8及以下浏览器伪数组slice方法兼容处理
前几天同事说数组的slice方法在IE8下有兼容问题,我查阅了MDN,文档里面有提到IE8及以下浏览器中,DOM对象组成的伪数组通过call调用slice方法没有遵循标准行为 我做了个demo在IE8 ...
- C# 动态加载组件后怎么在开发环境中调试
动态加载组件 那就是简单的Assembly.Load动态加载dll而以.这网上资料也有不少.基本的思路基本上就是在本地上一个指定目录如[plugs]存在着一堆dll文件.主程序在初始运行时一般会把指定 ...
- scheme的split实现
再chez中并未找到一个split函数,基于尾递归,自己实现了了一个用于字符串拆分的split. (define split (lambda (str sep) (define loop (lambd ...