android:usesCleartextTraffic 指示應(yīng)用程序是否打算使用明文網(wǎng)絡(luò)流量,例如明文HTTP调限。目標(biāo)API級(jí)別為27(N)或更低的應(yīng)用程序的默認(rèn)值為“ true”。面向API級(jí)別28(P)或更高級(jí)別的應(yīng)用默認(rèn)為“ false”秦躯。
當(dāng)屬性設(shè)置為“ false”時(shí)裆装,平臺(tái)組件(例如,HTTP和FTP堆棧哨免,DownloadManager和MediaPlayer)將拒絕應(yīng)用程序使用明文流量的請求。強(qiáng)烈建議第三方庫也采用此設(shè)置载荔。避免明文通信的主要原因是缺乏機(jī)密性慧耍,真實(shí)性和防篡改保護(hù)丐谋;網(wǎng)絡(luò)攻擊者可以竊聽所傳輸?shù)臄?shù)據(jù)煌珊,并且還可以對(duì)其進(jìn)行修改而不會(huì)被檢測到泌豆。
所以在安卓P之后將禁止APP使用所有未加密的的鏈接,因此運(yùn)行安卓P系統(tǒng)的安卓設(shè)備無論是接受或者發(fā)送流量踪危,未來都不能使用明碼傳輸,需要使用下一代(Transport Layer Security)傳輸層安全協(xié)議畴博,而安卓N和O則不會(huì)受到影響蓝仲。
舉例:
在安卓P中使用HttpUrlConnection進(jìn)行http請求會(huì)出現(xiàn)以下異常
W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
在安卓P中使用OKHttp請求則會(huì)出現(xiàn)
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy
在安卓P系統(tǒng)的設(shè)備上,如果應(yīng)用使用的是非加密的明文流量http網(wǎng)絡(luò)請求袱结,則會(huì)導(dǎo)致改應(yīng)用無法進(jìn)行網(wǎng)絡(luò)請求,https則不會(huì)受影響溢吻,同樣的果元,如果應(yīng)用嵌套了webview,webview也只能使用https請求。
解決方案:
針對(duì)這個(gè)問題而晒,有以下三種解決方法:
1.APP改用https請求,這個(gè)需要服務(wù)器也支持
2.targetSdkVersion降低到27以下
3.在清單文件中的application標(biāo)簽中直接插入android:usesCleartextTraffic="true"
- 新建res/xml/network_security_config.xml文件题翰,設(shè)置網(wǎng)絡(luò)安全性配置
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
在AndroidManifest.xml中诈胜,application節(jié)點(diǎn)下新增:
android:networkSecurityConfig="@xml/network_security_config"
5.新建res/xml/network_security_config.xml文件,設(shè)置網(wǎng)絡(luò)安全性配置
這個(gè)方法跟上面的類似血公,不同之處在于缓熟,方法4將所有域名的http請求都允許了摔笤,下面這個(gè)方法只允許了指定域名的http請求垦写。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">(Your URL)xxx.x.xxx.xx</domain>
<domain includeSubdomains="true">x.xxx.xx</domain>
</domain-config>
</network-security-config>