-
- 背景介绍
在 Android 6.0 中,谷歌取消了对 Apache HTTP 客户端的支持。
此变更对大多数不以 Android 9 或更高版本为目标的应用没有任何影响。 不过,此变更会影响使用非标准 ClassLoader结构的某些应用,即使这些应用不以 Android 9 或更高版本为目标平台。
如果应用使用显式委托到系统 ClassLoader 的非标准 ClassLoader,则应用会受到影响。 在 org.apache.http.* 中查找类时,这些应用需要委托给应用 ClassLoader。 如果它们委托给系统 ClassLoader,则应用在 Android 9 或更高版本上将失败并显示 NoClassDefFoundError,因为系统 ClassLoader 不再识别这些类。 为防止将来出现类似问题,一般情况下,应用应通过应用 ClassLoader 加载类,而不是直接访问系统 ClassLoader。
-
- 兼容性影响
-
- 所有的targetSdkVersion>=P的应用不适配的话,继续按照之前的方式使用apache http客户端会导致应用因为找不到apache http类抛异常崩溃;
- 小部分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;
-
- 适配指导
- 继续使用apache http客户端
- targetSdkVersion<p的应用,如果测试发现有该问题,可能是显示指定了系统的ClassLoader去查找apache-http类,但是系统的ClassLoader已经找不到apache的类了,所以报错。所以建议应用如果还需要继续使用apache-http的类,不要显示指定系统的ClassLoader去加载apache-http的类,通过应用的ClassLoader去加载是没有问题的。
- targetSdkVersion>=P的应用:
- 继续使用apache http客户端
- 适配指导
对于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上可用。)
-
-
- 不再使用apache-http客户端
-
使用HttpURLConnection替代apache-http