
Fidder 这个拼法我在各种提问帖里见过不下几百次正确写法是 Fiddler一个跑在电脑上的 HTTP/HTTPS 流量观察工具。安卓手机抓包这件事说白了就是把手机发出的网络请求先引到电脑上的 Fiddler让它蹲在中间把每一条请求和响应的原始内容摊开给你看。你能看到 App 调的是哪个接口、带了什么请求头、参数怎么拼的、返回的 JSON 长什么样、图片从哪个域名拉的、有没有重复请求、有没有把本该加密的字段直接明文扔出去。这套东西最适合三类人安卓开发自查自己写的数据层看请求是不是真的按设计发出去了测试同学验证客户端和服务端的接口契约有没有偏差做小程序、H5、混合开发的人联调时定位「到底是前端没发还是后端没返」。至于那种「随便抓个陌生 App 看它在传什么」的玩法属于安全评估范畴你得先确认自己对目标应用有测试授权这条我放在最后单独说。下面按电脑端配置、手机端配置、证书信任、实战用法、排错这条链路讲。流程在 Windows 下的 Fiddler Classic 上反复验证过中间的坑我基本都踩了一遍踩坑的地方我会把原因也讲清楚不然下次换个环境你还是会卡住。1. 先搞清楚手机抓包到底在抓什么1.1 一条请求从手机到服务器中间发生了什么手机上一个 App 点击按钮触发一次网络请求正常的链路是App 里的网络库把参数序列化拼成一个完整的 HTTP 报文交给系统网络栈经过 WiFi 路由器、运营商出口、若干跳路由最后到达服务端。整个过程对开发者是个黑盒你只能看到「请求成功」或「请求失败」。Fiddler 做的事情是在这条链路上合法地插进一个中转节点。手机被配置成「所有 HTTP/HTTPS 流量先发到电脑的某个端口」电脑上的 Fiddler 就负责接收、记录、然后代替手机把请求转发给真正的服务器服务器返回时Fiddler 先拿到响应记一笔再还给手机。对手机来说Fiddler 就是服务器对服务器来说Fiddler 就是客户端。这个位置的好处是它同时看得见两端所以请求头和响应体它都能完整拿到。理解这一点非常关键因为它直接决定了两件事第一手机和电脑必须能互相访问也就是同一个局域网第二HTTPS 要解密就必须让手机信任 Fiddler 自己签发的证书否则你看到的只有一串加密的乱码。1.2 抓包到底能给你带来什么信息我把实际工作中真正用到的信息归成四类你可以对照看看自己需要哪一类。第一类是接口契约。请求的 URL、Method、Header、Query 参数、Body 结构响应的状态码、Header、Body。这是最常用的接口文档和实际实现不一致的时候抓一次就水落石出。第二类是时序和频次。首页一次冷启动到底打了多少个接口有没有同一个接口在 200 毫秒内被重复调用三次下拉刷新的时候是不是把整套首页数据又拉了一遍这些在 Fiddler 的会话列表里按时间排序一眼就能看出来是性能优化最直接的输入。第三类是流量体积。哪张图没做压缩、哪个接口返回了一坨根本用不到的字段、有没有把整个列表的详情数据一次性返回Fiddler 每条会话都带 Body 大小加一下就知道了。第四类是异常路径。正常路径测不出问题的时候抓包能看到超时重试、降级返回、错误码透传这些平时被 UI 藏起来的细节。很多「偶现」的 bug其实在抓包记录里是稳定复现的。1.3 为什么很多人最后选了 Fiddler 而不是别的工具同类工具主要还有 Charles、Whistle、mitmproxy 这几个。Charles 是 Java 写的跨平台做得好界面也漂亮很多人第一台抓包工具就是它Whistle 基于 Node配置灵活适合喜欢用命令行和规则文件的人mitmproxy 是纯命令行的适合写脚本批量处理。Fiddler 的优势在于三点。一是 Windows 上的生态最成熟装完就能用不用折腾运行时环境。二是它的断点改包和 AutoResponder 功能做得非常顺手改一个请求参数、伪造一个返回几秒钟的事联调阶段能省大量时间。三是 FiddlerScript 可以直接写 JScript 脚本控制会话处理逻辑比如自动给所有请求加一个测试 Header或者自动把某个接口的返回替换成本地文件这个能力在批量造场景的时候非常好用。需要提醒一句Fiddler 有 Classic 和 Everywhere 两个产品线。Classic 是老的 Windows 桌面版功能最全脚本能力完整免费Everywhere 是新的跨平台版本界面现代化但免费版有会话数量限制脚本能力也弱一些。做安卓抓包这件事Windows 上我建议直接用 Classic省心。2. 电脑端 Fiddler 的安装与六项关键设置2.1 装完之后的第一个动作允许远程连接刚装好的 Fiddler 默认只监听本机手机是连不上的。打开 Tools → Options → Connections把 Allow remote computers to connect 勾上端口默认是 8888。勾完会弹一个提示说需要重启 Fiddler 才生效点确定然后关掉 Fiddler 重新打开。这一步很多人漏掉然后对着手机排查半天其实只是没重启。端口为什么是 8888因为它不是常见服务端口冲突概率低。但如果你电脑上跑着什么占用 8888 的东西Fiddler 启动时会报端口被占用。这时候直接改成 8899 或者 9000 都行改完记得手机那边也要跟着改。还有一个容易被忽略的点Windows 防火墙。第一次启动 Fiddler 时系统会弹一个「是否允许此应用通过防火墙」的对话框如果你当时手快点了「取消」后面手机就连不上。补救方式是去 Windows 防火墙的允许应用列表里手动把 Fiddler 加进去或者临时把专用网络的防火墙关掉测试一下——测通了再打开别一直关着。2.2 打开 HTTPS 解密这一步会连锁触发三件事Tools → Options → HTTPS勾选 Capture HTTPS CONNECTs 和 Decrypt HTTPS traffic。勾第二个的时候 Fiddler 会问你要不要信任它自己生成的根证书选是系统会弹一个证书安装确认框点确认装到「受信任的根证书颁发机构」。这一步实际上做了三件事你得知道自己在干什么第一Fiddler 在你电脑上生成了一对专属的根证书和私钥。第二这个根证书被装进了 Windows 的信任库所以电脑上的浏览器访问 HTTPS 网站时不会报警告——因为电脑已经认它了。第三从这一刻起Fiddler 可以用这张根证书给任意域名动态签发一张临时证书手机连上来的时候Fiddler 就是拿这张临时证书去跟手机握手的。之所以要讲清楚是因为后面手机端的所有信任问题根源都在这里。手机不认这张根证书握手就会失败你看到的只能是 CONNECT 请求看不到任何明文内容。顺手把下面两个开关也调一下Tools → Options → HTTPS 里有个 Ignore server certificate errors勾上可以避免自签名证书的内网测试环境一直报红Tools → Options → General 里的 Check for updates 建议关掉免得抓包抓到一半弹更新提示打断你。2.3 把根证书导出来格式选对配好 HTTPS 之后Tools → Options → HTTPS → Actions → Export Root Certificate to Desktop桌面上会出现一个 FiddlerRoot.cer 文件。这个 .cer 文件在 Windows 上是 DER 编码的安卓也能直接识别所以大多数情况下直接把它传到手机上装就行。但如果你后面要走系统级证书那条路就需要把它转成 PEM 格式并做哈希重命名这个我在第 3 节详细讲。先把文件留在桌面上别删。注意这个证书文件是你电脑的专属根证书等同于你电脑抓包能力的钥匙。不要随手发到群里或者传到公开网盘用完的测试机建议把证书卸掉。2.4 确认电脑的局域网 IP并且别让它变手机要连过来得知道电脑的 IP。Windows 上打开命令提示符敲ipconfig找无线局域网适配器那一块看 IPv4 地址通常是 192.168.x.x 这种。这里有个坑如果你用的是 DHCP 自动分配路由器可能过一段时间就把这个 IP 换给别人或者你电脑重启之后拿到一个新 IP那手机那边的配置就失效了。解决办法是在路由器里给电脑的 MAC 地址绑定一个固定 IP或者在 Windows 网络设置里手动指定静态 IP。我一般是在路由器上绑这样换电脑重装系统也不用重新配。还有一点值得说如果电脑是用网线连的路由器手机连的是同一个路由器的 WiFi那两者通常是可以互通的。但如果单位网络做了「客户端隔离」同一个 WiFi 下的设备互相不能访问那手机就永远连不上电脑。遇到这种网络直接用电脑开个热点手机连电脑的热点是最省事的绕过办法。2.5 建议保存一份初始配置Fiddler 的配置散落在好几个地方包括端口、HTTPS 开关、过滤器、AutoResponder 规则、脚本。如果你经常在不同项目之间切换建议在刚配好、什么都没加的时候去 File → Save 保存一份配置快照命名成「初始可用配置」。后面不管怎么乱改出了怪问题就 Load 回来能省掉大量「为什么昨天还好好的」的排查时间。这个习惯我是被坑出来的。有一次为了抓一个 WebSocket改了一堆设置第二天抓 HTTP 接口发现全是隧道请求查了两个小时才发现是前一天的某个开关没改回来。从那以后我就固定留一份干净配置。3. 手机端从连上到证书生效的完整链路3.1 让手机流量拐进电脑前提条件再强调一次手机和电脑要在同一个局域网里。然后进手机的 WLAN 设置长按当前连接的网络选「修改网络」或者点进详情找到「高级选项」把 IP 设置从 DHCP 改成静态——注意改静态只是为了让「转发地址」这一栏能编辑IP 地址本身还是填原来 DHCP 分到的那个网关和 DNS 也照抄原来的别瞎改改错了整台手机就上不了网了。然后找到那一栏让流量走指定中转地址的配置项不同安卓版本叫法不太一样本质就是填主机名和端口主机名填你电脑的 IP端口填 Fiddler 里设置的那个默认 8888。保存。保存之后手机一般会闪一下断网重连。这时候去 Fiddler 里看一眼左下角的状态栏如果显示 Capturing并且你手机上刷一下网页Fiddler 的会话列表开始滚动了说明链路通了。如果列表一动不动先检查三件事电脑防火墙、Fiddler 是不是真的重启过、手机和电脑是不是真的在同一个网段。提示有些手机在修改网络之后会自动把 WiFi 重连一次如果没连上手动关掉 WiFi 再开一次。另外有些定制系统在静态 IP 模式下会同时要求填 DNS填路由器的地址就行或者填公共 DNS 也可以。3.2 安装根证书的正确姿势链路通了之后手机随便打开一个浏览器访问电脑的 IP 加 Fiddler 端口比如http://192.168.1.100:8888会打开一个 Fiddler 自带的页面上面有一个下载证书的链接点它就能把根证书下到手机里。或者你用微信、QQ 把桌面上的 FiddlerRoot.cer 传到手机上也行效果一样。然后去设置里装。安卓不同版本的入口差别挺大我列一下常见的路径安卓版本安装入口大致路径安卓 7 到 9设置 → 安全 → 从存储设备安装安卓 10 到 11设置 → 安全 → 加密与凭据 → 安装证书 → CA 证书安卓 12 及以上设置 → 安全 → 更多安全设置 → 加密与凭据 → 安装证书 → CA 证书安装过程中系统会再三确认「此证书可能被用于监控网络流量」这是正常的提示因为这类证书确实有这个能力。装完之后去「信任的凭据」列表里找用户那一栏里应该能看到一个以你的电脑名或者 Fiddler 命名的条目。3.3 安卓 7 之后的那道坎为什么装了证书还是红锁这是安卓抓包最经典的一个坑也是绝大多数人卡住的地方。从安卓 7.0API 24开始系统改了一条规则App 默认只信任系统内置的根证书不信任用户自己安装的证书。也就是说你在设置里装的那个证书对浏览器有效浏览器通常不带这个限制但对绝大多数 App 无效。App 发起 HTTPS 请求时它的信任库里没有你那张证书握手就会失败表现为请求直接报错、超时、或者 App 闪退。这个设计本身是合理的它防止有人在你手机上装一张证书就把你所有 App 的流量看光。但对开发调试来说就多了一道手续。解决办法分两条路取决于你要抓的是别人写的 App 还是自己开发的 App。3.4 自己开发的 App用配置文件放行如果你要抓的是自己在做的项目最干净的做法是在工程里加一个网络安全配置文件显式声明信任用户证书。在res/xml/目录下新建一个network_security_config.xml?xml version1.0 encodingutf-8? network-security-config base-config cleartextTrafficPermittedtrue trust-anchors certificates srcsystem / certificates srcuser / /trust-anchors /base-config /network-security-config然后在 AndroidManifest.xml 的 application 标签上引用它application android:networkSecurityConfigxml/network_security_config ... 这里有几个细节要说清楚。cleartextTrafficPermittedtrue是为了让明文 HTTP 请求也能发出去因为从安卓 9 开始明文流量默认是禁止的你抓一个 HTTP 接口会发现直接抛异常。这个开关放在正式包里是有安全风险的所以更好的做法是用debug-overrides只在 debug 构建里放开network-security-config debug-overrides trust-anchors certificates srcuser / /trust-anchors /debug-overrides base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem / /trust-anchors /base-config /network-security-config这样 release 包依然只信任系统证书明文也不放开只有 debug 包才允许你的抓包证书介入安全性上是站得住的。我在团队里推这套配置的时候很多人第一反应是「加个开关好麻烦」但一旦发生过一次正式包带着调试开关上架的事故就没人嫌麻烦了。3.5 系统级证书哈希命名与落盘如果你抓的是别人的 App又确实有授权那就得把证书装到系统证书目录里。这条路需要 root 权限步骤如下。第一步把 DER 格式的证书转成 PEMopenssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem第二步算出证书的 subject hashopenssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem | head -1会输出一串八位十六进制比如a1b2c3d4。然后把文件名改成a1b2c3d4.0注意后面的.0是必须的系统按这个格式扫描。第三步推到系统证书目录adb root adb remount adb push a1b2c3d4.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/a1b2c3d4.0 adb reboot重启之后去「信任的凭据」的系统那一栏找能看到你的证书这时候 App 就会认它了。有几个现实问题得提醒。安卓 10 之后系统分区默认是只读的adb remount会失败需要通过 Magisk 之类的方案挂一个模块进去把证书文件放进模块的 system 目录重启后由它来覆盖。安卓新版本对分区校验也越来越严改完可能开不了机所以动手之前一定先备份重要数据别拿主力机折腾。另外有些 App 除了校验证书链还会做证书绑定pinning把服务端证书的公钥或者哈希硬编码在包里你就算把证书装进系统目录它一样会拒绝连接。这种情况下只能针对自己可控的 App 做处理别人的 App 就别硬碰了。4. 抓包实战从一堆会话到一条有用的接口4.1 先做减法Filters 是你最该先学会的功能手机一连上Fiddler 的会话列表会像瀑布一样往下滚各种后台心跳、埋点上报、图片加载、广告请求混在一起你想找的那个接口瞬间就被冲走了。这时候 Filters 就是救命的东西。切到右侧的 Filters 面板勾上 Use Filters。常用的几招Hosts 那一栏选 Show only if URL contains填你的业务域名比如api.example.com。这样列表里只剩你要的域名。如果只想排除干扰用 Hide if URL contains把埋点域名、统计域名塞进去。请求类型那一栏可以只勾选 JSON 和 XML把图片、CSS、JS 全过滤掉。状态码可以只看 4xx 和 5xx快速定位异常。我个人的习惯是先不加过滤让页面跑一遍然后从会话列表里挑出真正的业务域名再加进过滤器重新跑一次。这样不会因为域名猜错而漏掉关键接口——尤其是现在很多 App 会把接口分散在好几个域名下凭猜测很容易只抓到一个。还有一个非常实用的小功能会话列表上方的 Find 框可以直接搜 URL 关键词比在几千条记录里用眼睛翻快得多。4.2 断点改包让服务端返回你想要的东西联调阶段最常干的事是「服务端那个字段还没好我先自己造一个」。Fiddler 提供了两种做法。第一种是断点。在命令行输入框左下角黑色的那个里敲bpu api.example.com/v1/order这表示对匹配这个路径的请求下断点。手机再发这个请求时Fiddler 会把它拦住会话列表里那条记录会有一个红色的箭头图标。你双击它在右侧 Inspectors 面板的 Raw 或者 WebForms 里改参数改完点 Run to Completion 放行。改响应的话要先让请求发出去再在返回时断住。可以用bpafter api.example.com/v1/order请求正常发出响应回来时被拦下这时候你改 Body 里的 JSON改完放行手机收到的就是你伪造的数据了。第二种是 Composer。切到右侧 Composer 面板把一条完整请求的 Raw 内容粘进去改改 URL 和 Body点 ExecuteFiddler 就替你发一条请求。这个在测试接口边界值的时候特别好用不用在 App 里点半天。取消断点用bpu或者bpafter后面不跟参数直接回车或者敲bpu清空。这里有个新手常犯的错误下了断点忘了取消然后手机一直卡在转圈以为网络挂了。养成习惯调试完随手清一下。4.3 AutoResponder把线上资源换成本地文件AutoResponder 是我用得最多的功能之一位置在右侧面板。勾上 Enable rules 和 Unmatched requests passthrough然后加规则。典型场景是改前端资源。比如你在调试一个 H5 页面想看看改完的 JS 有没有生效又不想重新部署就在 AutoResponder 里加一条规则匹配http://cdn.example.com/app.js动作选 Find a file指向你本地的 app.js。手机刷新页面Fiddler 拦截这个请求直接从本地读文件返回你改一次本地文件手机刷新就能看到效果。另一个场景是模拟异常。把某个接口的返回替换成本地的一个 JSON 文件内容是一个 500 错误码或者一个空列表用来验证客户端的异常处理和空态展示。比起让后端配合改代码这个方式快得多而且是即时生效的。规则支持简单的通配符*匹配任意字符可以写regex:前缀用正则。规则是从上往下匹配的第一条命中就返回所以把具体的规则放前面宽泛的放后面。4.4 抓不到的那些WebSocket、gRPC、HTTP/2Fiddler 对普通 HTTP 和 HTTPS 支持很好但有几类协议它处理起来是有局限的这点必须提前知道不然你会在那儿死磕。WebSocket抓包能看到握手请求和连接建立但具体的帧内容查看起来比较费劲Fiddler 的展示能力有限。如果你的目标就是看 WebSocket 的消息Whistle 在这方面体验更好或者用浏览器开发者工具的 WS 面板。gRPC走的是 HTTP/2 加上 Protobuf 二进制编码Fiddler 即使抓到了也是二进制流看不到可读内容。要看 gRPC 得用专门的工具比如 grpcurl 配合反射或者 Postman 的 gRPC 支持。HTTP/2本身 Fiddler Classic 是支持的但如果你发现抓到的都是看不到内容的会话可以在 Tools → Options → HTTPS 里把 HTTP/2 相关的开关关掉强制降级成 HTTP/1.1 再看。这是个取巧的办法但排查阶段很有效。证书绑定pinning严格说不算协议问题但它表现为「抓不到」。特征很明确某个 App 的请求一发出就直接连接失败而同一个手机上的浏览器访问同一个域名是正常的。这种情况就是 App 在校验证书你装什么证书都没用。对于自己开发的 App把 pinning 逻辑在 debug 包里关掉就行别人的 App请止步。5. 常见问题速查与排查思路抓包出问题八九成集中在下面这几类。我把它整理成表遇到问题先对照能省掉大量瞎试的时间。现象大概率原因排查动作Fiddler 会话列表一动不动手机没连上电脑检查同一网段、防火墙、Fiddler 是否重启过、端口是否被占用会话列表有记录但全是 CONNECTHTTPS 解密没开或证书没装确认 Decrypt HTTPS traffic 已勾选手机端证书已安装且生效装了证书浏览器正常App 报错安卓 7 以上不信任用户证书自己项目加 network_security_config或用系统级证书方案第一天能抓第二天不行了电脑 IP 变了给电脑绑定固定 IP或重新确认手机端的地址配置手机突然完全上不了网中转配置残留但电脑关掉了把手机 WLAN 的高级设置改回 DHCP或删掉那条配置重连部分请求能抓部分抓不到证书绑定或协议是 WebSocket/gRPC看该请求是不是直接连接失败判断是否 pinning抓到的响应是乱码内容被压缩或编码不是 UTF-8Inspectors 里看 Response Body 的 Transformer切换解压方式会话列表刷得太快找不到目标干扰流量太多用 Filters 按域名过滤或用 Find 搜索除了表里这些再补几个我实际踩过的坑。端口冲突导致 Fiddler 启动失败但你没注意。Fiddler 启动时如果端口被占它不会弹一个很醒目的错误只是在底部状态栏显示一行小字。我遇到过一次是另一个抓包工具还开着占着 8888结果手机怎么都连不上查了半小时。养成习惯启动后先看一眼状态栏那行提示里显示的监听端口是不是你预期的。手机息屏之后连接断了。有些安卓系统为了省电会在息屏时切断 WiFi 或者限制后台网络抓包抓一半就断。抓长流程的时候把屏幕常亮打开或者调长息屏时间。Fiddler 长时间运行后变卡。会话列表累积到几万条之后界面会明显变迟钝。定期按 CtrlX 清空会话列表或者用 Filters 从源头减少记录量。同一台电脑抓两个手机。Fiddler 本身能同时接多个客户端但会话列表会混在一起。这时候可以在 Filters 里按来源 IP 区分或者在手机的转发配置上用不同端口配不同的 Fiddler 实例——不过一般用不着分时抓就行。提示抓完包记得把手机上的转发配置撤掉改回 DHCP 自动获取。很多「手机莫名上不了网」的问题根源就是当时配的静态地址和转发地址没清干净离开那个网络环境之后所有请求都发不出去。6. 我踩过的坑和一些边界意识先说几个纯经验层面的东西。不要让 Fiddler 一直开着抓包。它会把每一条会话都记在内存里包括图片和视频的响应体。开一整天下来内存占用非常可观电脑会变慢。抓完就关掉 Capture左下角那个 Capturing 按钮或者清空会话列表。改包测试的时候先把原始请求导出留底。Composer 里改参数改多了很容易忘了原始长什么样。右键一条会话 → Save → Session → as Text存一份原始报文出问题可以对比。团队协作时统一端口和证书。如果一个小组都要抓包与其每个人各自配一套不如约定一个统一的端口把电脑 IP 固定下来把配置步骤写成一份一次性的文档。我们当时的做法是写了一个一页的 checklist新人半小时就能自己搞定省了老成员反复答疑的时间。证书这块则各用各的不要共享同一个根证书文件因为那等于共享了对彼此流量的解密能力。别忘了用系统自带的开发者工具做交叉验证。安卓上如果 App 本身是基于 WebView 的浏览器开发者工具的远程调试能力比抓包更直接如果是原生 App抓包才有优势。工具是手段不是目的别为了用工具而用工具。最后说一下边界这件事这也是我越来越在意的。抓包这个技术的本质是让通信双方之间多出一个能看见明文的节点。它能帮你调试自己的应用也能被用来观察别人的应用。这两件事在技术动作上几乎没有区别区别只在于你有没有得到授权。我的做法很简单只抓自己有源码的项目或者有明确书面授权、且在约定范围内的目标。测试机上装的证书任务结束就卸掉导出的会话文件里可能包含账号、Token、手机号这类信息用完及时删不要留在共享盘里。至于那些号称「一键抓遍全网 App」的工具和教程我建议你离远一点。技术能力是一回事用在哪里是另一回事。把抓包用在优化自己产品上它是效率工具用在不该用的地方麻烦迟早找上门。另外安卓版本一直在往前走新的系统对证书信任和分区权限的限制只会更严。今天能用的系统目录方案下个大版本可能就失效了。所以真正值得你投入时间去掌握的其实是那套通用的调试思路——怎么把链路断开成一段一段、怎么用最小成本验证一个假设、怎么在看不清楚的地方加上一个可观测的点。工具会换思路不会。