天天看點

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