Android 9.0/P 版本推薦使用 HttpURLConnection

早在幾年前,谷歌就推薦在Android2.3版本以上使用HttpURLConnection,而在即將正式發佈的 Android P 版本中,谷歌完全取消了對Apache HTTPClient的支持,針對此更改,開發者該如何正確適配 Android P ?android

1、背景

1.參考谷歌提供的 Android P 版本變動說明文檔:

https://developer.android.com/preview/behavior-changes#apache-nonpapache

https://developer.android.com/preview/behavior-changes#apache-p緩存

2.Android 6.0 版本已移除對 Apache HTTP 客戶端的支持

https://developer.android.com/about/versions/marshmallow/android-6.0-changes網絡

Android 6.0 版本移除了對Apache HTTP客戶端的支持。若是您的應用使用該客戶端,並以 Android 2.3(API 級別爲9)或更高版本爲目標平臺,請改用 HttpURLConnection 類。此API效率更高,可以經過透明壓縮和響應緩存減小網絡使用,並可最大限度下降耗電量。要繼續使用 Apache HTTP API,須先在 build.gradle 文件中聲明如下編譯時依賴項:gradle

android {
    useLibrary 'org.apache.http.legacy'
}

3.P版本修改

Remove org.apache.http.legacy from bootclasspathui

從Android P開始,org.apache.http.legacy 庫將從 bootclasspath 中刪除。spa

(1). 修改對 TargetSdkVersion<P 的應用的影響code

該修改對大多數 TargetSdkVersion<P 的應用都無影響,可是若是應用使用了系統 ClassLoader加載org.apache.http.*中的類時,將在Android P上發生 NoClassDefFoundError 失敗,由於系統ClassLoader再也不知道這些類。爲了防止未來出現相似的問題,應用應該經過應用 ClassLoader 加載類,而不是直接訪問系統ClassLoader。cdn

(2). 修改對 TargetSdkVersion>=P 的應用的影響xml

對全部 TargetSdkVersion>=P 的應用,若是仍是按照之前同樣經過在 build.gradle 文件中聲明如下編譯時依賴項:\

android {
    useLibrary 'org.apache.http.legacy'
}

想繼續使用 Apache-http 接口,都會出現 Apache-http 接口找不到的異常: 

2、適配指導

1.繼續使用Apache-http

(1). TargetSdkVersion<P 的應用適配指導

方案一:不要使用非標準的 ClassLoader 。

方案二:應用能夠本身添加依賴的 apache jar 包到工程 libs 目錄規避該兼容性問題。

 
 

注意:對於最低 SDK爲23或更低的應用程序,android:required=「false」屬性是必需的,由於在 API 等級低於24的設備上,org.apache.http.legacy 庫不可用。(在這些設備上,Apache HTTP 類在 bootclasspath 上可用。)

(2). TargetSdkVersion>=P 的應用適配指導

對於 TargetSdkVersion>=P的應用若是想繼續使用Apache-http客戶端,須要在應用的 AndroidManifest.xml 文件中添加:

<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>

2.再也不使用Apache-http客戶端

使用 HttpURLConnection 替代 Apache-http。

相關文章
相關標籤/搜索