Android Nougat及以上版本BrowserMobProxy无法捕获请求求助
BrowserMobProxy无法捕获Android 7+请求的解决方案
我之前也碰到过一模一样的问题——BrowserMobProxy在Android 6及以下能正常抓请求生成HAR,但到了Android 7+就只生成空的HAR或者抓不到目标请求。这主要是Android 7.0引入的网络安全策略变更导致的,再加上一些代理配置的细节没做好,我来给你一步步解决:
核心原因
Android 7.0开始,默认情况下APP会忽略用户安装的CA证书,只信任系统预装的证书。而BrowserMobProxy需要通过自己生成的CA证书解密HTTPS请求,所以如果设备不信任这个证书,APP的HTTPS流量就会绕过代理,自然抓不到。
具体解决步骤
1. 让Android设备信任BrowserMobProxy的CA证书
方式一:安装为系统证书(推荐,无需修改APP)
- 首先找到BrowserMobProxy生成的CA证书,默认路径:
- Mac/Linux:
~/.browsermob-proxy/ca-certificate-rsa.cer - Windows:
C:\Users\<你的用户名>\.browsermob-proxy\ca-certificate-rsa.cer
- Mac/Linux:
- 将证书文件传到Android设备(比如通过微信、QQ或者ADB推送)
- 打开设备的设置 > 安全 > 加密与凭据 > 从存储设备安装,找到证书文件,按照提示完成安装。注意有些设备需要Root权限才能安装到系统证书目录,如果没有Root,就用下面的方式二。
方式二:修改APP的网络安全配置(适用于自研APP或无法Root的设备)
- 在APP的
res/xml目录下创建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <!-- 允许信任用户安装的证书 --> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
- 打开
AndroidManifest.xml,在<application>标签中添加配置:
<application ... android:networkSecurityConfig="@xml/network_security_config">
2. 修正BrowserMobProxy的代码配置
你提供的代码里有个明显的问题:BrowserMobProxy server;没有初始化,会导致空指针异常。另外要确保开启HTTPS解密,修正后的核心代码如下:
public BrowserMobProxyBaseClass bmProxy = new BrowserMobProxyBaseClass(); // 初始化代理实例 private BrowserMobProxy server; public void setUp() { try { server = new BrowserMobProxyServer(); // 开启HTTPS解密,信任所有服务器 server.setTrustAllServers(true); // 启动代理,指定端口(比如8080) server.start(8080); // 导出CA证书(方便安装到设备) File certFile = new File("bmp-ca.cer"); server.getCaRootCertificate().saveAs(certFile); bmProxy.proxyStart(); // 如果你的BaseClass里有其他配置,确保和这里不冲突 } catch (InterruptedException e) { e.printStackTrace(); } } public Map<String, String> getAnalyticsKeyValue() throws Exception { Map<String, String> keyValue = new HashMap<String, String>(); // 确保server已经初始化并启动 if (server == null || !server.isRunning()) { throw new IllegalStateException("Proxy server is not running!"); } Har har = server.getHar(); String strFilePath = "Selenium_test.har"; FileOutputStream fos = new FileOutputStream(strFilePath, false); har.writeTo(fos); fos.close(); // 记得关闭流 HarLog log = har.getLog(); List<HarEntry> entries = log.getEntries(); for (int i = entries.size() - 1; i >= 0; i--) { HarEntry entry = entries.get(i); System.out.println(entry.getRequest().getUrl()); if (entry.getRequest().getUrl().contains("ResponseTargetName")) { HarPostData postData = entry.getRequest().getPostData(); // 先判断postData是否为空,避免空指针 if (postData != null) { List<HarPostDataParam> listpost = postData.getParams(); for (HarPostDataParam pair : listpost) { if (pair.getValue() != null) { keyValue.put(pair.getName(), pair.getValue()); System.out.println("key : " + pair.getName() + " Value : " + pair.getValue()); } } } break; } } return keyValue; } public void tearDownProxy() throws Exception { if (server != null && server.isRunning()) { server.stop(); } bmProxy.stopProxy(); driver.quit(); new HtmlLogger().createHtmlAnalyticsLogFile(result); }
3. 验证设备代理配置
- 确保Android设备和运行代理的电脑在同一个局域网
- 在设备的Wi-Fi设置中,手动设置代理为电脑的IP地址,端口为你在代码中指定的8080(或者其他端口)
- 测试设备能否正常访问网络,如果不能,检查防火墙是否拦截了代理端口
额外排查要点
- 如果HTTP请求能抓到,但HTTPS抓不到,100%是证书信任的问题,回到步骤1重新检查
- 查看BrowserMobProxy的日志,有没有证书相关的报错信息,可以通过
server.setLogLevel(Level.DEBUG);开启 debug 日志 - 确保你的依赖版本是最新的(你用的2.1.5是比较旧的版本,可以试试升级到2.1.6或者更高版本)
内容的提问来源于stack exchange,提问作者Vikas
相关产品推荐
相关产品推荐

