web-dev-qa-db-fra.com

java.lang.RuntimeException: impossible d'instancier l'application: ClassNotFoundException (uniquement sur le périphérique d'architecture X86)

Cela semble être l'une des questions les plus posées dans le débordement de pile, mais même après avoir essayé plus de 20 solutions parmi plus de 10 questions et renvoyé les documents Android Android, mon problème n'est pas résolu.

LogCat:

FATAL EXCEPTION: main
Process: com.some.app, PID: 22838
Java.lang.RuntimeException: Unable to instantiate application com.some.app.utils.Application: Java.lang.ClassNotFoundException: Didn't find class "com.some.app.utils.Application" on path: DexPathList[[Zip file "/data/app/com.some.app-1/base.apk"],nativeLibraryDirectories=[/data/app/com.some.app-1/lib/x86_64, /vendor/lib64, /system/lib64]]
    at Android.app.LoadedApk.makeApplication(LoadedApk.Java:563)
    at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4526)
    at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364)
    at Android.os.Handler.dispatchMessage(Handler.Java:102)
    at Android.os.Looper.loop(Looper.Java:135)
    at Android.app.ActivityThread.main(ActivityThread.Java:5254)
    at Java.lang.reflect.Method.invoke(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:372)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
    Caused by: Java.lang.ClassNotFoundException: Didn't find class "com.some.app.utils.Application" on path: DexPathList[[Zip file "/data/app/com.some.app-1/base.apk"],nativeLibraryDirectories=[/data/app/com.some.app-1/lib/x86_64, /vendor/lib64, /system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:511)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:469)
    at Android.app.Instrumentation.newApplication(Instrumentation.Java:980)
    at Android.app.LoadedApk.makeApplication(LoadedApk.Java:558)
    at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4526) 
    at Android.app.ActivityThread.access$1500(ActivityThread.Java:151) 
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364) 
    at Android.os.Handler.dispatchMessage(Handler.Java:102) 
    at Android.os.Looper.loop(Looper.Java:135) 
    at Android.app.ActivityThread.main(ActivityThread.Java:5254) 
    at Java.lang.reflect.Method.invoke(Native Method) 
    at Java.lang.reflect.Method.invoke(Method.Java:372) 
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903) 
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698) 
    Suppressed: Java.lang.ClassNotFoundException: com.some.app.utils.Application
    at Java.lang.Class.classForName(Native Method)
    at Java.lang.BootClassLoader.findClass(ClassLoader.Java:781)
    at Java.lang.BootClassLoader.loadClass(ClassLoader.Java:841)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:504)
    ... 13 more
    Caused by: Java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Problème
1. L'application fonctionne bien sur les appareils non x86 comme Motorola, Samsung S6, Samsung S7
2. L'application lance cette erreur sur les périphériques d'architecture x86.

Ce que j'ai essayé jusqu'à présent
1. Je recoupe les noms des packages dans Manifest, packages, etc.
2. A donné à la fois le nom de package complet et partiel au Android:name attribut dans le manifeste.
3. J'ai essayé de déplacer la classe Application vers le package principal à partir du package utils.

fond
1. Lors de l'installation de Android Studio - Sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 lib32bz2-1.0 - tout a bien fonctionné sauf lib32bz2-1.0, mais n'a eu aucun problème jusqu'à présent. (Jamais essayé d'installer l'application sur des appareils x86 plus tôt)
2. CompileSDKVersion - 25
3. BuildToolsVersion - 25.0.0
4. Version Gradle - 2.2.2

Environnement de travail
1. Ubuntu 16.04
2. Mise à jour Java 8
3. Android Studio 2.2.2

EDIT: une partie de gradle (app) qui, je pense, pourrait être à l'origine du problème

packagingOptions {
    exclude 'META-INF/NOTICE' // will not include NOTICE file
    exclude 'META-INF/LICENSE' // will not include LICENSE file
    exclude 'META-INF/notice'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license'
    exclude 'META-INF/license.txt'
}
sourceSets {
    main {
        Java.srcDirs = ['src/main/Java']
    }
    robolectric {
        Java.srcDir file('src/test/Java/')
    }
}

P.S. recoupé le manifeste plusieurs fois et ne semble pas avoir de problème avec cela. Impossible de trouver une cause possible à cette anomalie dans les documents Android aussi.

Mise à jour: après avoir fait référence à cette réponse l'activation de l'exécution instantanée ne cause pas le problème. Mais l'installation de l'application via debug.apk donne le même problème.

24
Mohammed Atif

Il s'agit d'un problème conn lorsque vous utilisez le jack-compiler et MultiDex ensemble. Cela provoque NoClassDefFoundError sur les appareils Pre-Lollipop, peut-être aussi sur Pre-Marshmallow. La solution consiste à désactiver le compilateur de jack et à utiliser à la place RetroLambda .

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.6.0'
    }
}
apply plugin: 'com.Android.application'
apply plugin: 'me.tatarka.retrolambda'

repositories {
   mavenCentral()
}

Android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'
    defaultConfig {
        applicationId "your.application.id"
        minSdkVersion 16
        targetSdkVersion 25
        multiDexEnabled true

        jackOptions {
            enabled false
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }

}

N'oubliez pas de voter Thomas Sunderland sa réponse , car c'est ainsi que j'ai trouvé cette solution.

8
Rockney

Votre classe d'application doit extends MultiDexApplication au lieu de extends Application.

J'espère que cela t'aides.

2
Ye Min Htut

L'une des raisons de cette erreur est due à MultiDexApplication. J'ai rencontré ce type de problème avec une autre bibliothèque

Pour résoudre ce problème, vous devez gérer plusieurs fichiers Dex. à l'aide de l'application build.gradle & Application class

ci-dessous les modifications requises dans build.gradle fichier

dexOptions {
        incremental true
        // here heap size give 4g(for ubuntu you can try with 2g) i got this thing from //https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }


dependencies {
     compile 'com.Android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}

Entier build.gradle

Android {
    signingConfigs {
        /*
        releasebuild {
            keyAlias 'hellotest'
            keyPassword 'hellotest'
            storeFile file('path to keystore')
            storePassword 'hellotest'
        }
        */
    }
    compileSdkVersion 'Google Inc.:Google APIs:22'
    buildToolsVersion '23.0.0'
    /* if you got error regarding duplicate file of  META-INF/LICENSE.txt from jar file
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
    */
    dexOptions {
        jumboMode = true
        incremental true
        // here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }
    defaultConfig {
        multiDexEnabled true
        applicationId "com.myapp.packagenme"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releasebuild
        }
        debug {
            signingConfig signingConfigs.releasebuild
        }
    }
}

dependencies {
     compile 'com.Android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}

Si votre application utilise étend la classe d'application, vous pouvez remplacer la méthode attachBaseContext () et appeler MultiDex.install (this) pour activer le multidex. Pour installer le contexte du fichier multipledex en utilisant la classe Applicaiton qui devrait étendre

public class MyAppClass extends MultiDexApplication{
@Override
    protected void attachBaseContext(Context newBase) {
        MultiDex.install(newBase);
        super.attachBaseContext(newBase);
    }
}

javaMaxHeapSize "4g" essayez avec 2g si dans le cas où le système ubuntu donnerait une erreur.

Faites-moi savoir si quelque chose

1
user1140237