我的应用程序因为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
等。
我接下来可以尝试什么?
在您的应用程序gradle文件中添加此项
android {
...
dexOptions {
jumboMode = true
javaMaxHeapSize "4g"
}
defaultConfig {
...
javaMaxHeapSize
指定内存分配池的最大大小(以字节为单位)。此值必须是1024的倍数大于2MB。附加字母k或K表示千字节,或m或M表示兆字节。根据系统配置在运行时选择默认值。
尝试更改DaggerApplication
的说明顺序:
override fun onCreate() {
MultiDex.install(this)
super.onCreate()
}
因为documentation读到:
注意:在
MultiDex.install()
完成之前,不要通过反射或JNI执行MultiDex.install()
或任何其他代码。 Multidex跟踪不会跟随这些调用,导致ClassNotFoundException
或验证由于DEX文件之间的类分区错误而导致的错误。
试试这个
dexOptions {
preDexLibraries = false
}
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
我在制作冰淇淋三明治(API 14)设备的ADB版本时遇到了这个问题。