Как найти причину ошибки при dexing: MethodHandle.invoke и MethodHandle.invokeExact

У меня есть проект, который начал выдавать эту ошибку при сборке в Android Studio или Gradle:

com.android.tools.r8.ApiLevelException: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)

Теперь я предполагаю, что это связано с использованием функций Java 8, возможно, лямбда-выражения, но сообщение об ошибке не дает понять, в чем проблема - это может быть мой код или библиотека.

Как лучше всего узнать, где находится проблемный код? Это достаточно большое приложение с несколькими модулями и довольно большим количеством библиотек.

9
0
8 751
6

Ответы 6

Один из подходов - установить минимальный api на 26, чтобы избежать ошибки и создать apk, а затем проверить байт-код приложения (dexdump, baksmali и т. д.), Чтобы найти любые варианты использования класса MethodHandle.

Просматривая журнал ошибок, он дал немного больше информации, в частности, назвал один файл jar, в котором произошел сбой:

/Users/.../androidApp/build/intermediates/transforms/desugar/debug/41.jar

При изучении этого jar-файла все классы были из библиотеки, недавно добавленной в проект, и самым первым перечисленным классом был:

META-INF/versions/9/org/h2/util/Bits.class

Оказывается, это настроенный класс Java 9. Удаление его из файла jar (с помощью zip -d) решило проблему.

Не могли бы вы упомянуть, как вы пришли к выводу, что эта банка вызывает проблему?

Shreyash Mahajan 13.05.2019 09:24

@iDroidExplorer Я уже говорил, как нашел - просмотрел журнал ошибок.

Clyde 13.05.2019 14:34

Нам нужно обновить версию java до java 8. Для этого нажмите Файл -> Структура проекта -> приложение (в папке модуля) -> Затем выберите совместимость источника и целевую совместимость с java 8. После этого вы можете столкнуться с другой ошибкой с MethodHandle.invoke и MethodHandle.invokeExact, если вы получите эту ошибку, установите minSdkVersion на 26 или выше.

В моем случае я пытался издеваться над чем-то с помощью mockk в инструментальном тесте с Api версии 26 или выше, удаление зависимости было моим единственным решением, пока не решена следующая проблема: https://github.com/mockk/mockk/issues/281


Обновление: похоже, что проблема решена, и использование mockk версии 1.10.0 решит эту проблему.

Просто измените версию mockk на 1.10.0, это разрешит

У меня такой же случай, когда использовалась слишком старшая версия библиотеки Mockito. Решением было понижение версии с 3.8.0 до 3.4.6., и все стало работать правильно.

Ошибка произошла для:

org.mockito:mockito-android:3.8.0

но работать для:

org.mockito:mockito-android:3.4.6

Другие вопросы по теме