无法实例化应用程序:java.lang.ClassNotFoundException

6
问题出现在以下情况下:
  • 我从Android Studio运行应用程序,应用程序正常运行

    然后我删除了该应用程序,并尝试安装来自.../app/build/outputs/apk/debug.apk的debug.apk文件

我的操作系统是Ubuntu 16.04, oracle jdk

但在Windows 7上一切正常(可以从.../app/build/outputs/apk/debug.apk安装apk并正常运行)

出现以下错误:

FATAL EXCEPTION: main
Process: com.example, PID: 21084
java.lang.RuntimeException: Unable to instantiate application com.example.MyApp: java.lang.ClassNotFoundException: Didn't find class "com.example.MyApp" on path: DexPathList[[zip file "/data/app/com.example-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example-1/lib/arm, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:676)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6289)
at android.app.ActivityThread.access$1800(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1860)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.MyApp" on path: DexPathList[[zip file "/data/app/com.example-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example-1/lib/arm, /vendor/lib, /system/lib]]
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:1004)
at android.app.LoadedApk.makeApplication(LoadedApk.java:666)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6289) 
at android.app.ActivityThread.access$1800(ActivityThread.java:221) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1860) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7224) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Suppressed: java.lang.ClassNotFoundException: com.example.MyApp
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)
        ... 12 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

我的Gradle:

    apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'io.fabric'
apply plugin: 'android-apt'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

defaultConfig {
    applicationId "com.example"
    minSdkVersion 19
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"

    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    jackOptions {
        enabled false
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

dexOptions {
    javaMaxHeapSize "8g"
    jumboMode = true
    preDexLibraries = false
}

signingConfigs {
    //release
    release {
        storeFile file("/keys/apk_key.jks")
        storePassword "apk_key"
        keyAlias "apk_key"
        keyPassword "apk_key"
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        debuggable false
    }
    debug {
        signingConfig signingConfigs.release
        debuggable true
    }
}

dexOptions {
    javaMaxHeapSize "3G"
}

packagingOptions {
    exclude 'LICENSE.txt'
    exclude 'mockito-extensions/org.mockito.plugins.MockMaker'
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
}

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

我也尝试了以下操作:

  • 使缓存失效/重启

  • 清理项目

  • 重新构建项目


重建应用程序。 - HaroldSer
4
尝试取消勾选即时运行。 - Dileep Patel
1
你使用的是Oracle JDK还是Open JDK? - harsha kumar Reddy
1
@DileepPatel 谢谢,问题已解决,我讨厌这个即时运行功能!! - NickUnuchek
@Nick Unuchek您好,您是如何解决这个问题的?我尝试了下面的解决方案,但对我没有用,请帮帮我。在版本5.0、6.0中它可以工作,在Kitkat版本4.4中它不能工作。 - demo
@Mariyappan 这是另一个问题,你的 minSdkVersion 是否在 ...app/build.gradle 文件中设置为19? - NickUnuchek
7个回答

10

感谢 @Dileep Patel 我遇到了同样的问题。如果应用是通过 Android Studio 安装的,则正常工作;如果通过 adb 命令安装,则会崩溃。在我的情况下,无效的缓存/重启和禁用即时运行(Android Studio->首选项->即时运行,取消选中“启用即时运行”)解决了问题。


4
在应用级别的gradle中增加multidex。
compile 'com.android.support:multidex:1.0.1'

启用多dex

 defaultConfig {
 multiDexEnabled true
}

Last add this code inside application class

 @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

MultiDex.install(this)解决了问题。在https://developer.android.com/studio/build/multidex.html上有一个很好的说明,介绍如何为您的Android项目启用Multidex。我建议您不要在您的Application-Context中重写#attachBaseContext(),而是从MultiDexApplication扩展而来,这样MultiDexApplication已经用MultiDex.install(this)调用了#attachBaseContext()方法。 - Danny

1
我想说,我知道这很愚蠢,而且我知道这个问题已经有答案了,但是我改变了我的App类的名称,并忘记在清单中更改它,出于某种原因,应用程序仍然构建成功。无论如何,请确保在项目的清单中拥有正确的应用程序类名称:
    <application
    android:name=".CorrectAppClassHere"
        //...

1
不是因为愚蠢,很可能是这个原因。如果您的应用程序的名称属性存在错误或者缺失,该应用程序仍将编译!异常信息显示类加载器无法找到该类。它要么不存在,要么名称错误。即使我已经禁用了即时运行,这种情况也发生在我身上。 - Droid Teahouse

0

如果您有一个API级别高于20的测试设备,您可以将minSdkVersion更改为21,而不是添加multidex,因为API级别在20及以上已经包含了multidex。


0

我之前尝试过一种解决清单中应用程序名称问题的方法,因此我在应用程序gradle中添加了这行代码manifestPlaceholders = [applicationName: "com.tech.turitos"]。然而,它既没有解决我的问题,也让我忘记删除它,所以当我删除它时,就会出现这个错误。不过,一旦我删除了它,应用程序就正常工作了。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
将这段代码添加到gradle中对我很有帮助。
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

-1
<application
            android:name=".App"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">

在您的清单(manifest)文件中将allowBackup更改为false, 然后运行应用程序,您将收到异常。 然后将其改回true,这将完全解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接