在Xamarin Studio中启用MultiDex或ProGuard时出现错误

3
我最近在使用MonoDroid 7时突破了Dalvik限制 (https://developer.android.com/studio/build/multidex.html) ,导致出现以下错误:

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/ Xamarin.Android.Common.targets: Error: Tool exited with code: 2. Output: trouble writing output: Too many field references: 77369; max is 65536. You may try using --multi-dex option.

我更新了一些nugets后出现了错误。

当我在android设置中打开MultiDex选项并编译我的项目时,会出现以下情况-

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: 错误: 工具退出代码: 10. 输出: 错误: 无法读取 [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.1-3/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar] (无法处理类 [android/app/ActivityTracker.class] (不支持的类版本号 [52.0] (最大为 51.0,Java 1.7))) (pjr.mob.android)

我可以看到与此相关的错误。

https://bugzilla.xamarin.com/show_bug.cgi?id=44187

https://bugzilla.xamarin.com/show_bug.cgi?id=44013

https://bugzilla.xamarin.com/show_bug.cgi?id=33052

https://bugzilla.xamarin.com/show_bug.cgi?id=35491

看起来我需要按照这些答案的详细说明手动下载和安装ProGuard 5.X -

Xamarin.Android Proguard - Unsupported class version number 52.0

Xamarin Android ProGuard Enable

并解决由此引起的任何问题。

然而,Xamarin Studio明确告诉我们,在proguard选项旁边的(i)信息框中,不建议在DEBUG版本中运行proguard,并且我们应该在尝试proguard后才运行multidex。

这是否意味着启用后我们将无法有效地进行调试?但是我无法进行DEBUG(即使我认为链接器可能有所帮助,我现在甚至无法运行发布构建)而没有启用它?

这是否意味着Xamarin支持会针对此问题进行处理,还是我需要考虑如何减少我们使用的软件包等(我不确定是否可以这样做,因为其中大部分与Google Play服务相关)。

感谢任何帮助。

Xamarin Studio Help > About中的其他信息

Java SDK:/usr Java版本“1.8.0_112” Java(TM) SE运行时环境(构建1.8.0_112-b16) Java HotSpot(TM) 64位服务器虚拟机(构建25.112-b16,混合模式)


请关注这个线程: https://dev59.com/C1kS5IYBdhLWcg3wu4zL#39514706 - Robin Bruneel
3个回答

5

不支持的类版本号[52.0](最大值51.0,Java 1.7)

1.)您收到的错误是因为没有安装Java v8和/或未配置Xamarin使用它。

参考:java Lang UnsupportedClassVersion Error in Xamarin Studio

2.)MultiDex可以在不使用Proguard的情况下使用,并且仅需要在API-20及以下版本上使用。启用Multi-Dex使Android SDK工具能够创建所需数量的辅助dex文件。

3.)如果您启用了Proguard,则应查看将android-idk中的proguard.jar替换为Facebook版本,因为它速度非常快;-)

参考:https://github.com/facebook/proguard

或使用基于SourceForge的版本:

参考:Xamarin.Android Proguard - Unsupported class version number 52.0


感谢@sushihangover的帮助,我已经“安装”了Java V8,但你是对的,我没有检查xamarin配置是否使用了SDK(从帮助>关于中添加了Java版本到帖子中),现在将进行审核。您能否编辑/评论在Xamarin中使用Multi-dex / Proguard时的DEBUG过程,并且如果我们支持API 16-24,您可以进一步解释如何在此场景中使用multidex,因为您提到<20,所以不确定这如何适用。谢谢。 - WickedW
感谢提供 FB 存储库的链接。 - tedi

2
为了方便未来读者的理解,我想澄清一下以下几点:
a) 52.0错误是因为Xamarin附带的ProGuard版本需要更新到最新版本(即使我已经按照讨论升级了JDK到1.8)。
b) 不幸的是,Xamarin Studio允许你在调试构建中勾选pro guard,但实际上并不运行ProGuard,这会导致混淆使用较少的人感到困惑。
c) 因此,在达到MultiDex限制时,为了继续进行 -

调试 - 仅启用多路复用,这应该(当我还在XS上工作时)允许您按预期绕过64K错误,并且调试将按预期工作。对于调试版本,您应该像往常一样将链接器保留为无链接。

发布 - 首先启用ProGuard,以查看是否可以配置它以减少方法数,而不需要多dex的开销,因为它会在运行时带入辅助方法。如果您不想深入了解Proguard配置,则作为中间步骤,从DEBUG开始的多dex设置应该在完全测试后可以正常工作。

当任何文档声明您应该先尝试ProGuard,然后再使用multidex时,这意味着仅适用于发布版本,而不是调试版本。

更新:我还必须通过Xamarin支持才能让我的Multi-dex构建成功,但截至https://releases.xamarin.com/stable-release-cycle-8-service-release-1/,现在这个问题已经得到解决。我的安卓项目在XS中有一个自定义应用程序类,当勾选Multidex时,构建工具没有正确地从所需的multidex类继承它。


0
在 Xamarin Studio 中,依次选择“首选项”、“项目”、“SDK 位置”,发现 Android 指向的是一个我已经不再使用的目录,因为我最近更新了 SDK。将其更改为正确的 SDK 目录后,构建成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接