最近收到了要绑定到Xamarin的新Android SDK(aar)。最初启动绑定时,我收到错误消息
COMPILETODALVIK : Uncaught translation error : com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
答案 0 :(得分:4)
此错误是由于SDK包含Java 8(v1.8)字节代码,并且需要与Java 7(v1.7)兼容才能支持较低的Android API版本。
在您的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
它将无法在参考jar中找到这些类型,因为删除修饰符的处理无法正常工作。您最终可以从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预览版2中进行了跟踪和修复。
现在您切换到Visual Studio 2019预览版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
然后使用该Java类,然后可以将其编译到jar中。一种快速的方法是将Java文件复制到文件夹中。然后在该文件夹中创建一个名为output
的文件夹。
调用此命令
javac -d ./output ThrowableExtension.java
然后进入输出目录并调用此命令
jar cvf desugar.jar *
它将创建desugar.jar。将其添加为Android绑定项目中的EmbeddedReferenceJar。您现在可以使用带有废止符的Java 8字节代码绑定了。
希望这可以在将来的Visual Studio版本中解决,因此不需要所有这些步骤,但是直到那时,至少您知道发生了什么以及如何解决。