java.lang.NoClassDefFoundError: nieudane rozwiązanie: Lorg / apache / http / ProtocolVersion

324

Zetknąłem się z takim błędem, gdy używam Androida Studio 3.1 do zbudowania aplikacji dla Androida P, można wykonać apk, ale kiedy użyję go na emulatorze Androida P, zawiesi się i wyrzuci poniżej informacji, więcej szczegółów zobacz zdjęcie .

java.lang.NoClassDefFoundError: nieudane rozwiązanie: Lorg / apache / http / ProtocolVersion

wprowadź opis zdjęcia tutaj

część mojego build.gradle pod modułem aplikacji jest poniżej, czy ktoś to spełnia? I daj trochę sugestii? Wielkie dzięki.

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
źródło

Odpowiedzi:

836

Aktualizacja: nie jest to już błąd ani obejście, jest wymagane, jeśli aplikacja jest kierowana na interfejs API na poziomie 28 (Android 9.0) lub nowszym i używa zestawu Google Maps SDK dla Androida 16.0.0 lub niższego (lub jeśli aplikacja korzysta z Apache HTTP Starsza biblioteka). Jest teraz zawarty w oficjalnych dokumentach . Problem publiczny został zamknięty jako zamierzone zachowanie.

Jest to błąd na stronie Google Play, dopóki nie zostanie ustalone, powinny być w stanie obejść dodając to do AndroidManifest.xmlWewnątrz <application>znacznika:

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
źródło
84
To już nie jest obejście. To jest właściwy sposób teraz developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel
@AdamK, Android 9 ma poziom API 28. = P (nie błąd z serwera, ale o zmianie zachowania P)
Fung LAM
10
Czy ktoś też nie korzysta z map, które tego doświadczają?
Robin Dijkhof,
2
Tak, możesz na nią również natknąć, jeśli korzystasz z biblioteki Apache HTTP Legacy (lub jednej z twoich zależności).
AdamK
2
Korzystam z biblioteki Apache HTTP Legacy i właśnie mnie to uratowało. Dziękuję Ci!
Eric B.,
55

Ten link android-9.0-zmiany-28 -> Wycofanie klienta HTTP Apache wyjaśnia powód dodania następujących elementów do pliku AndroidManifest.xml:

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

W Androidzie 6.0 usunęliśmy obsługę klienta HTTP Apache. Począwszy od systemu Android 9, biblioteka ta jest usuwana ze ścieżki rozruchowej i domyślnie nie jest dostępna dla aplikacji.

pradip tilala
źródło
33

Wykonaj jedną z następujących czynności:

1- Zaktualizuj bibliotekę Play-Services-Maps do najnowszej wersji:

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

2- Lub dołącz następującą deklarację do <application>elementu AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
źródło
3
Znowu to wielka szkoda dla programistów Androida 9 i oczywiście dla Google. Mam nadzieję, że poprawią implementację i zachowanie Androida 9, ponieważ zawiera wiele błędów. Niestety Google nalega na nazwanie tych błędów, zmiany w zachowaniu!
saeed khalafinejad
20

Jeśli używasz Androida 9.0 ze starszym słojem, musisz go użyć. w twoim pliku mainfest.

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

Suresh Kumar
źródło
17

Aby perfekcyjnie uruchomić org.apache.http.legacy w systemie Android 9.0 Pie, utwórz plik 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>

I dodaj tag 2 tagi w pliku 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>

Dodaj także useLibrary 'org.apache.http.legacy'stopień kompilacji aplikacji

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
źródło
Wygląda na to, że nie powinieneś robić, gdy zamierzasz uruchomić aplikację publicznie. Dla rozwoju może to ma sens, ale wtedy nie będzie działać na produkcji, więc nie ma to sensu.
Maciej Pigulski
Ta odpowiedź powinna zostać zaakceptowana. Próbowałem na wiele sposobów, ale nie działałem. Dobra robota @Gitesh
Mitesh Jain
16

W pliku AndroidManifest.xml dodaj ten dwuliniowy.

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

Zobacz poniższy kod

    <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
źródło
9

Jeśli używasz com.google.android.gms:play-services-maps:16.0.0lub poniżej, a aplikacja jest kierowana na interfejs API na poziomie 28 (Android 9.0) lub nowszy, musisz dołączyć następującą deklarację w elemencie AndroidManifest.xml

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

Sprawdź ten link - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Gideon Kitili
źródło
8

Jeśli korzystasz z com.google.android.gms: play-services-maps: 16.0.0 lub niższej, a Twoja aplikacja jest ukierunkowana na interfejs API na poziomie 28 (Android 9.0) lub wyższy, musisz dołączyć następującą deklarację w elemencie AndroidManifest. xml.

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

Jest to obsługiwane, jeśli korzystasz z com.google.android.gms: play-services-maps: 16.1.0 i nie jest to konieczne, jeśli aplikacja jest kierowana na niższy poziom interfejsu API.

jeevashankar
źródło
5

W React Native miałem błąd, aby nie wyświetlać map i zamykać aplikacji, uruchamiać adb logcat i pokazywać błąd w konsoli:

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

napraw to, dodając w pliku androidManifest.xml

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Diego Santa Cruz Mendezú
źródło