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。

相关文章
相关标签/搜索