最近接到一个新的Android SDK(AAR)在Xamarin绑定。当最初开始结合我收到错误
COMPILETODALVIK : Uncaught translation error : com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
这个错误是由于包含Java 8(V1.8)字节码的SDK和它需要与Java 7(V1.7)支持Android的较低API版本兼容。
在你的Android项目(不绑定项目),添加以下属性。
<AndroidEnableDesugar>True</AndroidEnableDesugar>
或者如果你是在VS 2019+,你可以打开D8在默认情况下启用此。
<AndroidDexTool>d8</AndroidDexTool>
脱糖是允许Java的8字节代码的过程将被转换成Java 7兼容字节码。这是一个谷歌的过程,执行转换,是Xamarin.Android构建过程的一部分。
那么如果SDK没有任何依赖性,应该所有的工作。如果你有EmbeddedReferenceJars,然后事情变得更加复杂。
在Visual Studio 2017年,你会遇到类似的错误
Error: java.lang.TypeNotPresentException : Type io.reactivex.functions.Consumer not present
这将是无法找到这些类型的参考罐子,因为脱糖处理工作不正常。从GitHub的问题,你最终找到了原因:
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
这个bug已经被跟踪和固定在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类,你可以把它编译成一个罐子里。一个快速的方法来做到这一点是Java文件复制到一个文件夹。然后,该文件夹内创建一个名为output
文件夹。
调用此命令
javac -d ./output ThrowableExtension.java
然后移动到输出目录,并调用这个命令
jar cvf desugar.jar *
这将创建desugar.jar。补充一点,在你的Android结合项目的EmbeddedReferenceJar。你与Java 8字节码结合与脱糖现在应该工作。
希望这可能会在未来的Visual Studio版本来解决,因此所有这些步骤是没有必要的,但在那之前,你至少知道发生了什么,以及如何解决它。