Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin构建错误编译可以';无法完成,因为缺少某些库类_C#_Android_Xamarin - Fatal编程技术网

C# Xamarin构建错误编译可以';无法完成,因为缺少某些库类

C# Xamarin构建错误编译可以';无法完成,因为缺少某些库类,c#,android,xamarin,C#,Android,Xamarin,当我尝试构建我的Xamarin.Droid项目时,我得到以下构建错误: 2>R8 : warning : Missing class: java.lang.ClassValue 2>R8 : error : Compilation can't be completed because some library classes are missing. 我每天都会犯这个错误。。。有没有办法找到需要java.lang.ClassValue的地方,或者手动添加它 编辑: 我做了一些研究,

当我尝试构建我的Xamarin.Droid项目时,我得到以下构建错误:

2>R8 : warning : Missing class: java.lang.ClassValue
2>R8 : error : Compilation can't be completed because some library classes are missing.
我每天都会犯这个错误。。。有没有办法找到需要java.lang.ClassValue的地方,或者手动添加它

编辑: 我做了一些研究,得到了一些新的信息:当我在另一台机器上构建解决方案时(我这里是Microsofts AppCenter),它构建起来没有任何问题。所以我认为我的解决方案很好,也许android sdk或jdk有问题。
所以我创建了一个新的Xamarin.Forms项目并构建了android部分,该部分工作起来没有任何问题。所以android sdk或jdk看起来不错。

这并不是一个确切的解决方案,但它可能会为您指明正确的方向。我目前收到这条消息是由于我们自己维护的绑定Android库。当我从项目中删除NuGet时,消息将消失,代码将编译。显然,我也不能使用这个库来利用程序的功能,但至少看起来这个库导致了这个问题。。。你的情况可能也是这样吗


是什么为我解决了这个问题 在我知道哪个库导致了问题之后,我决定使用我专门为测试该库而编写的一个演示应用程序进一步深入研究它。从这里我发现,启用d8索引或r8代码收缩以及多重索引是导致问题的原因。您可以使用或,因此:

  • 打开代码收缩器选项,如ProGuard或r8,并使用d8索引
  • 对于多重索引,使用d8索引和可选的代码收缩器
我的建议是使用后者,就像使用d8索引一样,您的索引参考表应该更高效、更小,这意味着您可能不再需要多重索引

此外,上面的分辨率似乎不能很好地处理链接,所以将链接选项设置为“无”

Mac-CI中的几个问题 在我修复了以上所有问题后,当我试图在Mac CI上编译我们的应用程序时,遇到了一个进一步的问题,这告诉我Mono.Android.dll无法进行AOT编译。显然,这是一个文件对于Mac上的LLVM来说太大的问题,不过,如上所述,解决方案是简单地关闭LLVM


更好的修复方法 今天,有人向我指出了另一组可能的修复方法。本页实际上提到了三个修复方案,其中选项B是首选方案,因为这与“来自的上游建议”(引用自)一致

对我来说,选项A——恢复到dx索引——并没有很好地工作,因为尽管我能够删除与java.lang.ClassValue相关的警告,但我得到了一大堆其他警告。在这方面,使用ProGuard规则和R8组合使用的选项B是一个更好的选择,因为这使我也可以消除所有其他警告。事实上,尽管如此,这消除了选项B和C之间的差异,因为它们的结果因此变得相同。然而,仅仅按照本文中的建议,我的应用程序在发布时就开始崩溃。为了解决这个问题,我必须检查Logcat中的错误,它向我显示了一个需要链接的类。添加另一个规则以显式保留该类,然后最终解决了问题的其余部分,并给出了以下ProGuard配置:

-dontwarn java.lang.ClassValue
-dontwarn kotlin.jvm.internal.Lambda
-dontwarn kotlin.jvm.functions.Function1
-dontwarn kotlin.jvm.internal.markers.KMappedMarker
-dontwarn kotlin.jvm.functions.Function0
-dontwarn kotlin.coroutines.jvm.internal.SuspendLambda
-dontwarn kotlin.jvm.functions.Function2
-keep class com.google.android.material.internal.BaselineLayout

通过这种配置,我现在可以再次使用AOT和LLVM。

我搜索一些信息,然后找到,将Dex编译器设置为dx进行尝试。我已经做好了准备。它没有改变什么。。。