java.lang.NoClassDefFoundError: risoluzione non riuscita di: Lorg / apache / http / ProtocolVersion


324

Ho riscontrato un tale errore quando utilizzo Android Studio 3.1 per creare un'app Android P, l'apk può essere creato, ma quando lo uso sull'emulatore Android P, si bloccherà e verrà visualizzato sotto le informazioni, maggiori dettagli vedi l'immagine .

java.lang.NoClassDefFoundError: risoluzione non riuscita di: Lorg / apache / http / ProtocolVersion

inserisci qui la descrizione dell'immagine

parte del mio build.gradle sotto il modulo App è sotto, qualcuno incontra questo? E dare qualche suggerimento? Grazie molto.

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'

        }

Risposte:


836

Aggiornamento: questo non è più un bug o una soluzione alternativa, è necessario se la tua app è indirizzata al livello API 28 (Android 9.0) o superiore e utilizza l'SDK di Google Maps per Android 16.0.0 o precedente (o se la tua app utilizza HTTP Apache Biblioteca legacy). Ora è incluso nei documenti ufficiali . Il problema pubblico è stato chiuso come comportamento previsto.

Questo è un bug sul lato dei servizi di Google Play, fino a quando non viene risolto, dovresti essere in grado di aggirare aggiungendo questo al tuo tag AndroidManifest.xmlinterno <application>:

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

84
Questa non è più una soluzione alternativa. Questo è il modo corretto ora developers.google.com/maps/documentation/android-sdk/…
— Kevin Robatel

@AdamK, Android 9 è al livello API 28. = P (non un bug dal lato server, ma sulla modifica del comportamento di P)
— Fung LAM

10
Qualcuno che non utilizza le mappe sperimenta anche questo?
— Robin Dijkhof,

2
Sì, puoi trovarti anche se usi la libreria Legacy HTTP di Apache (o una delle tue dipendenze lo fa).
— AdamK,

2
Sto usando la libreria Legacy HTTP di Apache e questo mi ha appena salvato. Grazie!
— Eric B.

55

Questo link android-9.0-changes-28 -> La deprecazione del client HTTP Apache spiega il motivo per aggiungere quanto segue al tuo AndroidManifest.xml:

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

Con Android 6.0, abbiamo rimosso il supporto per il client HTTP Apache. A partire da Android 9, quella libreria viene rimossa dal bootclasspath e non è disponibile per impostazione predefinita nelle app.


33

Effettuate una delle seguenti operazioni:

1- Aggiorna la libreria delle mappe dei servizi di gioco all'ultima versione:

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

2- Oppure includere la seguente dichiarazione all'interno <application>dell'elemento di AndroidManifest.xml.

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

3
Ancora una volta è un vero peccato per gli sviluppatori Android 9 e ovviamente per Google. Spero che rivedano l'implementazione e il comportamento di Android 9 in quanto ha molti bug. Sfortunatamente, Google insiste nel chiamare questi bug, i cambiamenti di comportamento!
— saeed khalafinejad,

20

Se usi Android 9.0 con un vaso legacy di quello che devi usare. nel tuo file mainfest.

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


17

Per eseguire org.apache.http.legacy perfettamente in Android 9.0 Pie creare un file 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>

E aggiungi 2 tag tag nel tuo 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>

Aggiungi anche il useLibrary 'org.apache.http.legacy'tuo livello di build dell'app

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

Sembra qualcosa che non dovresti fare quando intendi lanciare un'app al pubblico. Per lo sviluppo forse ha senso, ma poi non funzionerà ancora sulla produzione, quindi non ha senso.
— Maciej Pigulski,

Questa risposta dovrebbe essere accettata, ho provato molti modi ma non ho funzionato. Good Job @Gitesh
— Mitesh Jain,

16

Nel tuo AndroidManifest.xml aggiungi questo due righe.

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

Vedi questo sotto il codice

    <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

Se stai utilizzando com.google.android.gms: play-services-maps: 16.0.0 o versioni precedenti e la tua app è indirizzata al livello API 28 (Android 9.0) o versioni successive, devi includere la seguente dichiarazione nell'elemento di AndroidManifest. xml.

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

Questo viene gestito per te se stai utilizzando com.google.android.gms: play-services-maps: 16.1.0 e non è necessario se la tua app ha come target un livello API inferiore.


5

In reattivo nativo, ho avuto l'errore non mostrare le mappe e chiudere l'app, eseguire adb logcat e mostrare l'errore all'interno della console:

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

risolvilo aggiungendo all'interno di androidManifest.xml

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.