web-dev-qa-db-fra.com

NoClassDefFoundError avec Android Studio sur Android 4

Je suis en train de convertir une application existante d'Eclipse en Android Studio. Cependant, lorsque je l'exécute sur un périphérique sous 4.x (j'ai testé plusieurs versions sur des émulateurs), il se bloque immédiatement avec une NoClassDefFoundError.

J'ai essayé de commenter les références aux classes qu'il ne peut pas trouver, mais il y en a toujours une autre. Autant que l'on puisse en juger, la classe fautive est toujours

  1. Dans mon propre code
  2. Une classe intérieure ( Mise à jour: Avec plus d'investigation, celle-ci n'est pas toujours vraie)

Tout fonctionne bien sur un émulateur 5.0.1 (je n'ai pas de périphérique à tester). Mon fichier build.gradle est assez long, mais ressemble à ceci:

apply plugin: 'com.Android.application'
apply plugin: 'Android-apt'

def AAVersion = "2.7.1"

Android {
    compileSdkVersion 19
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.myapp.Android"
        minSdkVersion 8
        targetSdkVersion 19
        multiDexEnabled = true
    }

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

    packagingOptions {
        *snip*
    }
}

buildscript {
    repositories {
        mavenCentral()

    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.0.0'
        classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.4'
    }
}

repositories {
    maven {
        url "https://repo.commonsware.com.s3.amazonaws.com"
    }
}

apt {
    arguments {
        androidManifestFile variant.outputs[0].processResources.manifestFile
        resourcePackageName 'com.pact.Android'
    }
}

dependencies {
    *snip compile project(':...') declarations

    apt "com.googlecode.androidannotations:androidannotations:$AAVersion"
    compile "com.googlecode.androidannotations:androidannotations-api:$AAVersion"

    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile 'com.Android.support:support-v4:21.0.3'
    compile 'com.google.Android.gms:play-services:3.1.36'

    *snip many more compile declarations*

    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Quelques exemples de classes qui posent problème:

  • Une classe anonyme qui implémente une interface dans la bibliothèque facebook (en tant que projet de bibliothèque)
  • Parcelable.CREATOR implémentations dans mes modèles
  • Une classe interne qui étend Android.os.Library
  • Une classe interne dans mon propre code
  • Une classe qui implémente une interface dans une bibliothèque de maven

Quel est le problème, et comment puis-je résoudre ce problème?

41
karl

J'étais en train de mettre en œuvre de manière incomplète le support MultiDex, de sorte que certaines de mes classes n'étaient pas dans le fichier dex approprié. Pour résoudre ce problème, vous devez faire plus que simplement définir multiDexEnabled = true dans votre bloc defaultConfig. Vous devez également:

  1. Inclure compile 'com.Android.support:multidex:1.0.1' dans vos dépendances
  2. Demandez à votre classe d’application d’étendre MultiDexApplication au lieu de Application. Vous pouvez également appeler MultiDex.install() dans attachBaseContext() de votre application.

Voir https://developer.Android.com/tools/building/multidex.html pour plus de détails.

116
karl

1) Ajoutez multiDexEnabled = true dans votre configuration par défaut

2) Ajoutez la compilation com.Android.support:multidex:1.0.0 dans vos dépendances

3) Application class extend MultiDexApplication au lieu de Application

10
Mahendra Tejaswi

J'ai eu le même problème, j'ai essayé toutes les solutions suggérées sur StackOverflow mais elles n'ont pas fonctionné dans mon cas.
Après cela, j’ai découvert l’une des bibliothèques compilées par Java 8. Par conséquent, j’ai également besoin d’activer Java 8 dans mon projet.

  Android {
    //...
    compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
    }
  }

Plusieurs raisons expliquent cette erreur. J'espère que ça aide.

0
Quang Nguyen

1) ajoutez multiDexEnabled = true dans votre defaultConfig dans build.gradle. 

2) Vous devez également inclure compiler 'com.Android.support:multidex:1.0.1'

3) ajoutez ce qui suit à votre balise "application" dans votre manifeste:

Android: name = "Android.support.multidex.MultiDexApplication"

son travail avec moi, espérons que l'aide

0
Broaa Anshasi

J'ai aussi le problème d'être résolu après avoir suivi les étapes suivantes

1) ajoutez multiDexEnabled = true dans votre defaultConfig dans build.gradle.

2) Vous devez également inclure Compiler com.Android.support:multidex:1.0.1

3) ajoutez ce qui suit à votre balise "application" dans votre manifeste:

Android:name="Android.support.multidex.MultiDexApplication"
0
arshad abbas

Dans mon cas, c’était Kotlin car chaque cause était une exception . Plus d’informations ici: Java.lang.NoClassDefFoundError $$ inline $ forEach $ lambda $ 1 dans Kotlin

0
Murat

J'ai résolu le problème en supprimant multiDexEnabled = true dans mon cas.

0
HarshitG