Android 9.0/P 版本推薦使用 HttpURLConnection


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

一、背景

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

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

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 文件中聲明以下編譯時依賴項:

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

3.P版本修改

Remove org.apache.http.legacy from bootclasspath

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

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

該修改對大多數 TargetSdkVersion<P 的應用都無影響,但是如果應用使用了系統 ClassLoader加載org.apache.http.*中的類時,將在Android P上發生 NoClassDefFoundError 失敗,因為系統ClassLoader不再知道這些類。為了防止將來出現類似的問題,應用應該通過應用 ClassLoader 加載類,而不是直接訪問系統ClassLoader。

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

對所有 TargetSdkVersion>=P 的應用,如果還是按照以前一樣通過在 build.gradle 文件中聲明以下編譯時依賴項:\

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

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

二、適配指導

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM