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.