dexing时如何查找错误原因:MethodHandle.invoke和MethodHandle.invokeExact

问题描述 投票:0回答:7

我有一个项目在 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)的使用有关,但错误消息没有给出问题所在的线索 - 它可能是我的代码,也可能是一个库。

找出有问题的代码在哪里的最佳方法是什么?这是一个相当大的应用程序,具有多个模块和相当多的库。

android lambda java-8 dex
7个回答
5
投票

就我而言,我尝试在运行 Api 版本 26 或更高版本的仪器测试中通过 mockk 模拟某些内容,只要以下问题未解决,删除依赖项就是我唯一的解决方案:https://github.com/mockk/mockk /问题/281


更新:看来问题已经解决,使用mockk版本1.10.0将解决这个问题


2
投票

一种方法是将您的 min api 设置为 26,以避免错误并构建 apk,然后检查应用程序的字节码(dexdump、baksmali 等)以查找 MethodHandle 类的任何用法。


2
投票

查看错误日志,它确实提供了更多信息,特别指定了一个失败的 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)解决了问题。


0
投票

只需将mock版本更改为1.10.0,这将解决


0
投票

当使用太高版本的

Mockito
库时,我也有同样的情况。 解决方案从
3.8.0
降级为
3.4.6.
,一切都开始正常工作。

发生错误:

org.mockito:mockito-android:3.8.0

但是为:

工作
org.mockito:mockito-android:3.4.6

0
投票

将“com.google.gms:google-services”从 4.4.0 降级到 4.3.15 对我有帮助


-2
投票

我们需要将java版本更新到java 8。 为此,请单击文件 -> 项目结构 -> 应用程序(在模块文件夹下) -> 然后选择与 java 8 的源兼容性和目标兼容性。 之后,您可能会遇到 MethodHandle.invoke 和 MethodHandle.invokeExact 的另一个错误,如果出现此错误,请将 minSdkVersion 设置为 26 或更高

© www.soinside.com 2019 - 2024. All rights reserved.