web-dev-qa-db-fra.com

NoClassDefFoundError pour OkHttpClient

Après avoir ajouté la dépendance à Facebook dans Gradle, j'obtiens cette erreur d'exécution:

     compile 'com.facebook.Android:facebook-Android-sdk:4.6.0'

Veuillez noter que j'utilise aussi okhttp: 

    compile 'com.squareup.okhttp:okhttp:2.5.0'

et le journal des erreurs est:

 E/AndroidRuntime: FATAL EXCEPTION: Thread-109754
     Process: com.venkat.project, PID: 4453
            Java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
            at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.Java:57)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:127)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:61)
            at Java.lang.Thread.run(Thread.Java:841)
02-23 18:11:02.729 4453-4573/com.venkat.project I/dalvikvm: Rejecting re-init on previously-failed class Lcom/squareup/okhttp/OkHttpClient; v=0x0

Remarque: je reçois cette erreur sur Samsung Mobile 4.4, mais sur l'émulateur et sur moto g 5.0, cela fonctionne.

11
Venkat

Vous obtenez

       Java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
        at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.Java:57)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:127)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:61)

NoClassDefFoundError pour OkHttpClient

public class NoClassDefFoundError extends LinkageError

Émis si la machine virtuelle Java ou une instance de ClassLoader essaie de load dans la définition d'une classe (dans le cadre d'un appel de méthode normal ou dans le cadre de la création d'une nouvelle instance à l'aide de la nouvelle expression) et no définition de la classe pourrait être trouvé.

Citation de NoClassDefFoundError

Tu devrais utiliser 

compile 'com.facebook.Android:facebook-Android-sdk:4.10.0'

Après cela, vous pouvez obtenir cette erreur fini avec une valeur de sortie non nulle 2

Ensuite 

defaultConfig {
    ...
    minSdkVersion 14 //lower than 14 doesn't support multidex
    targetSdkVersion //Yours

    // Enabling multidex support.
    multiDexEnabled true
}

dependencies {
 implementation 'com.Android.support:multidex:1.0.0'
}
  1. Ajouter multiDexEnabled true

  2. Appelez implementation'com.Android.support:multidex:1.0.2' 

OkHttp persévère lorsque le réseau est gênant: il restera silencieux récupérer des problèmes de connexion courants. Si votre service a plusieurs Adresses IP OkHttp va tenter d’autres adresses si le premier la connexion échoue. Cela est nécessaire pour IPv4 + IPv6 et pour les services hébergés dans les centres de données redondants.

Vous pouvez appeler la dernière version 

implementation'com.squareup.okhttp3:okhttp:3.2.0'

Ensuite

Clean and Re-Build & Sync Votre projet. J'espère que cela t'aides .

3
IntelliJ Amiya

La dernière version de Piccasso utilise une ancienne version de Okhttp, vous devez utiliser une nouvelle dépendance. 

compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.picasso:picasso:2.5.2'    
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'

Exemple:

File httpCacheDirectory = new File(getCacheDir(), "picasso-cache");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().cache(cache);
Picasso.Builder picassoBuilder = new Picasso.Builder(getApplicationContext());
picassoBuilder.downloader(new OkHttp3Downloader(clientBuilder.build()));
Picasso picasso = picassoBuilder.build();
try {
   Picasso.setSingletonInstance(picasso);
} catch (IllegalStateException ignored) {
  Log.e(LOG_TAG, "Picasso instance already used");
}
15
Benn Sandoval

Vous devez activer multidex pour résoudre ce problème.

Dans build.gradle

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }

defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        // Enabling multidex support.
        multiDexEnabled true
    }

    buildTypes {
        debug {
            shrinkResources true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {

    // Enabling multidex support.
    compile 'com.Android.support:multidex:1.0.1'
    //Other Libraries
}

Dans votre projet Application class

public class SampleApp extends Application {
    @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(base);
        }
}

Voici le lien officiel [ http://developer.Android.com/tools/building/multidex.html]

https://developer.Android.com/tools/building/multidex.html

Prise en charge Multidex pour Android 5.0 et versions ultérieures

Android 5.0 et versions ultérieures utilisent un environnement d'exécution appelé ART qui, en mode natif prend en charge le chargement de plusieurs fichiers dex à partir de fichiers d'application APK. ART effectue une pré-compilation au moment de l'installation de l'application qui recherche classes (.. N) .dex et les compile dans un seul fichier .oat pour exécution par l'appareil Android. Pour plus d'informations sur Android 5.0, voir Présentation de ART. Cela signifie que votre application fonctionnerait correctement au niveau 21 ou supérieur de l'API.

Prise en charge Multidex antérieure à Android 5.0

Les versions antérieures à Android 5.0 de la plate-forme utilisent le runtime Dalvik pour exécuter du code d'application. Par défaut, Dalvik limite les applications à un seul fichier bytecode classes.dex par APK. Afin de contourner cela limite, vous pouvez utiliser la bibliothèque de support multidex, qui devient partie du fichier DEX principal de votre application, puis gère l’accès à les fichiers DEX supplémentaires et le code qu'ils contiennent.

Essayez d'ajouter ceci

dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

Dans votre manifeste, ajoutez la classe MultiDexApplication de la bibliothèque de support multidex à l'élément application.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
    <application
        ...
        Android:name="Android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

Si votre application étend la classe Application, vous pouvez également remplacer la méthode attachBaseContext () et appeler MultiDex.install (this) pour activer multidex.

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

Enfin, vous devrez mettre à jour votre fichier build.gradle comme ci-dessous en ajoutant multiDexEnabled true:

defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  

J'espère que cela vous aidera.

0
sunil sunny

On dirait que vous avez activé proguard . Si vous n'avez pas besoin de proguard dans votre application, vous pouvez le désactiver dans votre build.gradle (app). 

debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }

Et si vous avez besoin de proguard dans votre application, suivez ceci link où M. Jake Wharton a résolu ce problème. 

0
Zohair