Xamarin.Android结合无效的操作码

问题描述 投票:1回答:1

最近接到一个新的Android SDK(AAR)在Xamarin绑定。当最初开始结合我收到错误

COMPILETODALVIK : Uncaught translation error : com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
xamarin xamarin.android
1个回答
5
投票

这个错误是由于包含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版本来解决,因此所有这些步骤是没有必要的,但在那之前,你至少知道发生了什么,以及如何解决它。

© www.soinside.com 2019 - 2024. All rights reserved.