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


324

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

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

在此处输入图片说明

在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'

        }

Answers:


836

更新:这不再是一个错误或解决方法,如果您的应用程序的目标是API级别28(Android 9.0)或更高版本,并且使用适用于Android 16.0.0或更低版本的Google Maps SDK,或者您的应用程序使用Apache HTTP,则这是必需的旧版库)。现在它已包含在官方文档中。公共问题已关闭的预期行为。

这是一个错误的谷歌游戏服务端,直到它固定的,你应该能够解决办法通过添加以下内容到AndroidManifest.xml里面的<application>标签:

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

84
这不再是解决方法。这是正确的做法,现在developers.google.com/maps/documentation/android-sdk/...
凯文Robatel

@ AdamK,Android 9是API级别28。= P(不是服务器端的错误,而是有关P行为的更改)
Fung LAM,

10
有人不使用地图也遇到这种情况吗?
罗宾·迪克霍夫

2
是的,如果您使用Apache HTTP Legacy库(或其中一个依赖项),也可能会遇到它。
AdamK

2
我正在使用Apache HTTP旧版库,这才救了我。谢谢!
Eric B.

55

此链接android-9.0-changes-28-> Apache HTTP客户端弃用说明了将以下内容添加到AndroidManifest.xml的原因:

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

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


33

请执行以下任一操作:

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

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

2-或在的<application>元素中包含以下声明AndroidManifest.xml

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

3
对于Android 9开发人员,当然对Google来说,这再次是极大的耻辱。我希望他们能够修改Android 9的实现和行为,因为它存在许多错误。不幸的是,谷歌坚持要求将这些错误称为行为改变!
saeed khalafinejad '19年

20

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

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


17

要在Android 9.0 Pie中完美运行org.apache.http.legacy,请创建一个xml文件 res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
      <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
        <certificates src="system" />
       </trust-anchors>
      </base-config>
    </network-security-config>

并在您的AndroidManifest.xml中添加2个标签标签

android:networkSecurityConfig =“ @ xml / network_security_config” android:name =“ org.apache.http.legacy”

<?xml version="1.0" encoding="utf-8"?>
 <manifest......>
  <application android:networkSecurityConfig="@xml/network_security_config">
   <activity..../> 
   ......
   ......
 <uses-library
        android:name="org.apache.http.legacy"
        android:required="false"/>
</application>

还添加useLibrary 'org.apache.http.legacy'您的应用程序构建gradle

android {
compileSdkVersion 28
defaultConfig {
    applicationId "your application id"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    useLibrary 'org.apache.http.legacy'
}

这看起来像是您打算向公众发布应用程序时不应该做的事情。对于开发来说,这也许很有意义,但是随后它仍然无法在生产环境中工作,因此没有任何意义。
Maciej Pigulski '19

这个答案应该是可以接受的答案,我尝试了很多方法但没有任何效果。好工作@Gitesh
Mitesh Jain

16

在您的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>



8

如果您使用的是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级别,则不需要这样做。


5

在本机反应中,我出现了不显示地图并关闭应用程序的错误,运行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" />

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.