java.lang.NoClassDefFoundError: resolución fallida de: Lorg / apache / http / ProtocolVersion

324

Me encontré con ese error cuando uso Android Studio 3.1 para compilar una aplicación de Android P, se puede hacer el apk, pero cuando lo uso en el emulador de Android P, se bloqueará y arrojará la siguiente información, más detalles ver la foto .

java.lang.NoClassDefFoundError: resolución fallida de: Lorg / apache / http / ProtocolVersion

ingrese la descripción de la imagen aquí

parte de mi build.gradle en el módulo de la aplicación está debajo, ¿alguien cumple con esto? ¿Y dar alguna sugerencia? Muchas gracias.

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'

        }
dukeking
fuente

Respuestas:

836

Actualización: Esto ya no es un error o una solución alternativa, es necesario si su aplicación se dirige al Nivel de API 28 (Android 9.0) o superior y usa el SDK de Google Maps para Android 16.0.0 o inferior (o si su aplicación usa el Apache HTTP Biblioteca heredada). Ahora está incluido en los documentos oficiales . El problema público se ha cerrado como comportamiento previsto.

Este es un error en el lado de los servicios de Google Play, hasta que se solucione, debería poder solucionarlo agregando esto AndroidManifest.xmldentro de la <application>etiqueta:

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
fuente
84
Esto ya no es una solución alternativa. Esta es la forma correcta ahora developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel
@AdamK, Android 9 es API nivel 28. = P (no es un error del lado del servidor, sino sobre el cambio de comportamiento de P)
Fung LAM
10
¿Alguien que no usa mapas experimenta esto también?
Robin Dijkhof el
2
Sí, también puede encontrarse con él si usa la biblioteca Apache HTTP Legacy (o una de sus dependencias lo hace).
AdamK
2
Estoy usando la biblioteca Apache HTTP Legacy y esto me salvó. ¡Gracias!
Eric B.
55

Este enlace android-9.0-changes-28 -> La desaprobación del cliente HTTP Apache explica la razón para agregar lo siguiente a su AndroidManifest.xml:

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

Con Android 6.0, eliminamos el soporte para el cliente Apache HTTP. A partir de Android 9, esa biblioteca se elimina de bootclasspath y no está disponible para las aplicaciones de forma predeterminada.

pradip tilala
fuente
33

Haga cualquiera de lo siguiente:

1- Actualiza la biblioteca play-services-maps a la última versión:

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

2- O incluya la siguiente declaración dentro del <application>elemento de AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
fuente
3
Nuevamente, es una gran pena para los desarrolladores de Android 9 y, por supuesto, para Google. Espero que revisen la implementación y el comportamiento de Android 9, ya que tiene muchos errores. Desafortunadamente, Google insiste en llamar a estos errores, cambios de comportamiento!
saeed khalafinejad
20

Si usa Android 9.0 con jar heredado, debe usarlo. en tu archivo mainfest.

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

Suresh Kumar
fuente
17

Para ejecutar org.apache.http.legacy perfectamente en Android 9.0 Pie, cree un archivo 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>

Y agregue 2 etiquetas en su AndroidManifest.xml

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>

También agregue useLibrary 'org.apache.http.legacy'en su aplicación construir 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'
}
Gitesh
fuente
Esto parece algo que no debería estar haciendo cuando tiene la intención de lanzar una aplicación al público. Para el desarrollo, tal vez tenga sentido, pero aún así no funcionará en la producción, por lo que no tiene sentido.
Maciej Pigulski
Esta respuesta debe ser aceptada, intenté de muchas maneras pero no funcionó. Good Job @Gitesh
Mitesh Jain
16

En su AndroidManifest.xml agregue este de dos líneas.

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

Ver esto debajo del código

    <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>
Aftab Alam
fuente
8

Si está utilizando com.google.android.gms: play-services-maps: 16.0.0 o inferior y su aplicación está orientada al nivel de API 28 (Android 9.0) o superior, debe incluir la siguiente declaración dentro del elemento de AndroidManifest. xml.

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

Esto se maneja por usted si está usando com.google.android.gms: play-services-maps: 16.1.0 y no es necesario si su aplicación está dirigida a un nivel API más bajo.

jeevashankar
fuente
5

En reaccionar nativo, tuve el error de no mostrar mapas y cerrar la aplicación, ejecutar adb logcat y mostrar el error dentro de la consola:

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

arreglarlo agregando dentro de androidManifest.xml

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Diego Santa Cruz Mendezú
fuente