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 表示兆字节。默认值是在运行时根据系统配置选择的。
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |