java.lang.RuntimeException:응용 프로그램을 인스턴스화 할 수 없습니다:ClassNotFoundException(X86 아키텍처 장치에서만)




명령어 집합 (3)

Stack Overflow에서 가장 많이 묻는 질문 중 하나 인 것 같지만 10 개 이상의 질문에서 20 개 이상의 솔루션을 시도하고 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. 응용 프로그램은 Motorola, Samsung S6, Samsung S7과 같은 비 x86 장치에서 정상적으로 작동합니다.
2. x86 아키텍처 장치에서 응용 프로그램 오류가 발생합니다.

내가 지금까지 시도한 것은 무엇인가?
1. Manifest, 패키지 등에서 패키지 이름을 검사합니다.
2. 전체 및 부분 패키지 이름을 매니페스트의 android:name 속성에 android:name 합니다.
3. utils 패키지에서 Application 클래스를 Main Package로 이동하려고 시도했습니다.

배경
1. 안드로이드 스튜디오를 설치할 때 - 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. 우분투 16.04
2. 업데이트 된 자바 8
3. Android Studio 2.2.2

수정 : 내가 문제를 일으킬 수 있다고 생각 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/')
    }
}

추신 : 매니페스트를 여러 번 확인해보고 문제가없는 것 같습니다. 어떤 Android 문서에서도이 예외의 가능한 원인을 찾을 수 없습니다.

업데이트 : 이 답변을 참조한 후 즉시 실행을 활성화해도 문제가 발생하지 않습니다. 그러나 debug.apk 통해 앱을 설치하면 같은 문제가 발생합니다.


응용 프로그램 클래스는 응용 프로그램을 extends MultiDexApplication 대신 extends MultiDexApplicationextends Application 해야합니다.

희망이 도움이됩니다.


이것은 잭 컴파일러와 MultiDex를 함께 사용할 때 알려진 문제 입니다. 이로 인해 Pre-Lollipop 기기에서 Pre-Marshmallow에서도 NoClassDefFoundError 가 발생합니다. 해결 방법은 잭 컴파일러를 비활성화하고 대신 RetroLambda 를 사용 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
        }
    }

}

토마스 선더랜드 (Thomas Sunderland)의 대답을 잊지 말아라. 나는 그것이이 해결책을 찾은 방법이기 때문이다.


이 오류의 원인 중 하나는 MultiDexApplication 때문입니다. 다른 종류의 라이브러리에서이 문제가 발생했습니다.

이 문제를 해결하려면 여러 Dex 파일을 처리해야합니다. 응용 프로그램 build.gradleApplication 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.

}

응용 프로그램에서 Application 클래스를 확장하는 경우 attachBaseContext () 메서드를 재정의하고 MultiDex.install (this)을 호출하여 multidex를 활성화 할 수 있습니다. 확장해야하는 Applicaiton 클래스를 사용하여 multipledex 파일 컨텍스트를 설치하려면

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

javaMaxHeapSize "4g" 우분투 시스템에서 오류가 발생하는 경우 2g 시도하십시오.

무엇이 있으면 알려줘.







x86