java.lang.RuntimeException: imansible creare un’istanza dell’applicazione: ClassNotFoundException (solo su dispositivo con architettura X86)

Questa sembra essere una delle domande più frequenti nello Stack Overflow, ma anche dopo aver provato più di 20 soluzioni da 10+ domande e riferendo i documenti Android, il mio problema non è stato risolto.

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 

Problema
1. L’app funziona perfettamente con dispositivi non x86 come Motorola, Samsung S6, Samsung S7
2. L’app lancia questo errore sui dispositivi di architettura x86.

Quello che ho provato fino ad ora
1. Ho incrociato i nomi dei pacchetti in Manifest, pacchetti, ecc.
2. Dare il nome del pacchetto completo e parziale ad android:name attributo android:name nel manifest.
3. Ho provato a spostare la class Application sul pacchetto principale dal pacchetto utils .

sfondo
1. Durante l’installazione di Android Studio – sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 lib32bz2-1.0 – tutto ha funzionato bene tranne lib32bz2-1.0 , ma non ha avuto problemi fino ad ora. (Non ho mai provato ad installare l’app sui dispositivi x86 in precedenza)
2. CompileSDKVersion – 25
3. BuildToolsVersion – 25.0.0
4. Versione Gradle – 2.2.2

Ambiente di lavoro
1. Ubuntu 16.04
2. Aggiornato JAVA 8
3. Android Studio 2.2.2

EDIT: parte di gradle (app) che penso possa causare il problema

 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/') } } 

PS ha incrociato il Manifest diverse volte e non sembra essere un problema. Non è stato ansible trovare alcuna causa ansible per questa anomalia in qualsiasi documento Android.

Aggiornamento: dopo aver fatto riferimento a questa risposta, l’esecuzione istantanea non causa il problema. Ma l’installazione dell’app tramite debug.apk sta dando lo stesso problema.

    Questo è un problema noto quando si usano insieme il jack-compilatore e MultiDex. Ciò causa NoClassDefFoundError sui dispositivi Pre-Lollipop, probabilmente anche su Pre-Marshmallow. La soluzione è disabilitare il compilatore di jack e utilizzare invece 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 } } } 

    Non dimenticare di revocare a Thomas Sunderland la sua risposta , perché è così che ho trovato questa soluzione.

    Uno dei motivi di questo errore è a causa di MultiDexApplication. Ho affrontato questo tipo di problema con qualche altra libreria

    Per risolvere questo è necessario gestire più file Dex. con l’aiuto dell’applicazione build.gradle e Application class

    sotto le modifiche richieste nel file build.gradle

     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. } 

    Intera 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. } 

    Se la tua app utilizza estende ApplicationClass, puoi sovrascrivere il metodo attachBaseContext () e chiamare MultiDex.install (this) per abilitare il multidex. Per installare il contesto di file multipledex utilizzando la class Applicaiton che dovrebbe estendersi

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

    javaMaxHeapSize "4g" prova con 2g se nel caso il sistema Ubuntu dovesse dare qualche errore.

    Fammi sapere se qualcosa

    La class dell’applicazione deve extends MultiDexApplication anziché extends Application .

    Spero che questo ti aiuti.