代码之家  ›  专栏  ›  技术社区  ›  Abby

dex文件不包含mainActivity类

  •  2
  • Abby  · 技术社区  · 8 年前

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

    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分析器(build>analyze apk)来分析我的apk(app/build/outputs/apk/debug/app debug.apk)和 classes.dex

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

    我注意到我自己的课程,也就是主要活动,都不见了。 据我所知,dex文件 this 所以问题)我自己的课程也应该在那里。 因为他们不在那里,我明白为什么我会犯错误,我的课找不到。

    我在自己的设备上得到这个错误:三星、棒棒糖5.0.2、API 21,在虚拟设备上得到这个错误:谷歌像素、Oreo 8.0.0、API 26。

    我试过的

    我在谷歌上找到了很多建议,但都不管用。 这些建议是:

    • 禁用即时运行。文件>设置>生成、执行、部署>即时运行>取消选中即时运行。

    • 清理项目。构建>干净。然后重新生成项目,build>rebuild。

    • 使缓存无效/重新启动。

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

    • 在中使用不同的路径命名 Manifest 是的。改变 android:name=".MainActivity" 进入之内 android:name="com.name.app.MainActivity" activity 标签。

    • 禁用前德兴,如 this 回答。

    将以下内容添加到 build.gradle

    dexOptions {
        preDexLibraries false
    }
    
    • 启用多索引,跟随 this 链接。首次启用多索引 平地 ,然后添加 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[...]
    

    下面是启用多重索引的附加项。

    平地

    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(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工作室设置有问题。

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   Abby    7 年前

    我的文件夹结构是

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

    这个 gen 文件夹不应该在这里。 此文件夹包含生成的文件,如 R.java 是的。 这些文件也(无论如何正确)在 app/build/generated/source/* 是的。 只需删除 消息 文件夹和清理项目解决了这个问题。

    我不知道那是怎么回事 消息 文件夹最终出现在那里,因为我从磁盘中删除了项目,并多次克隆了git存储库(没有此文件夹)。 一旦我知道它是如何到达那里的,我会更新这个答案。

    推荐文章