此错误是由于 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 版本中得到解决,因此所有这些步骤都不是必需的,但在那之前,至少您知道发生了什么以及如何修复它。