要对移动端App进行压力测试,JMeter是常用工具,第一步就是录制脚本。原理是把 JMeter 当作代理服务器,让手机流量经过电脑,由JMeter记录下所有HTTP/HTTPS请求。
一、准备工作
环境要求
电脑和手机连接在同一个局域网(同一个 Wi-Fi)。
JMeter 已安装,推荐JMeter 5.5+,需依赖Java 8+。
获取电脑 IP
Windows:ipconfig查看无线局域网适配器的IPv4 地址。
macOS / Linux:ifconfig查看 en0 或 en1 的 inet 地址。
建议将电脑 IP 设为静态,避免重启后IP变动导致手机代理失效。
二、JMeter代理录制基础设置
在JMeter中添加录制组件
测试计划上右键 - 添加 (Add) - 线程组 (Thread Group)。
线程组上右键 - 添加 - 思路控制器 (Logic Controller) - 录制控制器 (Recording Controller)。它能把录制的请求都收纳起来。
测试计划上右键 - 添加 - 非测试元件 (Non-Test Elements) - HTTP(S) 测试脚本录制器 (HTTP(S) Test Script Recorder)。
配置录制器端口
在录制器界面,端口填入 8888(或其他未被占用的端口,如 9999)。
目的控制器”选择刚刚创建的录制控制器。
点击右下角的 启动 Start)按钮。首次启动会弹出提示,让你生成根证书,此时先不重点确定。
三、移动端代理设置
手机设置手动代理
进入手机的 Wi-Fi 设置,修改当前连接的 Wi-Fi。
代理设为手动。
服务器/主机名:填入刚才查到的电脑 IP。
端口:填入 JMeter 录制器的端口,如 8888。
保存后,手机的网络流量就会导向 JMeter。
证实代理连通性
先不要开任何 HTTPS 应用。用手机浏览器访问 http://zmtests.com,正常的话 JMeter 录制控制器下会马上出现请求。同时手机浏览器能正常打开网页。
如果没反应,检查:电脑防火墙是不是拦截了 8888 端口(临时关闭防火墙或添加入站规则)。
四、HTTPS 抓包重要:证书安装和信任
这是最易出错的步骤。HTTPS 流量是加密的,JMeter必须用自签名的根证书做中间人解密。
1. 安装JMeter根证书到手机
JMeter 启动录制器时,会在其 bin 目录下自动生成一个证书文件 ApacheJMeterTemporaryRootCA.crt,有效期为 7 天。你可以把这个文件通过邮件、微信或 AirDrop 传到手机上。
iOS 安装步骤:
点击 .crt 文件,会弹出“已下载描述文件”的提示。
前往 设置 - 通用 - VPN 和设备管理,点击该证书文件安装。
安装后必须前往 设置 - 通用 - 关于本机 - 证书信任设置,把 ApacheJMeter 的开关打开,使其受完全信任。
Android 7.0 以下系统:
直接点击 .crt 文件安装,命名为任意名称,凭据用途选“VPN 和应用”,按提示输入锁屏密码即可。
2. 攻克 Android 7.0+ 的用户证书限制(重点)
从 Android 7.0 开始,应用默认只信任系统级证书,你安装的“用户证书”仅对浏览器有效,绝大多数 App 的 HTTPS 流量录下来会是空请求或报错。
解决方案:
方案 A:使用 ROOT 后的模拟器或手机(最彻底)
将 JMeter 证书转为系统证书。在模拟器(如 MuMu、雷电)中开启 Root 权限后:
计算证书哈希并重命名:
bash
openssl x509 -inform PEM -subject_hash_old -in ApacheJMeterTemporaryRootCA.crt | head -1
# 假设输出为 12345678
将证书文件命名为 12345678.0。
通过 adb 将其推送到系统目录,并设好权限:
bash
adb root
adb remount
adb push 12345678.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/12345678.0
adb reboot
重启后,证书就成为了系统信任的根证书。
方案 B:使用 VirtualXposed + JustTrustMe(免 ROOT)
这是对目的 App 做一次“沙箱”运行,强制信任一切证书。
在手机上安装 VirtualXposed 和 JustTrustMe 模块。
在 VirtualXposed 中添加目的 App,并激活 JustTrustMe 模块。
之后在 VirtualXposed 里启动该 App,同时手机代理保持指向 JMeter,即可抓到明文 HTTPS 包。这种方法不破坏系统,适合快速测试。
方案 C:Android 14+ 的替代方案
高版本 Android 强制只信任系统证书存储,且 /system 只读。可在开发者选项中,尝试关闭“监控通过证书颁发的安全连接”,或直接在电脑上装 Android 模拟器配合 ROOT 来完成录制,这是最省心的方式。
五、处理SSL Pinning证书绑定
如果 App 自身做了更强的安全措施-代码内只信任特定证书(SSL Pinning),那么即使你装了系统证书也无法抓包。
表现:JMeter 无法录制任何请求,或 App 直接提示网络错误。
常用绕过方法:
Frida 动态注入:编写 Frida 脚本,Hook 掉证书证实函数,在 PC 端运行 frida -U -f 包名 -l bypass.js。
Xposed 模块:前面提到的 JustTrustMe / TrustMeAlready,就是专门干这个的。
修改APK:用 apk-mitm 等工具反编译后移除 Pinning思路再重打包,适合测试环境。
六、录制过程和脚本优化
设置过滤规则:在 JMeter 录制器的请求过滤标签页,添加 .*\.(jpg|png|gif|css|js|woff).* 等正则,过滤掉静态资源请求,让脚本更干净。
为事务命名:录制时可以勾选从 HTML 资源获取标题,方便识别。也可以之后手动整理,将登录、下单等连续请求放进事务控制器。
处理动态数据:录制完成后,必须进行关联(如 token、session ID),用 JMeter 的“正则表达式提取器”或“JSON 提取器”从服务器响应中抓取,替换掉录制下来的硬编码值。
问题排查:
手机和电脑在同一 Wi-Fi,IP 填对,能抓 HTTP 但抓不到 HTTPS?
证书未信任,请按上面第四步操作。
App 打开闪退或提示无法连接?
App 做了 SSL Pinning,需要用 VirtualXposed 或 Frida 绕过。
录制响应超时?
检查电脑防火墙,或确定手机代理端口正确。
证书过期怎么办?
JMeter 每启动一次录制器会重新生成,记得删掉手机里旧的证书,再装新的。