VerifyError в приложении multidex при внедрении зависимости с помощью Dagger

Пример приложения для библиотеки имеет около 67 000 методов. Он имеет multidex, позволяющий преодолеть ограничение метода 65k. К сожалению, при включенном мультидексе приложение вылетает на VerifyError при попытке внедрить EndpointAdapter в основную активность.

Эта проблема не возникает, когда приложение защищено и мультидекс отключен, поэтому она должна быть вызвана проблемами с мультидексом и кинжалом 1.

Я уверен, что EndpointAdapter находится в основном файле dex, но некоторые классы, сгенерированные Dagger, находятся во втором файле dex, сгенерированном multidex. Эта проблема возникает на устройствах с API ‹ 21 (например, на genymotion с KitKat 4.4.4).

Есть идеи, почему он вылетает с VerifyError?

FATAL EXCEPTION: main
Process: pl.toro.libsample.debug, PID: 11775
java.lang.VerifyError: pl/toro/lib/network/EndpointAdapter
    at java.lang.Class.getDeclaredConstructors(Native Method)
    at java.lang.Class.getDeclaredConstructors(Class.java:574)
    at dagger.internal.loaders.ReflectiveAtInjectBinding.getConstructorsForType(ReflectiveAtInjectBinding.java:232)
    at dagger.internal.loaders.ReflectiveAtInjectBinding.create(ReflectiveAtInjectBinding.java:168)
    at dagger.internal.FailoverLoader.getAtInjectBinding(FailoverLoader.java:74)
    at dagger.internal.Linker.createBinding(Linker.java:224)
    at dagger.internal.Linker.linkRequested(Linker.java:141)
    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:309)
    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279)
    at pl.toro.lib.app.BaseApplication.inject(BaseApplication.java:135)
    ...

Вот вывод тега MultiDex

VM with version 1.6.0 does not have multidex support
install
MultiDexExtractor.load(/data/app/pl.toro.libsample.debug-1.apk, false)
Detected that extraction must be performed.
Extraction is needed for file /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip
Extracting /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes-1477675005.zip
Renaming to /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip
Extraction success - length /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip: 187777
load found 1 secondary dex files
install done

ИЗМЕНИТЬ

Я перешел на Dagger 2, и на данный момент эта проблема решена. Dagger 2 больше не использует отражение, которое является основным фактором этой проблемы.


person tomrozb    schedule 02.08.2015    source источник
comment
Есть ли у EndpointAdapter конструктор, который принимает параметр во вторичном индексе? Кроме того, можете ли вы подтвердить, что эта ошибка возникает после исправления загрузчика классов?   -  person Jeff Bowman    schedule 07.08.2015
comment
Я должен проверить это. У него есть @Inject аннотированный конструктор с 2 зависимостями, но я не уверен, в каком индексе находятся зависимости. Под «исправленным» вы подразумеваете после того, как MultiDex инициализируется и печатает журнал установки?   -  person tomrozb    schedule 07.08.2015
comment
Ага, вот что я проверяю, Multidex завершился успешно. Последний вопрос: какую версию Android SDK вы используете?   -  person Jeff Bowman    schedule 07.08.2015
comment
MultiDex устанавливается без проблем Думаю, скоро приложу к вопросу полный вывод тега MultiDex. Я ориентируюсь на API 22, но для минимального SDK установлено значение 15.   -  person tomrozb    schedule 09.08.2015
comment
Может ли это быть частью проблема с разрешением аннотации в строке 56 здесь? Эта ошибка здесь описывает ошибку, связанную с проверкой (но не идентичный) след.   -  person Jeff Bowman    schedule 09.08.2015
comment
Я не использую флаг, упомянутый в строке 56 файла. Наконец-то я перешел на Dagger 2, и на данный момент проблема решена. Я уверен, что есть некоторая смесь проблем между отражением (используемым Dagger 1) и MultiDex, который понятия не имеет, что некоторые классы необходимы в основном индексе, потому что эти классы используются отражением. Спасибо Джефф за помощь.   -  person tomrozb    schedule 10.08.2015


Ответы (1)


Как указано в этом сообщении в блоге [1], вы создаете граф кинжала после установки multi-dex. Итак, в MultiDexApplication#attachBaseContext после вызова super (или вызова MultiDex.install() самостоятельно).

[1] https://developers.soundcloud.com/blog/congratulations-you-have-a-lot-of-code-remedying-androids-method-limit-part-2

person Jeroen    schedule 12.10.2015
comment
Извините, но я не понимаю. Что после звонка в супер? - person tomrozb; 12.10.2015
comment
Извините, если вы создали подкласс MultiDexApplication, вам нужно создать граф Dagger в attachBaseContext после того, как вы вызвали super.attachBaseContext(). Имеет ли это смысл? - person Jeroen; 13.10.2015
comment
Уверены ли вы? Он вызывается после onCreate или до? Я больше не использую Dagger 1, поэтому нам нужен кто-то еще, чтобы подтвердить, что это решает проблему. - person tomrozb; 13.10.2015
comment
Хм, я думаю, ты прав. attachBaseContext() всегда вызывается перед onCreate. Так что, кажется, мой ответ неверен. - person Jeroen; 14.10.2015