使用 Multidex 构建 xamarin.android 时出现 CREATEMULTIDEXMAINDEXCLASSLIST 错误

Posted

技术标签:

【中文标题】使用 Multidex 构建 xamarin.android 时出现 CREATEMULTIDEXMAINDEXCLASSLIST 错误【英文标题】:CREATEMULTIDEXMAINDEXCLASSLIST error when building xamarin.android using Multidex 【发布时间】:2018-02-09 23:58:46 【问题描述】:

编辑 - 减少到问题的根源

启用 Multi-Dex 时出现此错误。

CREATEMULTIDEXMAINDEXCLASSLIST : 错误 : 在参数号 2 中的 '.jar' 之前需要类路径分隔符 ':'

我已经追踪到这个 jar 文件包含在 ProGuard 命令行中:

obj/Debug/__library_projects__/DeviceAPI_android/library_project_imports/DeviceAPI_Android.Jars.cw-deviceapi(2016.05.16).jar

是文件名中的括号导致错误。我已经通过在终端提示符下运行命令并删除了这个 jar 文件证明了这一点,并且一切正常。

所以问题是——这个文件是从哪里来的?是在包里吗?我在那儿看不到。

如果我能找到我应该能够更正名称并构建项目。

我已将其追踪到名为 DeviceAPI_Android.dll 的第 3 方绑定库,该库包含一个用于控制硬件条形码扫描仪的 jar 文件。 jar 文件的文件名中确实包含括号和日期。

所以解决方案是以下一种或多种:

从供应商处获取具有更好命名的 jar 文件的新版本绑定库。

使用命名更好的 jar 文件自己重建库。可能存在问题,因为我必须从头开始创建转换等。

调整构建工具/makefile,使 ProGuard 命令行对奇怪命名的 jar 文件更具弹性。

演示问题的示例项目位于 GitHub here。

版本信息: === 适用于 Mac 的 Visual Studio 社区 2017 ===

7.1 版(内部版本 1297) 安装UUID:650b4c91-c7f5-4ee5-ad70-6f178f314906 运行: 单声道 5.2.0.215 (d15-3/da80840)(64 位) GTK+ 2.24.23(罗利主题)

Package version: 502000215

=== NuGet ===

版本:4.3.0.2418

=== .NET 核心 ===

运行时:未安装 SDK:未安装 MSBuild SDK:/Library/Frameworks/Mono.framework/Versions/5.2.0/lib/mono/msbuild/15.0/bin/Sdks

=== Xamarin.Profiler ===

版本:1.5.5 位置:/Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Xamarin.Android ===

版本:7.4.0.21(Visual Studio 社区) Android SDK:/Users/jameslavery/Library/Developer/Xamarin/android-sdk-macosx 支持的安卓版本: 2.3(API 级别 10) 4.0.3(API 级别 15) 4.1(API 级别 16) 4.3(API 级别 18) 4.4(API 级别 19) 5.0(API 级别 21) 5.1(API 级别 22) 6.0(API 级别 23) 7.0(API 级别 24) 7.1(API 级别 25)

SDK 工具版本:25.2.5 SDK平台工具版本:25.0.5 SDK 构建工具版本:25.0.3

Java SDK:/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home java版本“1.8.0_144” Java(TM) SE 运行时环境 (build 1.8.0_144-b01) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.144-b01,混合模式)

Android Designer EPL 代码可在此处获得: https://github.com/xamarin/AndroidDesigner.EPL

=== 苹果开发者工具 ===

Xcode 8.0 (11246) 构建 8A218a

=== Xamarin.ios ===

版本:10.12.0.20(Visual Studio 社区) 哈希:80b8487d 分公司:d15-3 构建日期:2017-08-18 16:07:26-0400

=== Xamarin.Mac ===

版本:3.6.0.19(Visual Studio 社区)

=== Xamarin 检查器 ===

版本:1.2.2 哈希:b71b035 分公司:d15-1 构建日期:格林威治标准时间 2017 年 4 月 21 日星期五 17:57:12

=== 构建信息 ===

版本号:701001297 Git 修订:9c5299666538b2f8baf501418a5c064d784d64da 构建日期:2017-08-07 11:29:35-04 Xamarin 插件:3bb0c32a14f1b7e368bf5ac53a84c3581c019391 构建通道:monodevelop-lion-d15-3

=== 操作系统 ===

Mac OS X 10.11.6 达尔文 15.6.0 达尔文内核版本 15.6.0 2016 年 6 月 23 日星期四 18:25:34 PDT 根:xnu-3248.60.10~1/RELEASE_X86_64 x86_64

=== 启用用户安装插件 ===

LiveXAML 1.0 Redth 的插件 1.0.9

【问题讨论】:

确保清除本地构建缓存(bin/obj 文件夹)。其次,将诊断构建输出日志上传到您的帖子,这样我们就可以看到正在使用哪些工具。谢谢! 尝试清除 bin/obj(并在此之前进行“清理”,然后退出 Visual Studio) - 不幸的是没有解决它。这是我尝试的第一件事! 我已经上传了诊断构建输出。我也试过同时启用 ProGuard 和 Multi-Dex - 同样的问题。我之前假设如果我们使用 Multi-Dex,我们就不需要 ProGuard。 我还在我的帖子中添加了与 ProGuard 有关的特定构建输出。 您不必启用这两个项目来获得任何一种效果(Proguard - 代码收缩/Multidex - 过度填充 dex 文件)。乍一看,这个proguard.jar 调用看起来会失败。由于我在本地没有这个项目(这将是下一步),我建议您手动运行proguard.jar 命令,看看是否会抛出更好的输出或相同的错误。如果是这样,我们可以查看每个.jar 声明以确保有一个: 分隔符。 【参考方案1】:

我已针对此问题报告了以下错误:

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

请随时自行抄送此问题,以便在问题得到解决时得到通知。目前,您必须通过以某种方式重命名 .jar 来解决此问题。

我希望这会有所帮助!

【讨论】:

【参考方案2】:

这是因为有一个包含嵌入 Jar 文件的绑定库,其文件名中带有括号 - 这会导致 ProGuard 的命令行失败。

@jondouglas 为此提交了Xamarin bug 59237。希望解决方法是让 ProGuard 的命令行对奇怪命名的文件更具弹性。

与此同时,我将不得不获取一个更新的绑定库,其中嵌入的 jar 文件的名称中没有带括号(或其他破坏命令行的字符)。

感谢@jondouglas 帮助诊断问题。

【讨论】:

以上是关于使用 Multidex 构建 xamarin.android 时出现 CREATEMULTIDEXMAINDEXCLASSLIST 错误的主要内容,如果未能解决你的问题,请参考以下文章

Android 65536启用 multidex

使用 Multidex 的 Android proguard

异步加载multidex

如何使用新的 Android Multidex 支持库启用多索引

如何使用新的 Android Multidex 支持库启用多索引

APK方法数超过65535及MultiDex解决方案