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

Posted

技术标签:

【中文标题】在 Xamarin Studio 中启用 MultiDex 或 ProGuard 时出错【英文标题】:Error when enabling MultiDex or ProGuard in Xamarin Studio 【发布时间】:2017-03-16 06:10:51 【问题描述】:

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

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/ Xamarin.Android.Common.targets:错误:工具退出,代码:2。 输出:写入故障输出:字段引用过多:77369;最大限度 是 65536。您可以尝试使用 --multi-dex 选项。

将一些 nuget 更新到 MonoDroid 7 后出错。

当我在 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)

我可以看到与此相关的 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 - Unsupported class version number 52.0

Xamarin Android ProGuard Enable

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

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

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

是否会为此提供某种 Xamarin 支持,或者我是否需要考虑以某种方式减少我们使用的软件包等(我不确定我能做到,因为其中大部分与 Google Play 服务相关)。

感谢任何帮助。

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,混合模式)

【问题讨论】:

请关注此主题:http://***.com/questions/39514518/xamarin-android-proguard-unsupported-class-version-number-52-0/39514706#39514706 【参考方案1】:

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

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

参考:java Lang UnsupportedClassVersion Error in Xamarin Studio

2nd) MultiDex 可以在没有Proguard 的情况下使用,并且仅在 API-20 及以下版本中需要。启用 Multi-Dex 使 Android SDK 工具可以根据需要创建任意数量的辅助性文件。

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

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

或者使用基于 SourceForge 的:

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

【讨论】:

感谢@sushihangover 的帮助,我确实“安装”了 Java V8,但你的权利,如果使用 SDK(从帮助中添加 Java 版本 > 即将发布),我没有检查 xamarin 配置,将现在回顾。在 Xamarin 中使用 Multi-dex / Proguard 时,您能否编辑/评论 DEBUG 过程,如果我们支持 API 16-24,您能否进一步解释我们将如何在您提到 感谢 fb repo 的链接。【参考方案2】:

为了让未来的读者明白我在哪里处理这个问题 -

a) 52.0 错误是由于包含 Xamarin 的 ProGuard 版本需要更新到最新版本(即使在我已将我的 JDK 升级到 1.8 之后,正如所讨论的那样)-

Xamarin.Android Proguard - Unsupported class version number 52.0

注意:AFAIIA:如果不先修复 proguard 错误,我将无法运行 multi-dex。

b) 不幸的是,Xamarin Studio 允许您为调试构建打勾 proguard,但反过来实际上并没有为调试构建运行 ProGuard,如果您对使用它很陌生 + 试图弄清楚事情是如何结合在一起的,则会造成混乱。

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

默认情况下禁用 ProGuard。启用 ProGuard 选项是 仅在项目设置为发布模式时可用。所有 ProGuard 除非选中 Enable ProGuard,否则构建操作将被忽略。

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

调试 - 仅启用多路复用,这应该(在工作时,我仍在 XS 中工作)允许您按预期绕过 64K 错误,并且调试将按预期工作。 您应该像往常一样将链接器保留为 No Linking 以进行调试构建。

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

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

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

【讨论】:

【参考方案3】:

在 Xamarin Studio -> Preferences -> Projects -> SDK Locations -> Andorid 下指向我不再用于更新 SDK 更新的目录。将其更改为指向正确的 SDK 目录并构建成功。

【讨论】:

以上是关于在 Xamarin Studio 中启用 MultiDex 或 ProGuard 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何安装“Visual Studio的单声道调试”?

Xamarin Studio 无法识别配置文件

如何使用 Xamarin Visual Studio 2015 构建 Android App Bundle?

如何在 Visual Studio 2017 中执行 Xamarin.uwp

Visual Studio 中的 xamarin 是不是在 xamarin.form 中提供拖放功能?

如何在 Xamarin (Visual Studio) 中构建 XAP 文件