-
- 背景介紹
在 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