相信这个问题很多人都遇到过Android7.0以上系统无法抓包的问题,由于在测试过程中对分析定位问题很不方便,所以就找了解决的办法让公司的开发童鞋改了改(毕竟我不能改开发代码,要是可以的话我就......),成功之后,就让开发写了一篇总结文章出来哈哈哈,所谓前人种树后人乘凉嘛~~以下就是解决办法,这里要特别提醒一下:测试环境可以这样做,线上的时候记得去掉哦!!!毕竟有关安全问题。
- 遇到的问题:Android6.0及以下系统可以抓包,而Android7.0及以上系统不能再抓包
- 原因:Android7.0+的版本新增了证书验证,即app内不再像原来一样默认信任用户的证书
- 解决办法:默认信任所有证书
- 具体实现步骤
- 1)在res底下创建一个xml文件夹,然后在内部创建一个名为 “network_security_config.xml”的文件,文件内容如下:
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
- 2)在AndroidManifest里的<application>标签中,添加代码:
android:networkSecurityConfig="@xml/network_security_config"
- 3)然后重新编译打包即可成功抓包,困扰测试姐姐们已久的问题解决起来其实对于开发童鞋来说是个很简单的问题,有的时候需要我们去推动一下,下图抓包成功:
- 添加以上的配置可能带来的风险或问题
- 1)安全问题:
- 开启上述配置后虽然可以成功抓包,但不可避免的也会带来一些异常风险问题,换句话说就是,我们希望自己人可以抓到包,但又不希望外部的人员抓到包。
- 所以转换成需求就是:在测试、开发阶段可以抓包,但正式发布包不能抓包。(前面我们也有说过)
- 怎么办呢?
- 步骤一:将前面AndroidManifest里的<application>标签中新增的代码改成:
android:networkSecurityConfig="${NETWORK_SECURITY_CONFIG}"
- 步骤二:相当于由前面的静态引入证书文件改成了动态引入,然后buildType中的release加入
release {
manifestPlaceholders = [
NETWORK_SECURITY_CONFIG: ""
]
}
- 步骤三:buildType中的debug中加入
debug {
manifestPlaceholders = [
NETWORK_SECURITY_CONFIG: "@xml/network_security_config"
]
}
- 因为压根就没有引入证书文件,所以Release模式下打的包不能抓包,反之Debug包则可以。所以我们要做的就是开发测试阶段打Debug包、发布线上就打Release包即可。
- 其实,除了利用Release和Debug的包类型实现区分可不可抓包,使用环境域名中的base_url来决定也可以,判断方式有很多,具体用哪种好,怎么实现就需要自己去摸索了。
- 2)android7.0以上的手机,开着网络代理访问不了webview页面
- 步骤:我们需要在webview的WebViewClient中,将下面这行代码给注释掉
super.onReceivedSslError(view, handler, error);
- 原因描述:这一段代码是为了忽略掉SSL证书错误,因为开启代理后网络会变得不安全,证书会错误,webview检测到证书错误之后就直接让webview白板,不请求任何数据。 这一节是为了忽略掉父类的处理,然后默认走下去。
- 以上希望可以帮助到大家解决疑惑吧~~