Android老版本httpclient高版本兼容

Android 6.0 版本已移除对 Apache HTTP 客户端的支持

Android 6.0 版本移除了对Apache HTTP客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别为9)或更高版本为目标平台,请改用 HttpURLConnection 类。此API效率更高,能够通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。要继续使用 Apache HTTP API,须先在 build.gradle 文件中声明以下编译时依赖项:

android {

    useLibrary  'org.apache.http.legacy'

P版本修改 Remove org.apache.http.legacy from bootclasspath

从Android P开始,org.apache.http.legacy 库将从 bootclasspath 中删除。

(1)修改对 TargetSdkVersion<28 的应用的影响

该修改对大多数 TargetSdkVersion<28 的应用都无影响,但是如果应用使用了系统 ClassLoader加载org.apache.http.*中的类时,将在Android P上发生 NoClassDefFoundError 失败,因为DexClassLoader不再知道这些类。为了防止将来出现类似的问题,应用应该通过ApplicatiionClassLoader 加载类,而不是直接访问DexClassLoader。

(2)修改对 TargetSdkVersion>=28 的应用的影响

对所有 TargetSdkVersion>=28 的应用,如果还是按照以前一样通过在 build.gradle 文件中声明编译时依赖项,都会出现 Apache-http 接口找不到的异常.

Android老版本httpclient高版本兼容_第1张图片

二、适配指导

1.继续使用Apache-http

(1)TargetSdkVersion

方案一:不要使用非标准的 ClassLoader 。

方案二:应用可以自己添加依赖的 apache jar 包到工程 libs 目录规避该兼容性问题。

Android老版本httpclient高版本兼容_第2张图片Android老版本httpclient高版本兼容_第3张图片

注意:对于最低 SDK为23或更低的应用程序,android:required=“false”属性是必需的,因为在 API 等级低于24的设备上,org.apache.http.legacy 库不可用。(在这些设备上,Apache HTTP 类在 bootclasspath 上可用。)

(2)TargetSdkVersion>=28 的应用适配指导

对于 TargetSdkVersion>=28的应用如果想继续使用Apache-http客户端,需要在应用的 AndroidManifest.xml 文件中添加:

2.不再使用Apache-http客户端

使用 HttpURLConnection 或者okhttp 替代 Apache-http。

你可能感兴趣的:(Android老版本httpclient高版本兼容)