multidex - 启用了multidex的NoClassDefFoundError

问题描述 投票:1回答:5

我的应用程序因为java.lang.NoClassDefFoundError app.module.SomeClass错误而在21之前崩溃。

我已经启用了Multidex:

的build.gradle:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
}

dependencies {
   ...
   implementation "androidx.multidex:multidex:2.0.1"
}

我的应用类:

class App : DaggerApplication() {
    ...
    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

在阅读了关于Declaring classes required in the primary DEX file之后,我创建了multidex-config.pro文件,在主DEX文件中包含app.module.**

-keep class app.module.** { *; }

并在build.gradle中注册:

android {
  buildTypes {
    debug {
      ...
      multiDexKeepProguard file('multidex-config.pro')
    }
}

我通过检查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等。

我接下来可以尝试什么?

android kotlin multidex android-multidex
5个回答
1
投票

在您的应用程序gradle文件中添加此项

android {
    ...
    dexOptions {
        jumboMode = true
        javaMaxHeapSize "4g"
     }
     defaultConfig {
         ...

javaMaxHeapSize

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


1
投票

尝试更改DaggerApplication的说明顺序:

override fun onCreate() {
    MultiDex.install(this)
    super.onCreate()
}

因为documentation读到:

注意:在MultiDex.install()完成之前,不要通过反射或JNI执行MultiDex.install()或任何其他代码。 Multidex跟踪不会跟随这些调用,导致ClassNotFoundException或验证由于DEX文件之间的类分区错误而导致的错误。


1
投票

试试这个

dexOptions {
            preDexLibraries = false
        }

1
投票

尝试以下步骤希望它会对您有所帮助

dependencies { 
 compile 'com.android.support:multidex:1.0.1' 
}

配置您的源在AndroidManifest.xml文件中声明MultiDexApplication类

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="android.support.multidex.MultiDexApplication">
</application>

如果我们无法扩展MultiDexApplication,我们可以通过覆盖Application类中的attachBaseContext(Context base)方法手动安装多个dex文件

public class HelloMultiDexApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }
@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

在app / build.gradle中配置dexOptions

android {
    dexOptions {
        incremental true         
        javaMaxHeapSize "4g"
    }
}

在app / build.gradle中启用multidex

android {
 defaultConfig { 
  multiDexEnabled true 
 }
}
afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = ['--multi-dex']
        } else {
            dx.additionalParameters += '--multi-dex'
        }
    }
}
dependencies {
 compile 'com.android.support:multidex:1.0.1' 
}

在build build.gradle结束时禁用每个模块的预处理

subprojects {
    project.plugins.whenPluginAdded { plugin ->
        if ("com.android.build.gradle.AppPlugin".equals(plugin.class.name)) {
            project.android.dexOptions.preDexLibraries = false
        } else if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
            project.android.dexOptions.preDexLibraries = false
        }
    }
}

在gradle.properties中增加gradle jvm build

org.gradle.jvmargs=-Xmx4608M

1
投票

我在制作冰淇淋三明治(API 14)设备的ADB版本时遇到了这个问题。

对我有用的是disabling Android Studio's instant run

© www.soinside.com 2019 - 2024. All rights reserved.