前言:为什么需要这套方案?
在 Android 开发和调试过程中,抓包是不可或缺的一环。传统的做法是设置 Wi‑Fi 代理,将流量指向 PC 上的 Charles。这种方法简单快捷,但有一个致命弱点:它属于应用层代理。任何有意识的 App 都可以通过代码(如 Proxy.NO_PROXY)轻松绕过系统代理,导致抓包失败。
为了解决这个问题,我们需要一种更底层的抓包方式——基于 VPN 的传输层代理。
本指南将详细介绍如何利用一款支持本地 VPN 隧道的代理 App(Android 版),在手机端建立一个本地 VPN,将设备上所有的网络流量(包括那些试图绕过系统代理的 App)强制转发到电脑上的 Charles,从而实现全面、无死角的抓包。
准备工作
- 一台电脑:安装并正常运行 Charles。
- 一台 Android 设备:手机或模拟器(如 MuMu),已安装“代理 App(Android 版)”。
- 网络环境:确保电脑和 Android 设备连接在同一个局域网(同一个 Wi‑Fi)下。
流程概览
- 正确配置 Charles:确保 Charles 能同时处理 HTTP 和多端口的 HTTPS 流量。
- 获取电脑 IP:找到 Charles 所在电脑的局域网 IP 地址。
- 编写代理 App 配置文件:创建一个 YAML 文件,指示将所有流量转发到 Charles。
- 导入并启动代理 App:在 Android 设备上运行该 App 并激活 VPN。
- 安装 Charles 证书:在 Android 设备上安装证书以解密 HTTPS 流量。
第一步:Charles 的正确配置(至关重要)
错误的 Charles 配置是排查过程中最常见的问题。请务必确认以下两项设置。
1. 代理设置(Proxy Settings)
此设置确保 Charles 的 8888 端口能正确接收 HTTP 和 HTTPS 流量。
- 进入菜单栏
Proxy -> Proxy Settings...。 - 在
Proxies标签页下,确认:- HTTP Proxy 端口为
8888。 - 取消勾选
Enable transparent HTTP proxying。
- HTTP Proxy 端口为
原因:如果勾选此项,Charles 会错误地将所有到达 8888 端口的流量都当作 HTTPS 来处理,导致正常的 HTTP 请求失败并显示
SSL: Unsupported or unrecognized SSL message。
2. SSL 代理设置(SSL Proxying Settings)
此设置告诉 Charles 需要对哪些地址和端口的流量进行 SSL 解密。
- 进入菜单栏
Proxy -> SSL Proxying Settings...。 - 确保
Enable SSL Proxying已勾选。 - 在
Include列表中,不要使用*:*,这会引起冲突。推荐使用以下“白名单”组合,覆盖绝大多数 HTTPS 端口:*:443(标准 HTTPS 端口)*:8443(常见的后台服务 HTTPS 端口)- 如有需要,可继续添加其他非标准端口,如
*:8080,*:9443等。
原因:使用
*:*会让 Charles 尝试解密发往自身8888端口的纯 HTTP 流量,导致与第一点同样的问题。只包含明确的 HTTPS 端口可以完美规避此冲突。
第二步:获取电脑 IP 地址
Android 设备需要知道将流量转发到哪里。
- Windows:打开命令提示符(CMD),输入
ipconfig,查找“无线局域网适配器 WLAN”下的“IPv4 地址”。 - macOS:打开“终端”,输入
ifconfig | grep "inet ",查找en0或en1网卡下的 IP 地址。
记下这个 IP,例如 192.168.0.0。
第三步:编写配置文件
这是整个流程的核心。创建一个名为 charles-proxy.yaml 的文本文件,并将以下内容粘贴进去。
# 示例配置文件(将所有流量转发到电脑的 Charles 进行抓包)
# 混合代理端口(HTTP 和 SOCKS5),保持默认即可
mixed-port: 7890
allow-lan: true
mode: rule
log-level: info
# DNS 设置,防止 DNS 污染
dns:
enable: true
nameserver:
- 223.5.5.5
- 119.29.29.29
# 1. 定义你的上游代理(电脑上的 Charles)
proxies:
- name: "Charles-PC"
type: http
# !! 将这里的 IP 地址替换为你自己的电脑 IP !!
server: 192.168.0.0
port: 8888
# 2. 定义代理组
proxy-groups:
- name: "抓包代理"
type: select
proxies:
- "Charles-PC"
# 3. 定义规则(最关键的部分)
rules:
# 匹配所有流量(MATCH),并将其发送到“抓包代理”组
- MATCH,抓包代理
请务必将 server 字段的值修改为你在第二步中获取的电脑 IP 地址。
第四步:在 Android 设备上导入并启动
导入配置
由于模拟器或部分 Android 系统存在文件读写权限问题,直接“从文件导入”可能会失败。推荐使用 URL 导入。
- 上传配置:将上述
charles-proxy.yaml的内容完整复制,粘贴到 gist.github.com 并创建一个公开的 Gist。 - 获取 Raw 链接:在 Gist 页面,右键点击
Raw按钮,选择“复制链接地址”。 - 在代理 App 中导入:
- 打开应用,进入“配置”或“Profiles”页面。
- 点击“+”->“从 URL 导入”。
- 粘贴你复制的 Raw 链接,并为配置命名,然后保存。
启动 VPN
- 在配置列表中,选中你刚刚导入的配置,使其生效。
- 返回应用首页,开启开关;在弹出的 VPN 连接请求中选择“允许”。
- 开关变为“运行中”,且系统状态栏出现钥匙图标,表示应用已成功接管设备网络。
此时,Charles 应该已经能看到来自 Android 设备的流量了。
第五步:安装 Charles 证书(解密 HTTPS)
最后一步,让 Charles 能够解密 HTTPS 流量。
- 确保代理 App 的 VPN 正在运行。
- 在 Android 设备上打开任意浏览器。
- 访问地址:
chls.pro/ssl - 浏览器会提示下载一个证书文件(
.pem格式)。 - 下载后,根据系统提示安装该证书。通常需要进入“设置”->“安全”->“加密与凭据”->“从存储设备安装”,选择“CA 证书”进行安装。系统可能会要求你为证书命名并设置锁屏密码。
安装成功后,回到 Charles,你就可以看到清晰、解密后的 HTTPS 请求了。
至此,你已搭建起一套功能完备且强大的 Android 抓包环境。祝你调试愉快!