2016-11-28 3 views
0

У меня очень странная проблема, я подозреваю, связанную с мультисайсированием (но не уверен).NoClassDefFound в multidex'ed apk

У меня есть модуль приложения и модуль библиотеки. Библиотека выполняет некоторый код в начале приложения, который через интерфейс в главном классе приложения получает имя класса, определенное в библиотеке.

enter image description here

Теперь начинается самое странное. Приложение является мультимедированным в соответствии со следующими инструкциями: 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 вещи:

  1. в типе релиза сборки есть только один файл Dex ,
  2. в стиле отладочной сборки есть 2 файла dex, но проблемный класс (и его родительский элемент) определен в основном файле dex.

Кроме того, при замене вызова из библиотеки на приложение (getClassName() на диаграмме) с фактическим именем класса все работает отлично во всех типах сборки!

В качестве последней попытки понять, что происходит здесь, я сравнил 2 apks, оригинальный с одним без вызова приложения (замененный фактическим именем класса), и единственное различие, которое я мог видеть, это код библиотеки, делающий вызов. С точки зрения распределения классов между файлами dex нет абсолютно никакой разницы!

Кто-нибудь знает, в чем проблема? Благодарю.

+0

Что вы подразумеваете под «app start»? Вызывается из приложения # onCreate()? Кроме того, добавление фрагмента кода поможет проиллюстрировать ваш сценарий. –

+0

@AlexLipov onResume() основного вида деятельности. Существует активность всплеска, которая работает нормально, и основная деятельность появляется сразу после нее. – AsafK

+0

Переустановите сборку отладки. Найдите записи журнала с тегом dalvikvm (в частности, с подстроками DexOpt или VFY). Вы видите что-то важное? –

ответ

0

В конце концов это был com/newrelic/agent/android/api/v2/TraceFieldInterface.class, который я должен был убедиться в основном файле dex.

Если кто-то использует newrelic, вы можете обратить внимание на это.