У меня есть проект, который начал выдавать эту ошибку при сборке в 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, возможно, лямбда-выражения, но сообщение об ошибке не дает понять, в чем проблема - это может быть мой код или библиотека.
Как лучше всего узнать, где находится проблемный код? Это достаточно большое приложение с несколькими модулями и довольно большим количеством библиотек.
Один из подходов - установить минимальный 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) решило проблему.
@iDroidExplorer Я уже говорил, как нашел - просмотрел журнал ошибок.
Нам нужно обновить версию 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
Не могли бы вы упомянуть, как вы пришли к выводу, что эта банка вызывает проблему?