Android 4.x NoClassDefFoundError с полностью реализованной Multidex
Недавно я добавил в свое приложение еще одну зависимость, которая превысила ограничение в 64 КБ и потребовала Multidex. При запуске на Android 4.x приложение теперь падает при запуске с NoClassDefFoundError:
FATAL EXCEPTION: main
Process: org.naturenet.debug, PID: 3136
java.lang.NoClassDefFoundError: org.naturenet.util.ForestFire
at org.naturenet.NatureNetApplication.onCreate(NatureNetApplication.java:60)
Другие случаи этой ошибки предполагают, что это происходит потому, что Multidex не полностью реализован, но это все еще происходит со всеми следующими изменениями:
файл сборки приложения
dependencies {
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:appcompat-v7:25.1.0'
compile 'com.android.support:support-v4:25.1.0'
...
}
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "org.naturenet"
minSdkVersion 16
targetSdkVersion 23
multiDexEnabled true
jackOptions {
enabled true
additionalParameters('jack.incremental': 'true')
}
}
}
Класс приложения
public class NatureNetApplication extends MultiDexApplication {
Класс ForestFire, о котором идет речь, не изменился. Изначально у меня были разные реализации в исходных деревьях отладки и выпуска, но замена их одним файлом в основном исходном дереве не имела никакого значения.
2 ответа
У меня также была такая же проблема на устройствах Android 4.*, и это как-то было связано с использованием набора инструментов Jack.
Но Джек устарел, и была выпущена Android Studio 2.4 Preview 6:
Функции языка Java 8 теперь поддерживаются системой сборки Android в пути компиляции javac/dx. Плагин Gradle для Android Studio теперь десагирует файлы классов Java 8 в файлы классов, совместимые с Java 7, так что вы можете использовать лямбда-выражения, ссылки на методы и другие функции Java 8.
Смотрите это для получения дополнительной информации.
Теперь вы можете установить Android Studio Preview и удалить jackOptions
от build.gradle
,
Попробуйте добавить это в свой манифест, если вы этого не сделали.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
Для получения дополнительной информации: https://developer.android.com/studio/build/multidex.html?hl=en-419