Xamarin.Android 绑定无效操作码

2024-04-02

最近收到一个新的 Android SDK (aar) 来绑定在 Xamarin 中。最初开始绑定时,我收到错误

COMPILETODALVIK : Uncaught translation error : com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

此错误是由于 SDK 包含 Java 8 (v1.8) 字节代码,需要兼容 Java 7 (v1.7) 以支持较低 API 版本的 Android。

在您的 Android 项目(不是绑定项目)中,添加以下属性。

<AndroidEnableDesugar>True</AndroidEnableDesugar>

或者,如果您使用的是 VS 2019+,则可以打开 D8,默认情况下会启用此功能。

<AndroidDexTool>d8</AndroidDexTool>

脱糖是将 Java 8 字节代码转换为 Java 7 兼容字节代码的过程。这是执行转换的 Google 进程,并且是 Xamarin.Android 构建进程的一部分。

那么如果 SDK 没有任何依赖项,它应该可以正常工作。如果您有 EmbeddedReferenceJars,那么事情会变得更加复杂。

在 Visual Studio 2017 中,您将遇到类似于以下内容的错误

Error: java.lang.TypeNotPresentException :  Type io.reactivex.functions.Consumer not present

它将无法在参考罐中找到这些类型,因为脱糖处理无法正常工作。从Github Issues最终找到原因:

The first fix here is to add the `--classpath_entry` flag for every
`--input`, for some reason `Desugar` is not treating `--input` jars as
classpath entries

该错误已在 Visual Studio 2019 Preview 2 中进行跟踪和修复。

现在您切换到 Visual Studio 2019 Preview 2,您将遇到此错误。

Java.Lang.NoClassDefFoundError: Failed resolution of: Lcom/google/devtools/build/android/desugar/runtime/ThrowableExtension;

脱糖处理再次失败,因为它需要此类来帮助与脱糖代码进行通信。

实际上找到了 ThrowableExtension 类:https://github.com/bazelbuild/bazel/blob/master/src/tools/android/java/com/google/devtools/build/android/desugar/runtime/ThrowableExtension.java https://github.com/bazelbuild/bazel/blob/master/src/tools/android/java/com/google/devtools/build/android/desugar/runtime/ThrowableExtension.java

然后,您可以将该 Java 类编译到 jar 中。一种快速方法是将 java 文件复制到文件夹中。然后在该文件夹内创建一个名为的文件夹output.

调用这个命令

javac -d ./output ThrowableExtension.java

然后进入输出目录并调用此命令

jar cvf desugar.jar *

它将创建 desgar.jar。将其作为 EmbeddedReferenceJar 添加到您的 Android 绑定项目中。现在,您与带有脱糖功能的 Java 8 字节代码的绑定应该可以正常工作。

希望这个问题可以在未来的 Visual Studio 版本中得到解决,因此所有这些步骤都不是必需的,但在那之前,至少您知道发生了什么以及如何修复它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Android 绑定无效操作码 的相关文章

随机推荐