在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Xamarin Visual Studio 2015 构建 Android App Bundle?
如何在 Visual Studio 2017 中执行 Xamarin.uwp