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

Error when enabling MultiDex or ProGuard in Xamarin Studio

我最近突破了 Dalvik 限制 (https://developer.android.com/studio/build/multidex.html) 当我开始获得 64K 参考资料时

/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 更新到 MonoDroid 7 后出错。

当我在 android 设置中打开 MultiDex 选项并编译我的项目时,我得到 -

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: Error: Tool exited with code: 10. Output: Error: Can't read [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.1-3/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar] (Can't process class [android/app/ActivityTracker.class] (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) (pjr.mob.android)

我可以看到与此相关的 BUG -

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 Enable

并克服由此产生的任何问题。

然而,Xamarin Studio 在 proguard 选项旁边的 (i) 信息框中明确告诉我们不建议 运行 proguard 用于 DEBUG 构建,我们应该只 运行 先尝试 proguard 后的 multidex。

这是否意味着我们无法在启用它后进行有效调试?但无论如何我都无法调试(我什至无法 运行 发布版本,即使我使用的链接器也是如此想法可能会有所帮助)现在不启用它?

是否有某种 Xamarin 支持来解决这个问题,或者我是否需要考虑以某种方式减少我们使用的包等(我不确定我能做到,因为其中大部分是 Google 播放服务相关)。

感谢任何帮助。

来自 Xamarin Studio 帮助的其他信息 > 关于

Java SDK: /usr java 版本“1.8.0_112” Java(TM) SE 运行环境(build 1.8.0_112-b16) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.112-b16,混合模式)

Unsupported class version number [52.0] (maximum 51.0, Java 1.7)

1st) 你得到的错误是因为没有安装 Java v8 and/or Xamarin 配置为使用它。

参考:

2nd) MultiDex 可以在没有 Proguard 的情况下使用,并且仅在 API-20 及以下需要。启用 Multi-Dex 使 Android SDK 工具能够根据需要创建尽可能多的第二性文件。

3rd) 如果您启用 Proguard,您应该考虑将 android-idk 中的 proguard.jar 替换为 Facebook 版本,因为它快得多 ;-)

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

或者使用基于 SourceForge 的:

参考:

为未来的读者阐明我从哪里得到这个 -

a) 52.0 错误是由于 Xamarin 随附的 ProGuard 版本需要更新到最新版本(即使我已经按照讨论将 JDK 升级到 1.8 之后)-

注意:AFAIIA:如果不先修复混淆器错误,我无法 运行 多 dex。

b) 不幸的是,Xamarin Studio 允许您为调试构建勾选 pro guard,但实际上并没有 运行 ProGuard 用于调试构建,如果您对使用它很陌生 + 试图解决问题,则会造成混淆事情是如何联系在一起的。

xamarin 文档在检查时告诉您这一点,VS 可能就是这种情况 -

ProGuard is disabled by default. The Enable ProGuard option is available only when the project is set to Release mode. All ProGuard build actions are ignored unless Enable ProGuard is checked.

c) 因此,当达到 MultiDex 限制时;为了进步-

DEBUG - 仅启用多路复用,这应该(在工作时,我仍在 XS 中处理它)允许您按预期绕过 64K 错误并且调试将按预期工作。 对于调试版本,您应该像往常一样将链接器设置为无链接。

RELEASE - 首先启用 ProGuard 以查看是否可以将其配置为减少方法数而不需要开销或 multidex,因为它在 运行 时引入了辅助方法。 如果您不想弄乱 Proguard 配置,那么作为一个中间步骤,您从 DEBUG 进行的 multidex 设置应该在经过全面测试后才适用于您的发布。

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

更新:我还必须通过 Xamarin 支持来构建我的 Multi-dex,但从 https://releases.xamarin.com/stable-release-cycle-8-service-release-1/ 开始,它现在工作正常。我在 XS 中的 Android 项目有一个自定义应用程序 class,当勾选 Multidex 时,构建工具没有从所需的 multidex class 正确继承它。

在 Xamarin Studio 下 -> 首选项 -> 项目 -> SDK 位置 -> Andorid 指向一个目录,我不再使用该目录进行更新的 SDK 更新。将其更改为指向正确的 SDK 目录并构建成功。