java.lang.NoClassDefFoundError: échec de la résolution de: Lorg / apache / http / ProtocolVersion

324

J'ai rencontré une telle erreur lorsque j'utilise Android studio 3.1 pour créer une application Android P, l'apk peut être créé, mais lorsque je l'utilise sur l'émulateur Android P, il se plantera et affichera des informations ci-dessous, plus de détails voir la photo .

java.lang.NoClassDefFoundError: échec de la résolution de: Lorg / apache / http / ProtocolVersion

entrez la description de l'image ici

une partie de mon build.gradle sous le module App est ci-dessous, quelqu'un rencontre-t-il cela? Et donne quelques suggestions? Merci beaucoup.

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
la source

Réponses:

836

Mise à jour: il ne s'agit plus d'un bogue ou d'une solution de contournement, elle est requise si votre application cible l'API niveau 28 (Android 9.0) ou supérieur et utilise le SDK Google Maps pour Android 16.0.0 ou inférieur (ou si votre application utilise Apache HTTP Bibliothèque héritée). Il est désormais inclus dans les documents officiels . Le problème public a été fermé en tant que comportement souhaité.

Il s'agit d'un bug du côté des services Google Play, jusqu'à ce qu'il soit corrigé, vous devriez pouvoir contourner ce problème en l'ajoutant à l' AndroidManifest.xmlintérieur de la <application>balise:

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
la source
84
Ce n'est plus une solution de contournement. C'est la bonne façon maintenant developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel
@AdamK, Android 9 est au niveau d'API 28. = P (pas un bug du côté serveur, mais sur le changement de comportement de P)
Fung LAM
10
Quelqu'un n'utilise-t-il pas les cartes également?
Robin Dijkhof
2
Oui, vous pouvez également l'exécuter si vous utilisez la bibliothèque Apache HTTP Legacy (ou l'une de vos dépendances).
AdamK
2
J'utilise la bibliothèque Apache HTTP Legacy et cela vient de me sauver. Je vous remercie!
Eric B.
55

Ce lien android-9.0-changes-28 -> Obsolescence du client Apache HTTP explique la raison d'ajouter les éléments suivants à votre AndroidManifest.xml:

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

Avec Android 6.0, nous avons supprimé la prise en charge du client HTTP Apache. À partir d'Android 9, cette bibliothèque est supprimée du bootclasspath et n'est pas disponible par défaut pour les applications.

pradip tilala
la source
33

Effectuez l'une des opérations suivantes:

1- Mettre à jour les play-services-maps bibliothèque vers la dernière version:

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

2- Ou inclure la déclaration suivante dans l' <application>élément de AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
la source
3
Encore une fois, c'est une grande honte pour les développeurs d'Android 9 et bien sûr pour Google. J'espère qu'ils révisent l'implémentation et le comportement d'Android 9 car il contient de nombreux bugs. Malheureusement, Google insiste pour appeler ces bogues, des changements de comportement!
saeed khalafinejad
20

Si vous utilisez Android 9.0 avec un pot hérité, vous devez utiliser. dans votre fichier mainfest.

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

Suresh Kumar
la source
17

Pour exécuter org.apache.http.legacy parfaitement dans Android 9.0 Pie, créez un fichier 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>

Et ajoutez 2 balises tag dans votre 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>

Ajoutez également useLibrary 'org.apache.http.legacy'votre gradle de construction d'application

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
la source
Cela ressemble à quelque chose que vous ne devriez pas faire lorsque vous avez l'intention de lancer une application au public. Pour le développement, cela a peut-être du sens, mais cela ne fonctionnera pas encore sur la production, donc cela n'a aucun sens.
Maciej Pigulski
Cette réponse doit être acceptée, j'ai essayé de nombreuses façons, mais je n'ai pas travaillé. Good Job @Gitesh
Mitesh Jain
16

Dans votre AndroidManifest.xml, ajoutez ces deux lignes.

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

Voir ce code ci-dessous

    <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
la source
9

Si vous utilisez com.google.android.gms:play-services-maps:16.0.0ou en dessous et que votre application cible le niveau d'API 28 (Android 9.0) ou supérieur, vous devez inclure la déclaration suivante dans l'élément d'AndroidManifest.xml

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

Vérifiez ce lien - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Gideon Kitili
la source
8

Si vous utilisez com.google.android.gms: play-services-maps: 16.0.0 ou inférieur et que votre application cible le niveau API 28 (Android 9.0) ou supérieur, vous devez inclure la déclaration suivante dans l'élément d'AndroidManifest. xml.

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

Ceci est géré pour vous si vous utilisez com.google.android.gms: play-services-maps: 16.1.0 et n'est pas nécessaire si votre application cible un niveau d'API inférieur.

jeevashankar
la source
5

Dans React Native, j'ai eu l'erreur de ne pas afficher les cartes et de fermer l'application, d'exécuter adb logcat et d'afficher l'erreur dans la console:

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

corrigez-le en ajoutant dans androidManifest.xml

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Diego Santa Cruz Mendezú
la source