web-dev-qa-db-fra.com

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

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

Java.lang.NoClassDefFoundError: échec de la résolution de: Lorg/Apache/http/ProtocolVersion

enter image description here

une partie de mon build.gradle sous le module App est ci-dessous, tout le monde le rencontre? 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'

        }
239
dukeking

Mise à jour: il ne s'agit plus d'un bogue, ni d'une solution de contournement; il est obligatoire si votre application cible l'API de 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 la bibliothèque Apache HTTP Legacy). Il est maintenant inclus dans le document officiel . Le problème public a été fermé comme comportement prévu.

Ceci est un bug du côté des services Google Play. Jusqu'à ce que cela soit corrigé, vous devriez pouvoir contourner le problème en ajoutant ceci à votre AndroidManifest.xml à l'intérieur de la balise <application>:

<uses-library Android:name="org.Apache.http.legacy" Android:required="false" />
637
AdamK

Ce lien Android-9.0-changes-28 -> Déprécation du client HTTP Apache explique la raison de l'ajout suivant à votre fichier 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 de Android 9, cette bibliothèque est supprimée du chemin d'accès au bootclasspath et n'est pas disponible par défaut pour les applications.

36
pradip tilala

Faites l'une des choses suivantes:

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

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

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

<uses-library
      Android:name="org.Apache.http.legacy"
      Android:required="false" />
21
Darush

Il est également signalé dans le suivi de bogues Android: https://issuetracker.google.com/issues/79478779

14
Benoit

Pour exécuter org.Apache.http.legacy parfaitement dans Android 9.0 Pie créer 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: nom = "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' dans le niveau de construction de votre 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'
}
11
Gitesh

Si vous utilisez com.google.Android.gms: play-services-maps: 16.0.0 ou une version inférieure et que votre application cible un niveau API de 28 (Android 9.0) ou une version ultérieure, vous devez inclure la déclaration suivante dans l'élément 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.

3
jeevashankar

Selon this SO answer , cela est dû à un bogue du SDK AWS qui semble être résolu dans la version 2.6.30 du SDK , donc la mise à jour la version à une plus récente, peut vous aider à résoudre le problème.

0
Carlos Daniel

Si vous utilisez Android 9.0 avec l’ancien fichier jAR, il vous faudra l’utiliser. dans votre fichier mainfest.

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

0
Suresh kumar