編輯...
導(dǎo)讀:
- 移動開發(fā)知識體系總章(Java基礎(chǔ)、Android、Flutter)
- 非SDK接口限制
- 默認(rèn)情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議
- androd P Apache HTTP 客戶端棄用影響采用非標(biāo)準(zhǔn) ClassLoader 的應(yīng)用(即 androd P Apache HTTP API 不可用)
- 全面禁止了非安全的http連接
- socket連接也必須要使用安全連接
- 對WebView的數(shù)據(jù)進(jìn)行了進(jìn)程隔離
很有必要講一下Android的network security config.
Android network security config可以讓我們通過配置文件來增加對于網(wǎng)絡(luò)安全的配置。
它可以允許我們配置:
我們的app信任哪些CA證書
允許我們的app可以訪問或者不能訪問哪些非安全連接
全面禁止了非安全的http連接
Android P 全面禁止了非安全的http連接,如果要使用非加密連接,需要配置network security config.步驟如下:
1.1 在res/xml下建立我們自己的network security config文件,名字任意,可以叫做network_security_config.xml
1.2 如果我們相對某些網(wǎng)址使用非安全連接,可以使用如下配置
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<!--允許以下網(wǎng)址使用非安全的連接-->
<domain includeSubdomains="true">insecure.example.com</domain>
<domain includeSubdomains="true">insecure.cdn.example.com</domain>
</domain-config>
</network-security-config>
1.2 如果我們想要允許所有的非安全連接,可以使用如下配置
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<!--不允許以下網(wǎng)址使用非安全連接-->
<domain includeSubdomains="true">example.com</domain>
<domain includeSubdomains="true">cdn.example2.com</domain>
</domain-config>
<!--默認(rèn)允許所有網(wǎng)址使用非安全連接-->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
1.3 然后在AndroidManifest的<application>標(biāo)簽中增加如下屬性
android:networkSecurityConfig="@xml/network_security_config"
Android network security config可以讓我們通過配置文件來增加對于網(wǎng)絡(luò)安全的配置。它可以允許我們配置:
我們的app信任哪些CA證書
允許我們的app可以訪問或者不能訪問哪些非安全連接
socket連接也必須要使用安全連接
socket連接也必須要使用安全連接,必須要使用SSLSocketFactory,而不能使用SocketFactory.
請注意,SSLScoket本身并不校驗(yàn)hostname的安全性,我們必須使用getDefaultHostnameVerifier的verify方法對hostname進(jìn)行校驗(yàn)。
注意,Android只是說我們必須在Socket中也是用安全連接,我們要使用Verifier進(jìn)行校驗(yàn)。但是并沒有強(qiáng)制我們這樣做,也就是說在使用socket的時候,不進(jìn)行校驗(yàn),使用非安全連接也是可以的,但是不推薦。
對WebView的數(shù)據(jù)進(jìn)行了進(jìn)程隔離
在Android P上,對WebView的數(shù)據(jù)進(jìn)行了進(jìn)程隔離,同一個應(yīng)用程序的不同進(jìn)程無法訪問其他進(jìn)程中WebView的數(shù)據(jù),包括Cookie等。
谷歌推薦的做法是只在一個進(jìn)程中使用WebView,所以我們應(yīng)該把所有使用到WebView的Activity都放置在同一個進(jìn)程中。我們可以在不需要使用WebView的進(jìn)程中調(diào)用WebView的靜態(tài)方法disableWebView來強(qiáng)制要求該進(jìn)程不能使用WebView.
如果一定要在不同的進(jìn)程中使用WebView,那么我們必須調(diào)用WebView.setDataDirectorySuffix來為該進(jìn)程中的WebView設(shè)置數(shù)據(jù)目錄。不同的進(jìn)程是沒有辦法訪問其他進(jìn)程中的WebView數(shù)據(jù)的,包括Cookie.我們可以使用setCookie和getCookie來在不同的進(jìn)程之間復(fù)制WebView的Cookie.