multidex - NoClassDefFoundError 启用了 multidex

ala*_*how 8 android kotlin android-multidex

我的应用程序在 21 之前崩溃并java.lang.NoClassDefFoundError app.module.SomeClass出现错误。

我已经启用了 Multidex:

构建.gradle:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
}

dependencies {
   ...
   implementation "androidx.multidex:multidex:2.0.1"
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序类:

class App : DaggerApplication() {
    ...
    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }
Run Code Online (Sandbox Code Playgroud)

在阅读了主 DEX 文件中所需的声明类之后,我创建了multidex-config.pro文件以包含app.module.**在主 DEX 文件中:

-keep class app.module.** { *; }
Run Code Online (Sandbox Code Playgroud)

并在 build.gradle 中注册:

android {
  buildTypes {
    debug {
      ...
      multiDexKeepProguard file('multidex-config.pro')
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过检查build/intermediates/legacy_multidex_main_dex_list/debug/mainDexList.txt和分析调试 apk(检查是否classes.dex包含app.module.SomeClass)来确认它。

但我仍然收到java.lang.NoClassDefFoundError app.module.SomeClass错误。

我还尝试清理缓存、在不同的机器上运行(仅在没有 Android Studio 的情况下进行 cli 构建)、禁用即时运行、指定javaMaxHeapSize、仅扩展MultiDexApplication等。

我接下来可以尝试什么?

小智 8

我们在这里更深入地研究了这一点:

https://issuetracker.google.com/issues/131100011

在 21 之前的设备上的某些 Dalvik VM 中存在一个不幸的错误,其中包私有方法有时会被另一个包中的公共方法错误地覆盖。如果包私有方法是最终的,那将导致以下形式的错误:

E/dalvikvm: Method Lcom/mycompany/MyViewModel;.clear overrides final Landroidx/lifecycle/ViewModel;.clear

看起来这可能是你在这里受到的打击。不幸的是,针对该特定问题的唯一解决方法是将您的“clear”方法重命名为其他名称,这样您就不会遇到这个不幸的 VM 错误。


小智 1

在您的应用程序 gradle 文件中添加以下内容

android {
    ...
    dexOptions {
        jumboMode = true
        javaMaxHeapSize "4g"
     }
     defaultConfig {
         ...
Run Code Online (Sandbox Code Playgroud)

java最大堆大小

指定内存分配池的最大大小(以字节为单位)。该值必须是 1024 的倍数且大于 2MB。附加字母 k 或 K 表示千字节,或附加 m 或 M 表示兆字节。默认值是在运行时根据系统配置选择的。