BuildConfig NoClassDefFoundError на Android K

#android #android-studio #gradle

#Android #android-studio #gradle

Вопрос:

Недавно я обновил свою среду сборки до Android studio 2.2, JDK 1.8 (с разъемом) и использую оболочку gradle с gradle-2.14.1. Мои варианты сборки / выпуска компилируются и запускаются должным образом на любом выпуске Android> K. Однако, когда я пытаюсь запустить код на устройстве Android K, код компилируется нормально, и apk генерируется правильно, но код немедленно вылетает с трассировкой стека ниже, поскольку код, похоже, не может найти класс BuildConfig. Был бы признателен за любые указания, которые я могу изучить. Спасибо!

ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.trail.android.debug, PID: 21045 java.lang.Ошибка NoClassDefFoundError: com.trail.android.BuildConfig на com.trail.android.TrailApplication.attachBaseContext(TrailApplication.java:41) на android.app.Application.attach(Application.java:181) на android.app.Instrumentation.newApplication(Instrumentation.java: 991) на android.app.Instrumentation.newApplication(Instrumentation.java: 975) на android.app.Загруженный APK.makeApplication(загруженный apk.java: 511) на android.app.ActivityThread.handleBindApplication(ActivityThread.java:4317) на android.app.ActivityThread.access$ 1500(ActivityThread.java:135) на android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1256) на android.os.Handler.DispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:136) на android.app.ActivityThread.main(ActivityThread.java:5017) на java.lang.reflect.Метод.invokeNative(собственный метод) в java.lang.reflect.Метод.invoke(Method.java:515) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) в dalvik.system.NativeStart.main(роднойМетод)

Комментарии:

1. BuildConfig Класс должен автоматически генерироваться Android .. или вы создали свой собственный (что плохо)? Вы пробовали выполнить сборку -> Очистить проект -> Перестроить проект ?

2. Спасибо за ваш ответ. Я попробовал чистый проект-> перестроить, но я продолжаю получать ту же ошибку. Я не писал никаких пользовательских BuildConfig и не использовал сгенерированный по умолчанию. Озадачивает то, что настройка отлично работает для Android L и выше..

3. Последние несколько предположений, вы правильно установили minSdkVersion ? вы пробовали также обновлять инструменты сборки или версии плагинов для Android gradle?

4. да, я устанавливаю minSdkVersion 19 в своем build.gradle. Версия инструментов сборки — 24.0.2 (compileSdk 24), и я использую плагин: ‘com.android.application’

5. После проведения большого расследования, похоже, я попал: code.google.com/p/android/issues/detail?id=224026 . Класс находится во вторичном файле dex, и на android K мы должны использовать устаревший multidex. В сочетании с Jack мы столкнулись с вышеупомянутой ошибкой.

Ответ №1:

Это было связано с https://code.google.com/p/android/issues/detail?id=224026

Некоторые классы попадают во вторичный файл dex (в моем случае BuildConfig.class был во вторичном dex), и KitKat не смог найти во вторичном dex (это работает автоматически на Android L и выше, а на pre L библиотека поддержки multidex должна была позаботиться об этом, но я обнаружил ошибку, я думаю). Чтобы обойти проблему, пожалуйста, добавьте следующее в свои параметры jackOptions.

  jackOptions {
            enabled true
            additionalParameters("jack.dex.output.policy" : "multidex")
            additionalParameters("jack.preprocessor" : "true")
            additionalParameters("jack.preprocessor.file" : "legacyMultidexInstallation.jpp")
            additionalParameters("jack.dex.output.multidex.legacy": "true")
        }
  

С этим исправлением это сработало для меня.

Комментарии:

1. Что и где находится файл legacyMultidexInstallation.jpp?