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'

        }

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" />

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.


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" />

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"/>


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

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>



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.


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" />

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.