1. 环境准备与工具安装
第一次用Charles抓MuMu模拟器的HTTPS包时,我踩了个大坑——Android 7.0之后系统不再信任用户安装的证书。折腾了整整两天才发现问题根源,后来摸索出这套完整方案。先说说需要准备的家伙:
- Charles 4.6+(官网下载或汉化版都行)
- MuMu模拟器12(实测6.0版本会有ADB连接问题)
- OpenSSL 3.0(证书转换必备)
- ADB工具包(建议用MuMu自带的)
安装时有个细节要注意:Charles首次启动会提示防火墙权限,这时候一定要勾选"专用网络和公用网络",否则后续抓包会漏数据。我遇到过好几次因为漏选导致只能抓到HTTP请求的情况。
2. 证书配置全流程
2.1 生成系统级证书
普通用户证书在Android 7.0+上就是个摆设,必须把证书塞进系统信任区。具体操作:
- 在Charles导出证书:Help → SSL Proxying → Save Charles Root Certificate
- 用OpenSSL转换格式:
openssl x509 -inform PEM -subject_hash_old -in charles.pem记住输出的哈希值(比如a2414e42),把证书重命名为a2414e42.0
踩坑提醒:Windows下用cmd执行时,如果报"openssl不是内部命令",需要把OpenSSL的bin目录加入系统PATH。我建议直接重启电脑生效。
2.2 推送证书到系统目录
这里需要ADB操作:
adb push a2414e42.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/a2414e42.0如果遇到Read-only file system错误,先执行:
adb remount这个步骤我失败过三次,后来发现是MuMu的root权限没开彻底。需要在模拟器设置中心→其他设置里,把"开启手机Root权限"和"可写系统盘"都勾上。
3. 网络代理配置技巧
3.1 Charles端设置
代理配置有个隐藏技巧:不要用默认8888端口!很多国产软件会占用这个端口导致冲突。我习惯用59999这种冷门端口,具体设置路径: Proxy → Proxy Settings → HTTP Proxy
SSL代理这里要特别注意:
- 勾选Enable SSL Proxying
- 添加Location时Host填
*,Port填* - 建议勾选"Use HTTP/2"
3.2 模拟器网络配置
MuMu的虚拟网络比较特殊,需要处理10.0.2.2这个特殊IP:
- 设置→WLAN→长按已连接网络→修改网络
- 代理选手动,主机名填
10.0.2.2,端口填Charles的监听端口 - 高级选项里把"绕过本地代理"勾掉
实测发现Android 9+版本需要额外操作:
adb shell settings put global http_proxy 10.0.2.2:599994. 疑难问题排查指南
4.1 证书安装失败
症状:能抓到HTTP包但HTTPS全是乱码 排查步骤:
- 检查
/system/etc/security/cacerts/下证书权限是否为644 - 执行
adb shell ls -l /system/etc/security/cacerts/ | grep charles看证书哈希前缀是否匹配 - 在模拟器设置→安全→信任的凭证→系统,查看是否存在Charles证书
4.2 网络连接异常
症状:模拟器无法联网或Charles无数据 解决方案:
- 关闭Charles的Windows系统代理(Proxy→Windows Proxy取消勾选)
- 在Rewrite设置中添加规则:
- Match Type选Host
- Match Value填
10.0.2.2 - Replace Value填
127.0.0.1
- 重启模拟器网络服务:
adb shell am broadcast -a android.net.wifi.WIFI_STATE_CHANGED4.3 数据包不完整
症状:Response内容截断或缺失Header 优化方案:
- 在Charles的Throttle Setting里关闭带宽限制
- 调整Proxy→Recording Settings→最大缓存改为1024MB
- 对于WebSocket协议,需要单独启用SSL代理
有次分析某电商APP时,发现商品详情API总是抓不全。后来发现是Charles的"Enable gzip compression"没关,关闭后立即恢复正常。这种细节问题特别容易被忽略。
5. 高阶技巧与应用
5.1 批量导出证书
当需要多台设备协作时,可以批量处理证书:
Get-ChildItem *.pem | ForEach { $hash = openssl x509 -subject_hash_old -in $_ Rename-Item $_ "$hash.0" }5.2 自动化配置脚本
我整理了个一键配置脚本:
#!/bin/bash # 自动配置MuMu抓包环境 adb connect 127.0.0.1:7555 adb root adb remount adb push ${CERT_NAME} /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/${CERT_NAME} adb shell settings put global http_proxy 10.0.2.2:59999 echo "配置完成,请重启模拟器"5.3 特定APP抓包技巧
针对不同应用场景:
- 微信小程序:需要额外配置WeChat X5调试
- Flutter应用:在启动参数添加
--disable-dart-ssl - 游戏加速器:关闭TCP Fast Open功能
最近帮朋友分析一个混合开发APP时,发现常规方法抓不到RN模块的请求。最后是通过在Charles的SSL Proxying Settings里添加具体域名解决的,这种问题需要具体问题具体分析。