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)
此错误是由于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版本中解决此问题,因此不需要所有这些步骤,但是直到那时,至少您知道正在发生什么以及如何解决它。
归档时间: |
|
查看次数: |
628 次 |
最近记录: |