java.lang.NoClassDefFoundError:解析失败:Lorg / apache / http / ProtocolVersion

时间:2018-05-22 07:16:47

标签: android google-maps gradle apache-httpcomponents android-9.0-pie

当我使用Android Studio 3.1构建Android P的应用程序时,我遇到了这样的错误,可以制作apk,但是当我在Android P模拟器上使用它时,它会崩溃并抛出以下信息,更多细节见图。

  

java.lang.NoClassDefFoundError:解析失败:Lorg / apache / http / ProtocolVersion

enter image description here

我在app模块下的build.gradle的一部分在下面,有人见过吗?并给出一些建议?非常感谢。

android {

     compileSdkVersion 'android-P'
     buildToolsVersion '28-rc1'

    useLibrary 'org.apache.http.legacy'

    //for Lambda
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }

    packagingOptions {

        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
    defaultConfig {
        applicationId "xxx.xxx.xxx"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode xxxx
        versionName "Vx.x.x"

        multiDexEnabled true


     //other setting required
        ndk {

            abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64'

        }

11 个答案:

答案 0 :(得分:517)

更新:这不再是错误或变通方法,如果您的应用面向API级别28(Android 9.0)或更高级别并且使用适用于Android 16.0.0或更低版本的Google Maps SDK,则需要此错误或解决方法(或者如果您的应用使用Apache HTTP Legacy库)。它现在包含在official docs中。公共问题一直是closed的预期行为。

这是Google Play服务方面的bug,在修复之前,您应该可以通过将AndroidManifest.xml添加到<application>标记中来解决此问题:

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

答案 1 :(得分:23)

此链接android-9.0-changes-28-->Apache HTTP client deprecation解释了将以下内容添加到AndroidManifest.xml的原因:

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

在Android 6.0中,我们删除了对Apache HTTP客户端的支持。   从Android 9开始,该库已从   bootclasspath,默认情况下不适用于应用程序。

答案 2 :(得分:23)

在您的AndroidManifest.xml中添加这两行。

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

请参见下面的代码

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">
        <activity android:name=".activity.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

答案 3 :(得分:16)

请执行以下任一操作:

1-将 play-services-maps 库更新为最新版本:

com.google.android.gms:play-services-maps:16.1.0

2-或在<application>的{​​{1}}元素中包含以下声明。

AndroidManifest.xml

答案 4 :(得分:15)

如果您将Android 9.0与旧版jar一起使用,则必须使用。 在您的mainfest文件中。

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

答案 5 :(得分:13)

它也在Android错误跟踪器上报告:https://issuetracker.google.com/issues/79478779

答案 6 :(得分:12)

如果您使用的是com.google.android.gms:play-services-maps:16.0.0或以下版本,并且您的应用程序的目标是API级别28(Android 9.0)或更高版本,则必须在AndroidManifest.xml的元素中包含以下声明

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

检查此链接-https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

答案 7 :(得分:2)

如果您使用的是com.google.android.gms:play-services-maps:16.0.0或更低版本,并且您的应用定位到API级别28(Android 9.0)或更高版本,则必须在元素中包含以下声明AndroidManifest.xml。

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

如果您使用的是com.google.android.gms:play-services-maps:16.1.0,则可以为您解决此问题;如果您的应用程序针对较低的API级别,则无需这样做。

答案 8 :(得分:1)

这可能是最新答案。但是,我希望它可以节省一些时间:

如果您使用的是com.google.android.gms:play-services-maps:16.0.0或更低版本,并且您的应用是目标API级别28(Android 9.0)或更高,在 AndroidManifest.xml

的元素中包含以下声明
<application
        ...
        ...
        android:usesCleartextTraffic="true"
        android:requestLegacyExternalStorage="true">

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

</application>

注意: Android 10 + 需要android:requestLegacyExternalStorage="true"才能访问存储R / W

Android 6.0在android清单中的application元素下引入了 useCleartextTraffic 属性。 Android P中的默认值为“ false” 。将此设置为 true 表示该应用程序打算使用清晰的网络流量。

如果您的应用在 Android 10设备上运行时选择退出范围存储,建议您继续在应用清单文件中将 requestLegacyExternalStorage设置为true 。这样,您的应用就可以在运行 Android 10

的设备上继续按预期运行

答案 9 :(得分:0)

根据this SO answer,此问题的发生是由于似乎已解决in version 2.6.30 of the SDK的AWS开发工具包错误,因此将版本更新为较新的版本可以帮助您解决问题。

答案 10 :(得分:0)

在React Native中,我出现了错误,该错误不显示地图并关闭应用程序,运行adb logcat并在控制台内显示错误:

java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion

通过在androidManifest.xml中添加

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