У меня очень странная проблема, я подозреваю, связанную с мультисайсированием (но не уверен).NoClassDefFound в multidex'ed apk
У меня есть модуль приложения и модуль библиотеки. Библиотека выполняет некоторый код в начале приложения, который через интерфейс в главном классе приложения получает имя класса, определенное в библиотеке.
Теперь начинается самое странное. Приложение является мультимедированным в соответствии со следующими инструкциями: Configure Apps with Over 64K Methods - и у меня есть 2 типа сборки - отладка и выпуск. При выпуске сборки im использовать proguard для обфускации и сжатия кода. В отладочной сборке им нет.
При запуске приложения на устройствах с android +21 все работает отлично в обоих типах сборки.
При запуске приложения на устройствах с предварительной версией lollipop все работает отлично в стиле сборки выпуска, но в стиле отладки типа im получает NoClassDefFoundError
из-за класса, которое приложение пытается вернуть в библиотеку.
В соответствии с предложением в Declare classes required in the primary DEX file я уже использовал APK Analyzer в Android Studio, чтобы исследовать распределение классов между тны файлами и увидел 2 вещи:
- в типе релиза сборки есть только один файл Dex ,
- в стиле отладочной сборки есть 2 файла dex, но проблемный класс (и его родительский элемент) определен в основном файле dex.
Кроме того, при замене вызова из библиотеки на приложение (getClassName() на диаграмме) с фактическим именем класса все работает отлично во всех типах сборки!
В качестве последней попытки понять, что происходит здесь, я сравнил 2 apks, оригинальный с одним без вызова приложения (замененный фактическим именем класса), и единственное различие, которое я мог видеть, это код библиотеки, делающий вызов. С точки зрения распределения классов между файлами dex нет абсолютно никакой разницы!
Кто-нибудь знает, в чем проблема? Благодарю.
Что вы подразумеваете под «app start»? Вызывается из приложения # onCreate()? Кроме того, добавление фрагмента кода поможет проиллюстрировать ваш сценарий. –
@AlexLipov onResume() основного вида деятельности. Существует активность всплеска, которая работает нормально, и основная деятельность появляется сразу после нее. – AsafK
Переустановите сборку отладки. Найдите записи журнала с тегом dalvikvm (в частности, с подстроками DexOpt или VFY). Вы видите что-то важное? –