前言
Android 在 Android 9(Pie)[android:targetSdkVersion = 28]之后将网络通信默认配置为禁止了明文传输。所谓明文传输就是Http请求,所以如果我们开发版本高于 28 ,打包之后我们 app 中的 Http 请求都无法成功,将会抛出
W/System.err: java.net.UnknownServiceException: CLEARTEXT communication to **** not permitted by network security policy
的错误。
关于 Http 请求的限制历史:
- 当 Android 6.0(Marshmallow)「(API 23)」发布时,谷歌提出了清单文件中配置:
android:usesCleartextTraffic
作为防止意外使用明文通信的手段
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
<!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
<certificates src="user" />
</trust-anchors>
</base-config>
- Android 7.0 (Nougat) 通过引入Android网络安全配置 「Network Security Configuration」特性来过渡开发者配置这个属性。Android 7.0 ~ 8.0 「(API 24) 至 (API 27)」 之间,客户端仍可以使用 Http 请求。系统默认网络安全配置如下
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
</trust-anchors>
</base-config>
- Android 9(Pie)「(API 28)」以后系统默认强制禁止明文传输
usesCleartextTraffic = true
且默认只信任系统级别证书,也