早在幾年前,谷歌就推薦在Android2.3版本以上使用HttpURLConnection,而在即將正式發佈的 Android P 版本中,谷歌完全取消了對Apache HTTPClient的支持,針對此更改,開發者該如何正確適配 Android P ?android
https://developer.android.com/preview/behavior-changes#apache-nonpapache
https://developer.android.com/preview/behavior-changes#apache-p緩存
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' }
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 接口找不到的異常:
(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"/>
使用 HttpURLConnection 替代 Apache-http。