dex 文件不包含 MainActivity class

dex file does not contain MainActivity class

运行我的应用程序出现以下错误:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.name.app/com.name.app.MainActivity}: 
java.lang.ClassNotFoundException: Didn't find class "com.name.app.MainActivity" on path: 
    DexPathList[[zip file "/data/app/com.name.app-2/base.apk"],
        nativeLibraryDirectories=[/vendor/lib, /system/lib]]

我已经使用 Android Studio apk 分析器(构建 > 分析 APK)来分析我的 apk (app/build/outputs/apk/debug/app-debug.apk),classes.dex 的结构是

java/
    lang/*
    util/*
    io/*
com/google/devtools/build/...

我注意到我自己的 classes 和 MainActivity 都不见了。 据我了解 dex 文件(来自 this SO 问题)我自己的 classes 也应该在那里。 由于它们不在那里,我明白了为什么我会收到找不到 class 的错误消息。

我在自己的设备上遇到此错误:Samsung、Lollipop 5.0.2、API 21,在虚拟设备上:Google Pixel、Oreo 8.0.0、API 26.

我试过的

我用谷歌搜索并找到了多个建议,但其中 none 个对我有用。 这些建议是:

将以下内容添加到 build.gradle

dexOptions {
    preDexLibraries false
}

启用 multidex 会出现类似的错误:

java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: 
java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: 
    DexPathList[...]

以下是启用 multidex 的补充。

build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

清单(仅相关部分)

<application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
</application>

备注 还有另一个与图书馆相关的建议,请参阅 答案。 但是,这是针对 Eclipse 的,我不确定它是否可以解决我的问题。 Gradle 应该处理所有的依赖关系,对吧? 为了以防万一,以下是我在 Gradle(Kotlin 版本 1.2.51)中列出所有依赖项的方式:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-simplexml:2.3.0'
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

    testImplementation 'org.junit.platform:junit-platform-engine:1.2.0'
    testImplementation 'org.jetbrains.spek:spek-api:1.1.5'
    testImplementation 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
}

更新

我正在使用 Android Studio 3.1.3。我尝试使用另一台笔记本电脑 运行 我的应用程序(通过版本控制,使用 Android Studio 3.1.3),但没有出现错误。由于文件完全相同,我怀疑我的 Android Studio 设置有问题。

删除 Android Studio 及其所有设置,然后从 here 下载并安装 Android Studio 没有解决问题。

我的文件夹结构是

.gradle/
.idea/
app/
    build/
    src/main
        gen/
        java/
        res/
build/
gradle/

gen 文件夹不应该在这里。 此文件夹包含生成的文件,如 R.java。 这些文件也在 app/build/generated/source/* 中(但正确)。 只需删除 gen 文件夹并清理项目即可解决问题。

我不知道 gen 文件夹是如何在那里结束的,因为我从我的磁盘中删除了该项目并多次克隆了 git 存储库(没有此文件夹)。 一旦我发现它是如何到达那里的,我就会更新这个答案。