multidex - NoClassDefFoundError с включенным multidex - PullRequest
2 голосов
/ 23 апреля 2019

Мое приложение аварийно завершает работу до 21 года с ошибкой java.lang.NoClassDefFoundError app.module.SomeClass.

У меня уже включена поддержка Multidex:

build.gradle:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
}

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

Мое приложениеclass:

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

После прочтения о Объявление классов, необходимых в основном файле DEX Я создал multidex-config.pro файл для включения app.module.** в основной файл DEX:

-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), отключить мгновенный запуск, указав javaMaxHeapSize, просто расширяя MultiDexApplication и т. д.

Что я могу попробовать дальше?

Ответы [ 5 ]

1 голос
/ 01 мая 2019

Я использую эту проблему при создании сборок ADB для устройств с мороженым-сэндвичем (API 14).

Для меня работало отключение мгновенного запуска Android Studio .

1 голос
/ 01 мая 2019

Попробуйте выполнить следующие действия, надеясь, что это поможет вам

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

Конфигурирование вашего источника Объявите класс MultiDexApplication в файле AndroidManifest.xml

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

Если мы не можем расширить MultiDexApplication, мы можем установитьнесколько файлов dex вручную путем переопределения метода attachBaseContext (Context base) в нашем классе приложений

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

Config dexOptions в app / build.gradle

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

Включение multidex в app / build.gradle

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' 
}

Отключена предварительная индексация каждого модуля в конце root 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 jvm в gradle.properties

org.gradle.jvmargs=-Xmx4608M
1 голос
/ 28 апреля 2019

попробуйте изменить порядок инструкций для DaggerApplication:

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

потому что документация гласит:

Внимание : Не выполняйте MultiDex.install() или любой другой код с помощью отражения или JNI до завершения MultiDex.install(). Мультидексная трассировка не будет следовать за этими вызовами, вызывая ClassNotFoundException или проверять ошибки из-за неправильного разделения класса между файлами DEX.

1 голос
/ 28 апреля 2019

Попробуйте это

dexOptions {
            preDexLibraries = false
        }
1 голос
/ 27 апреля 2019

В своем файле gradle приложения добавьте

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

javaMaxHeapSize

Укажите максимальный размер в байтах пула выделения памяти.Это значение должно быть кратно 1024 больше 2 МБ.Добавьте букву k или K для обозначения килобайт, или m или M для обозначения мегабайт.Значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы.

...