Android Build 使用 Proguard 和 Gradle 失败

Posted

技术标签:

【中文标题】Android Build 使用 Proguard 和 Gradle 失败【英文标题】:Android Build fails using Proguard and Gradle 【发布时间】:2013-09-20 22:05:48 【问题描述】:

我最近将一个项目从 eclipse/ant 转换为使用 android Studio/Gradle。我的调试版本工作正常,但是当我尝试在启用 proguard 的情况下进行发布版本时,它失败并出现以下错误

16:26:13.437 [ERROR] [system.err] Unexpected error while computing stack sizes:
16:26:13.438 [ERROR] [system.err]   Class       = [com/a/a/a/d/d]
16:26:13.438 [ERROR] [system.err]   Method      = [<clinit>()V]
16:26:13.438 [ERROR] [system.err]   Exception   = [java.lang.IllegalArgumentException] (Stack size becomes negative after instruction [143] swap in [com/a/a/a/d/d.<clinit>()V])

我在我的 Eclipse 项目中使用了相同的 proguard.txt,它运行良好,因此表明 Gradle Android 插件存在某种问题。有没有人遇到过类似的问题?我的 proguard 配置 - http://pastebin.com/2gsNUmeD 和完整的 gradle 输出 http://pastebin.com/TAvMUSrR

【问题讨论】:

【参考方案1】:

ProGuard 在 Ant、Eclipse 和 Gradle 中的行为确实应该相同。您应该检查您的构建是否使用不同版本的 ProGuard。您可以在控制台日志中查看版本。如果您知道正在使用哪个 ProGuard jar,也可以输入 java -jar proguard.jar 以获取版本。

错误消息表明 ProGuard 的优化步骤中存在错误。希望该错误发生在旧版本中,而不是新版本中。然后,您可以简单地升级 jar。否则,您可以在ProGuard's bug tracker 上报告它,最好有足够的信息来重现问题。作为一种解决方法,您可以使用选项 -dontoptimize 禁用优化。

【讨论】:

android gradle 插件使用的是 ProGuard 4.9。如果我用 -dontoptimize 尝试它,那么它可以正常工作。我会看看能不能找到一个重现问题的小样本。 您好,感谢您的回答埃里克。我想通过 ProGuard 从我的构建中删除所有日志,并通过您的回答 here 这样做。但我需要使用proguard-android-optimize.txt,将-dontoptimize 插入我的应用程序的proguard-rules.txt 会消除优化proguard 配置的效果。更重要的是,如果我使用-dontoptimize,我将无法删除我的日志。我们有什么办法可以做到这一点?我正在使用 Android Studio,并且我已经在 sdkdir/tools/proguard/lib 文件夹中将我的 Proguard jar 升级到了 5.0 版。 @waynesford Ant 和 Eclipse 使用 sdkdir/tools/proguard/lib/proguard.jar,但 Android Studio 和 Gradle 从 Maven Central 下载并使用 Android 插件(当前为 0.13.0)和 ProGuard 插件(当前为 4.11)。您应该检查 ProGuard 5.0 是否有帮助,然后尝试说服 Gradle 使用它。 gradle-proguard 插件 5.0 仍然存在这个问题,并且看起来无法在 gradle 中使用 proguard 4.7。顺便说一句:添加 gradle-proguard 插件 5.0 classpath 'net.sf.proguard:proguard-gradle:5.0' @andyao 如果您仍然看到这样的错误消息,请在 ProGuard 错误跟踪器上报告(或邮寄给我)并附上样本以重现它。

以上是关于Android Build 使用 Proguard 和 Gradle 失败的主要内容,如果未能解决你的问题,请参考以下文章

升级 android build:gradle:4.0.0 后在 proguard 中显示错误

带有 proguard 的 Android ant build.xml 未在发行版中构建

使用 Multidex 的 Android proguard

Android 安装包优化开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )

使用 Proguard DX SimException 本地 0000 构建的 Android:无效

Proguard NoClassDefFoundError