Подтвердить что ты не робот

NoClassDefFoundError ниже SDK 21

Я просто испытал неудобную ошибку в своем приложении.

На моем Nexus 5/7, работающем под управлением Android 5.0.1/5.0.2, все работает отлично. Однако, если я попытаюсь запустить тот же самый код на устройстве с более ранней версией (проверены 4.4.4 и 4.3), я получаю следующую ошибку:

03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'com.default.package.application.model.Appcomponent', referenced from method com.default.package.application.controller.DatabaseHandler.getScreenComponents
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$1', referenced from method android.support.v7.app.ActionBarActivityDelegate.<init>
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateHC', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateBase', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getDrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.internal.view.SupportMenuInflater', referenced from method android.support.v7.app.ActionBarActivityDelegate.getMenuInflater
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getV7DrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.default.package, PID: 21714
    java.lang.NoClassDefFoundError: android.support.v7.app.ActionBarActivityDelegateHC

Я уже пытался добавить библиотеку support.v7 в качестве jar, но не имеет значения. Но поскольку он работает на устройствах Lollipop, это все равно не имеет смысла.

Может ли быть какая-то проблема в отношении изменения Dalvik/Art? Или, может быть, факт, что мне пришлось использовать com.android.support:multidex:1.0.0, поскольку это довольно большое приложение.

Обновление: Я попытался удалить некоторые зависимости, чтобы получить ограничение по методу 65k. После этого приложение запускалось на устройствах 4.4.4 и 4.3. Все, что я сделал для поддержки поддержки multidex, устанавливал

multiDexEnabled true

в разделе defaultConfig и добавлении

compile 'com.android.support:multidex:1.0.0'

ниже в разделе зависимостей моего build.gradle.

Любая идея, почему это вызывает эти проблемы в старых версиях Android?

4b9b3361

Ответ 1

Я решил проблему, добавив ее в свой класс приложений.

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

Кажется, что это необходимо для версий Android до 5.

Ответ 2

Есть три способа, как это будет работать.

  • Как отметил @FireZenk, вы можете объявить этот класс как приложение в своем AndroidManifest.xml.
<application android:name="android.support.multidex.MultiDexApplication">

И на самом деле с плагином версии 4.14.0 для Android-версии и инструментами сборки версии 21.1.0, когда вы указываете значение multiDexEnabled true в файле по умолчаниюConfig, ProductFlavor или BuildTypethen, оно автоматически включает зависимость от com.android.support:multidex:1.0 +0,0. Вы можете проверить это с помощью задачи androidDependencie или выполнить команду. /gradlew -q android: dependencies (android: это мой модуль android). Поэтому нет необходимости явно добавлять

compile 'com.android.support:multidex:1.0.0'

Если у вас есть расширенный класс приложения в вашем приложении:

  1. Определите, что ваше приложение расширяет класс MultiDexApplication, например:
public class MyApplication extends MultiDexApplication {
    ...
}

или как @user2700475 отправлено

  1. Отмените приложение для приложения attachBaseContext:
public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);}
}

С помощью предыдущих ответов мне удается найти решение этой проблемы. Я просто хочу собрать все это.

Ответ 3

Если у вас нет/использования класса Application, вы можете поместить это:

android:name="android.support.multidex.MultiDexApplication"

В тэг на AndroidManifest.xml

Если вы уже внедрили класс Application, ваши ответы @user2700475 + @sirvon - ваш лучший выбор.

Также очевидно, что вам нужно добавить зависимость Gradle:

compile 'com.android.support:multidex:1.0.0'

Подробнее о методах 65k: https://developer.android.com/tools/building/multidex.html

Ответ 4

Не работает, пожалуйста, дайте любое другое решение для уровня API ниже 19