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.
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.
Votre classe d'application doit extends MultiDexApplication
au lieu de extends Application
.
J'espère que cela t'aides.
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