在Android的导出过程中(adt 21),转换为Dalvik格式失败,错误代码为1。

13

我知道这个问题的形式已经存在了,但是我找不到与我的情况完全匹配的内容,所以在这里提出它。

当我在模拟器测试时,我的应用程序可以完美地编译和运行,但是当我尝试导出已签名的apk时,我会收到 "Conversion to Dalvik format failed with error 1" 的错误。Eclipse错误日志显示了以下堆栈跟踪:

com.android.ide.eclipse.adt.internal.build.DexException: Conversion to Dalvik format failed with error 1
at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:751)
at com.android.ide.eclipse.adt.internal.project.ExportHelper.exportReleaseApk(ExportHelper.java:269)
at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.doExport(ExportWizard.java:296)
at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.access$0(ExportWizard.java:233)
at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard$1.run(ExportWizard.java:218)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)

我似乎没有其他人经常遇到的名称冲突问题(至少错误信息中没有这样说),而且我很困惑为什么它在模拟器中可以运行,但无法导出。

顺便说一下,我也没有使用ProGuard。


访问此处以查看相同问题的讨论,可能会对您有所帮助 https://dev59.com/43E85IYBdhLWcg3wpFEa?rq=1 - manish
在这种情况下帮助我的方法是:删除“bin”文件夹中的所有内容,清理项目,在测试设备上运行应用程序,然后再次构建签名发布apk。 - dy_
3个回答

27
看起来 ADT 21 会在 bin 中添加一个名为 dexedLibs 的文件夹,将 jar 和库放入预编译的 dex 代码中,应该能加快部署速度。我在那里有两个版本的支持库,所以我删除了文件夹中的所有文件并重新构建,然后它就起作用了。如果我尝试使用其中任何文件进行构建,则构建将失败,因此我必须在每次导出之前删除它们。 我正在使用 ActionBar Sherlock,这可能与 dexedLibs 产生冲突,因为除非最初为空,否则它不会显示在那里。
编辑:当这个问题首次出现时,我一直在使用 ActionBarSherlock,但最近已经切换到ActionBarCompat。自从切换后,我不再需要在导出时删除 dexedLibs 文件夹。看起来 ActionBarSherlock 可能是罪魁祸首,但我不能确定。

12

前往项目并取消“自动构建”选项。 然后清理项目并重新构建所有内容。 对我有用以导出签名应用程序包。


2

经过多次尝试,我成功找到了这个问题产生的原因。一般来说,这是由ProGuard引起的,特别是它的优化。至少在我的情况下,有4个受损项目出现了这个错误,但是在我禁用了ProGuard优化后,它们都能够正确构建。 因此,在您的ProGuard配置中,注释掉-optimizations和-optimizationpasses选项,并添加-dontoptimize选项。

# -optimizations ...
# -optimizationpasses 5

-dontoptimize

希望这可以帮到你。

我尝试了所有建议的解决方案,但只有这个对我有效。 - Beshoy Fayez
但这不是很糟糕吗?我的意思是,假设我想发布我的应用程序。去优化的版本不会比优化后的版本更糟糕吗?在我进行了一些代码更改之后,这个问题发生了,所以我想知道ProGuard是否混淆了我引入的一些新符号... - user1300214

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