Xamarin.Android绑定无效的操作码

Ada*_*ley 4 xamarin.android xamarin

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

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

Ada*_*ley 8

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

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

<AndroidEnableDesugar>True</AndroidEnableDesugar>
Run Code Online (Sandbox Code Playgroud)

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

<AndroidDexTool>d8</AndroidDexTool>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Error: java.lang.TypeNotPresentException :  Type io.reactivex.functions.Consumer not present
Run Code Online (Sandbox Code Playgroud)

由于参考删除处理无法正常工作,因此将无法在参考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
Run Code Online (Sandbox Code Playgroud)

该错误已在Visual Studio 2019预览版2中进行了跟踪和修复。

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

Java.Lang.NoClassDefFoundError: Failed resolution of: Lcom/google/devtools/build/android/desugar/runtime/ThrowableExtension;
Run Code Online (Sandbox Code Playgroud)

终止合并处理再次失败,因为它需要此类来帮助与终止合并的代码进行通信。

实际上找到了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
Run Code Online (Sandbox Code Playgroud)

然后移至输出目录并调用此命令

jar cvf desugar.jar *
Run Code Online (Sandbox Code Playgroud)

它将创建desugar.jar。将其添加为Android绑定项目中的EmbeddedReferenceJar。您现在可以使用Java 8字节代码进行绑定了。

希望可以在将来的Visual Studio版本中解决此问题,因此不需要所有这些步骤,但是直到那时,至少您知道正在发生什么以及如何解决它。