当把应用的targetSdkVersion设置成24或更大时,使用抓包工具(比如Charles)无法对https请求进行抓包(https请求显示红色叉叉),并且https请求发不出去,即使安装了Charles的证书。
当把应用的targetSdkVersion设置成28或更大时,应用的http请求发不出去,系统只允许发送https请求。发送http请求会报错:
Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
当同时设置targetSdkVersion=28或以上,并且使用抓包工具抓包,那么你的应用就会变成无法联网状态(单机)。
从2019年8月开始,Googe Play要求我们应用的targetSdkVersion必须设置成28或以上,那么以上的问题我们都会遇到。
如果你的项目中使用到了apache的HttpClient组件,那么在targetSdkVersion=28或以上时,Googe Play要求需要在AndroidManifest的application标签中增加以下配置:
<uses-library android:name="org.apache.http.legacy" android:required="false" /> <!--跟Activity同级别-->
如何解决以上问题呢?
一、设置允许http请求
在AndroidManifest.xml文件中给application配置属性
android:usesCleartextTraffic="true"
示例
<application
android:name=".App"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme" >
加上这个属性后,就能发http请求了。
二、允许charles对https请求抓包
在AndroidManifest.xml文件中给application配置属性
android:networkSecurityConfig="@xml/network_security_config"
并且在res文件夹下创建xml文件夹,并添加network_security_config文件,文件内容如下:
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
这个配置的作用是信任自签名ssl证书。这样你就能使用charles对https进行抓包了。
当你同时给application加上以上两个属性后,比如
<application
android:name=".App"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme" >
你会发现,http请求还是发不出去,但是https抓包是可以的。因为配置android:networkSecurityConfig="@xml/network_security_config"
这个属性后,android:usesCleartextTraffic="true"
这个配置就会失效。原因可能是个bug吧。
如何让这两个配置都生效呢?
先去掉AndroidManifest.xml中android:usesCleartextTraffic="true"
属性,然后在network_security_config文件中base-config标签加上属性cleartextTrafficPermitted="true"
即可。
因此,要解决这两个问题,只需要给AndroidManifest.xml中的application标签配置属性
android:networkSecurityConfig="@xml/network_security_config"
示例:
<application
android:name=".App"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme" >
network_security_config文件完整内容如下:
<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>