java.lang.NoClassDefFoundError: Fehlgeschlagene Auflösung von: Lorg / apache / http / ProtocolVersion

323

Ich habe einen solchen Fehler festgestellt, als ich Android Studio 3.1 zum Erstellen einer Android P-App verwende. Die Apk kann erstellt werden. Wenn ich sie jedoch auf dem Android P-Emulator verwende, stürzt sie ab und wirft die folgenden Informationen auf. Weitere Details finden Sie auf dem Bild .

java.lang.NoClassDefFoundError: Fehlgeschlagene Auflösung von: Lorg / apache / http / ProtocolVersion

Geben Sie hier die Bildbeschreibung ein

Ein Teil meines build.gradle unter App-Moduls ist unten, jemand trifft dies? Und geben Sie einen Vorschlag? Danke vielmals.

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
quelle

Antworten:

833

Update: Dies ist kein Fehler oder eine Problemumgehung mehr. Sie ist erforderlich, wenn Ihre App auf API Level 28 (Android 9.0) oder höher abzielt und das Google Maps SDK für Android 16.0.0 oder niedriger verwendet (oder wenn Ihre App Apache HTTP verwendet Legacy-Bibliothek). Es ist jetzt in den offiziellen Dokumenten enthalten . Die öffentliche Ausgabe wurde als beabsichtigtes Verhalten geschlossen .

Dies ist ein Fehler auf der Google Play - Dienste Seite, bis es behoben ist, sollten Sie , indem Sie diesen in Ihre zu umgehen können, AndroidManifest.xmldie innerhalb <application>tag:

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
quelle
83
Dies ist keine Problemumgehung mehr. Dies ist jetzt der richtige Weg. Developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel
@AdamK, Android 9 ist API-Level 28. = P (kein Fehler von der Serverseite, aber über P Verhaltensänderung)
Fung LAM
10
Wer verwendet nicht auch Karten, bei denen dies auftritt?
Robin Dijkhof
2
Ja, Sie können auch darauf stoßen, wenn Sie die Apache HTTP Legacy-Bibliothek verwenden (oder eine Ihrer Abhängigkeiten).
AdamK
2
Ich verwende die Apache HTTP Legacy-Bibliothek und das hat mich gerade gerettet. Vielen Dank!
Eric B.
55

Dieser Link android-9.0- changers -28 -> Apache HTTP-Client-Ablehnung erklärt den Grund für das Hinzufügen der folgenden Elemente zu Ihrer AndroidManifest.xml:

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

Mit Android 6.0 haben wir die Unterstützung für den Apache HTTP-Client entfernt. Ab Android 9 wird diese Bibliothek aus dem Bootklassenpfad entfernt und steht Apps standardmäßig nicht zur Verfügung.

Pradip Tilala
quelle
33

Führen Sie einen der folgenden Schritte aus:

1- Aktualisieren Sie die Play-Services-Maps- Bibliothek auf die neueste Version:

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

2- Oder fügen Sie die folgende Erklärung in das <application>Element von ein AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
quelle
3
Wieder ist es eine große Schande für Android 9-Entwickler und natürlich für Google. Ich hoffe, sie überarbeiten die Implementierung und das Verhalten von Android 9, da es viele Fehler gibt. Leider besteht Google darauf, diese Fehler zu melden, Verhaltensänderungen!
Saeed Khalafinejad
20

Wenn Sie Android 9.0 mit Legacy-JAR verwenden, müssen Sie es verwenden. in Ihrer Mainfest-Datei.

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

Suresh Kumar
quelle
17

Um org.apache.http.legacy in Android 9.0 Pie perfekt auszuführen, erstellen Sie eine XML-Datei 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>

Und fügen Sie 2 Tags in Ihre AndroidManifest.xml ein

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'Fügen Sie auch in Ihrer App Build Gradle hinzu

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
quelle
Dies scheint etwas zu sein, das Sie nicht tun sollten, wenn Sie beabsichtigen, eine App für die Öffentlichkeit zu starten. Für die Entwicklung macht es vielleicht Sinn, aber dann funktioniert es in der Produktion immer noch nicht, also macht das keinen Sinn.
Maciej Pigulski
Diese Antwort sollte akzeptiert werden. Ich habe viele Möglichkeiten ausprobiert, aber keine funktioniert. Gute Arbeit @Gitesh
Mitesh Jain
16

Fügen Sie in Ihrer AndroidManifest.xml diese zweizeilige Zeile hinzu.

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

Siehe diesen Code unten

    <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
quelle
9

Wenn Sie com.google.android.gms:play-services-maps:16.0.0oder weniger verwenden und Ihre App auf API-Level 28 (Android 9.0) oder höher abzielt, müssen Sie die folgende Deklaration in das Element von AndroidManifest.xml aufnehmen

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

Überprüfen Sie diesen Link - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Gideon Kitili
quelle
8

Wenn Sie com.google.android.gms: play-services-maps: 16.0.0 oder niedriger verwenden und Ihre App auf API-Level 28 (Android 9.0) oder höher abzielt, müssen Sie die folgende Deklaration in das Element von AndroidManifest aufnehmen. xml.

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

Dies wird für Sie erledigt, wenn Sie com.google.android.gms: play-services-maps: 16.1.0 verwenden. Dies ist nicht erforderlich, wenn Ihre App auf eine niedrigere API-Ebene abzielt.

Jeevashankar
quelle
5

In React Native hatte ich den Fehler, keine Karten anzuzeigen und App zu schließen, adb logcat auszuführen und Fehler in der Konsole anzuzeigen:

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

Beheben Sie das Problem, indem Sie es in androidManifest.xml hinzufügen

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Diego Santa Cruz Mendezú
quelle
Ich habe Ihre Lösung verwendet und es hat funktioniert.
kPieczonka