dex文件不包含MainActivity类

时间:2018-07-09 12:17:22

标签: java android android-studio gradle dex

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

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的结构为< / p>

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

我注意到自己的类以及MainActivity都丢失了。 就我所了解的dex文件(来自this问题)而言,我自己的类也应该存在。 因为他们不在,所以我明白了为什么我得到找不到我的班级的错误。

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

我尝试过的事情

我在Google上搜索并找到了多个建议,但没有一个对我有用。 这些建议是:

  • 禁用即时运行。文件>设置>构建,执行,部署>即时运行>取消选中即时运行。

  • 清理项目。生成>清理。然后重建项目,依次选择Build> Rebuild。

  • 使缓存无效/重启。

  • 从设备上卸载应用程序,然后重试。

  • Manifest中使用不同的路径命名。在android:name=".MainActivity"标签中将android:name="com.name.app.MainActivity"更改为activity

  • 禁用预删除,如this答案。

build.gradle

中添加了以下内容
dexOptions {
    preDexLibraries false
}
  • 启用multidex,然后点击this链接。首先在build.gradle中启用multidex,然后将MultiDexApplication添加到清单中。我的MainActivity扩展了AppCompatActivity(因此它没有扩展Application)。

启用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>

备注 还有与图书馆相关的建议,请参见this答案。 但是,这是针对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并不能解决问题。

1 个答案:

答案 0 :(得分:0)

我的文件夹的结构是

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

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

我不知道那个gen文件夹是怎么结束的,因为我从磁盘上删除了项目,并多次克隆了git存储库(没有该文件夹)。 一旦找到答案,便会更新此答案。