Подтвердить что ты не робот

Java.lang.RuntimeException: Невозможно создать экземпляр приложения: ClassNotFoundException (только на устройстве архитектуры X86)

Это, по-видимому, один из самых высоких вопросов в переполнении стека, но даже после того, как вы попробовали более 20 решений из 10 + вопросов и обратились к Android-документам, моя проблема не решена.

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

Проблема
1. Приложение работает отлично в устройствах, отличных от x86, таких как Motorola, Samsung S6, Samsung S7
2. Приложение бросает эту ошибку на устройства архитектуры x86.

То, что я пробовал до сих пор
1. Я пересекаю проверенные имена пакетов в манифесте, пакетах и ​​т.д.
2. Дал полное и частичное имя пакета атрибуту android:name в манифесте.
3. Попробовал переместить класс Application в Основной пакет из пакета utils.

фон
1. При установке Android Studio - sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 lib32bz2-1.0 - все работало отлично, кроме lib32bz2-1.0, но до сих пор не было никаких проблем. (Никогда ранее не пытались установить приложение на устройствах x86)
2. CompileSDKVersion - 25
3. BuildToolsVersion - 25.0.0
4. Gradle версия - 2.2.2

Рабочая среда
1. Ubuntu 16.04
2. Обновленный JAVA 8
3. Android Studio 2.2.2

EDIT: часть Gradle (приложение), которая, как я думаю, может вызвать проблему

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. перекрестный проверил манифест несколько раз и, похоже, не проблема. Не удалось найти возможную причину этой аномалии в любых документах Android.

Обновление: после ссылки на этот ответ, обеспечивающий мгновенный запуск, не вызывает проблемы. Но установка приложения через debug.apk дает ту же проблему.

4b9b3361

Ответ 1

Это известная проблема при совместном использовании jack-компилятора и MultiDex. Это вызывает NoClassDefFoundError на устройствах Pre-Lollipop, возможно, на Pre-Marshmallow. Решение состоит в том, чтобы отключить jack-компилятор и вместо этого использовать 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
        }
    }

}

Не забывайте поднимать Томаса Сандерленда на свой ответ, потому что именно так я нашел это решение.

Ответ 2

Одна из причин этой ошибки связана с MultiDexApplication. У меня есть такая проблема с какой-то другой библиотекой

Чтобы решить, что вам нужно обрабатывать файл с несколькими Dex. с помощью приложения build.gradle и Application class

ниже изменений, которые требуются в файле 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.

}

Целый 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.

}

Если ваше приложение использует расширение Applicationclass, вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this), чтобы включить multidex. Установить контекст файла multipledex, используя класс Applicaiton, который должен расширять

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

javaMaxHeapSize "4g" попробуйте 2g, если в случае ошибки системы ubuntu.

Сообщите мне, если что-нибудь

Ответ 3

Ваш класс приложения должен extends MultiDexApplication вместо extends Application.

Надеюсь, что это поможет.