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.