我有一个项目在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功能有关,也许是一个lambda,但错误信息并不能解决问题所在 - 它可能是我的代码,也可能是一个库。
找出违规代码的最佳方法是什么?这是一个相当大的应用程序,有几个模块和相当多的库。
答案 0 :(得分:5)
在我的情况下,我尝试在运行Api版本26或更高版本的工具测试中通过模仿来模拟某些东西,只要不解决以下问题,删除依赖项是我唯一的解决方案:https://github.com/mockk/mockk/issues/281
更新:似乎该问题已解决,使用嘲讽版本1.10.0可以解决此问题
答案 1 :(得分:2)
一种方法是将你的min api设置为26,以避免错误并构建apk,然后检查应用程序的字节码(dexdump,baksmali等)以查找MethodHandle类的任何用法。 / p>
答案 2 :(得分:1)
查看错误日志,它确实提供了更多信息,特别是提名了一个失败的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)解决了这个问题。
答案 3 :(得分:0)
只需将模拟版本更改为1.10.0,即可解决
答案 4 :(得分:0)
当使用过高版本的 Mockito
库时,我有同样的情况。
解决方案是从 3.8.0
降级到 3.4.6.
,一切都开始正常工作。
发生错误:
org.mockito:mockito-android:3.8.0
但为:
org.mockito:mockito-android:3.4.6
答案 5 :(得分:-1)
我们需要将Java版本更新为Java 8。 为此,请单击文件->项目结构->应用程序(在模块文件夹下)->然后选择Java 8的源兼容性和目标兼容性。 之后,您可能会遇到MethodHandle.invoke和MethodHandle.invokeExact的另一个错误,如果出现此错误,请将minSdkVersion设置为26或更高