我有一个项目在 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)的使用有关,但错误消息没有给出问题所在的线索 - 它可能是我的代码,也可能是一个库。
找出有问题的代码在哪里的最佳方法是什么?这是一个相当大的应用程序,具有多个模块和相当多的库。
就我而言,我尝试在运行 Api 版本 26 或更高版本的仪器测试中通过 mockk 模拟某些内容,只要以下问题未解决,删除依赖项就是我唯一的解决方案:https://github.com/mockk/mockk /问题/281
更新:看来问题已经解决,使用mockk版本1.10.0将解决这个问题
一种方法是将您的 min 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)解决了问题。
只需将mock版本更改为1.10.0,这将解决
当使用太高版本的
Mockito
库时,我也有同样的情况。
解决方案从 3.8.0
降级为 3.4.6.
,一切都开始正常工作。
发生错误:
org.mockito:mockito-android:3.8.0
但是为:
工作org.mockito:mockito-android:3.4.6
将“com.google.gms:google-services”从 4.4.0 降级到 4.3.15 对我有帮助
我们需要将java版本更新到java 8。 为此,请单击文件 -> 项目结构 -> 应用程序(在模块文件夹下) -> 然后选择与 java 8 的源兼容性和目标兼容性。 之后,您可能会遇到 MethodHandle.invoke 和 MethodHandle.invokeExact 的另一个错误,如果出现此错误,请将 minSdkVersion 设置为 26 或更高