Android P版本应用兼容性适配第4季Apache HTTP 客户端弃用

    1. 背景介绍

在 Android 6.0 中,谷歌取消了对 Apache HTTP 客户端的支持

此变更对大多数不以 Android 9 或更高版本为目标的应用没有任何影响。 不过,此变更会影响使用非标准 ClassLoader结构的某些应用,即使这些应用不以 Android 9 或更高版本为目标平台。

如果应用使用显式委托到系统 ClassLoader 的非标准 ClassLoader,则应用会受到影响。 在 org.apache.http.* 中查找类时,这些应用需要委托给应用 ClassLoader。 如果它们委托给系统 ClassLoader,则应用在 Android 9 或更高版本上将失败并显示 NoClassDefFoundError,因为系统 ClassLoader 不再识别这些类。 为防止将来出现类似问题,一般情况下,应用应通过应用 ClassLoader 加载类,而不是直接访问系统 ClassLoader。

    1. 兼容性影响
        1. 所有的targetSdkVersion>=P的应用不适配的话,继续按照之前的方式使用apache http客户端会导致应用因为找不到apache http类抛异常崩溃;
        2. 小部分targetSdkVersion<P的应用,如果应用使用了非标准的classloader,不适配的话也是会导致闪退的问题。

异常日志:

08-24 10:47:10.455  4364  4364 E AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/methods/HttpGet;

    1. 适配指导
      1. 继续使用apache http客户端
        1. targetSdkVersion<p的应用,如果测试发现有该问题,可能是显示指定了系统的ClassLoader去查找apache-http类,但是系统的ClassLoader已经找不到apache的类了,所以报错。所以建议应用如果还需要继续使用apache-http的类,不要显示指定系统的ClassLoader去加载apache-http通过应用的ClassLoader去加载是没有问题的。
        2. targetSdkVersion>=P的应用:

对于targetSdkVersion>=P的应用如果想继续使用apache-http客户端:

  • 为了能编译通过需要在 build.gradle 文件中声明以下编译时依赖项

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

  • 需要在应用的AndroidManifest.xml文件中添加:

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

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

      1. 不再使用apache-http客户端

使用HttpURLConnection替代apache-http

猜你喜欢

转载自blog.csdn.net/qq_33209777/article/details/86741605