背景
targetSdkVersion设置为28,运行在Andnroid 9.0设备上,原本http请求失败,如bugly上报失败;
或者抛出以下错误:1
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy
原因
默认情况下启用网络传输层安全协议 (TLS)
如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。
总之一句话,以前你要“裸奔”,我管不着,现在必须穿上“衣服”了,否则不让出街;
如果确实要继续“裸奔”,请书面申请。
解决办法
- 将所有http请求改为https请求;
- targetSdkVersion改为27或以下;
- 继续使用http非加密明文请求,方法如下
配置网络安全策略
在res的xml目录下,新建一个xml文件(名称自定义,如:network-security-config.xml),内容如下:
1
2
3
4<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>在manifest的Application标签中设置安全策略配置
1
2
3
4
5
6
7
8
9
10<application
...
android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true">
<!-- 兼容Android 9.0 -->
<!--<uses-library-->
<!--android:name="org.apache.http.legacy"-->
<!--android:required="true" />-->
</application>
添加legacy库依赖
build.gradle添加
1
useLibrary 'org.apache.http.legacy'
manifest中添加
1
2
3
4
5
6
7
8
9
10
11
12<application
...
android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true">
...
<!-- 兼容Android 9.0 -->
<uses-library
android:name="org.apache.http.legacy"
android:required="true" />
</application>
以上,问题可解;
总结
https是大势所趋,早晚得支持,长痛不如短痛。勇敢上吧!