Xamarin.Android绑定无效的操作码

时间:2019-02-08 09:44:54

标签: xamarin xamarin.android

最近收到了要绑定到Xamarin的新Android SDK(aar)。最初启动绑定时,我收到错误消息

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

1 个答案:

答案 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版本中解决,因此不需要所有这些步骤,但是直到那时,至少您知道发生了什么以及如何解决。