升级到 Proguard 4.8 后无法导出应用程序

Posted

技术标签:

【中文标题】升级到 Proguard 4.8 后无法导出应用程序【英文标题】:Failed to export application after upgrade to Proguard 4.8 【发布时间】:2012-06-17 18:18:11 【问题描述】:

我刚刚将我的 android SDK、ADT 和 Proguard 升级到了最新最好的版本。

我的项目编译构建并在调试模式下运行良好,但是当我尝试导出它的签名发布 APK 时,我收到来自导出向导的错误 在 Eclipse 控制台上没有任何错误日志消息! *

如果我尝试通过Window->Show View->Error Log 查看错误日志,我看到的都差不多:

我不知道该怎么做,因为 Eclipse 和 Proguard 都不会给出任何提示关于问题可能是什么。

在最近的升级之前,我的项目导出良好。没有构建警告。没有 lint 警告!

我在$sdk.dir\tools\proguard\proguard-android.txt使用Android的标准配置文件:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-dontoptimize
-dontpreverify

-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgent
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * 
    native <methods>;


-keep public class * extends android.view.View 
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);


-keepclasseswithmembers class * 
    public <init>(android.content.Context, android.util.AttributeSet);


-keepclasseswithmembers class * 
    public <init>(android.content.Context, android.util.AttributeSet, int);


-keepclassmembers class * extends android.app.Activity 
   public void *(android.view.View);


-keepclassmembers enum * 
    public static **[] values();
    public static ** valueOf(java.lang.String);


-keep class * implements android.os.Parcelable 
  public static final android.os.Parcelable$Creator *;


-keepclassmembers class **.R$* 
    public static <fields>;


-dontwarn android.support.**

而我项目的 proguard.cfg 只包含:

-assumenosideeffects class android.util.Log 
    public static *** v(...);
    public static *** i(...);
    public static *** d(...);
    public static *** w(...);
    public static *** e(...);

以前有人见过这个问题吗? 知道如何解决这个问题吗?

取得了一些进展?自从我通过以下方式升级以来,我第一次能够导出签名的 APK:

    我运行 CCleaner 来清理 Windows 系统中的所有临时文件和缓存, 然后我重新启动了 Windows。

但令我沮丧的是,下次我再次尝试导出已签名的 APK 时,我收到了相同的 Failed to export application,但没有控制台消息!再次!

现在我很清楚,Android 开发工具变得不稳定。每次我想导出签名的 APK 时,我都无法真正运行 CCleaner 并重新启动 Windows。而且我不在乎是谁的错:Android SDK? ADT 插件?普罗卫士?

我现在该怎么办?

还有一些进展吗?我尝试在关闭 Proguard 的情况下导出已签名的 APK。它导出正常,但是当我启动它时,它立即崩溃,因为找不到应用程序的活动类 (ClassNotFoundException)。这很奇怪!它在调试模式下运行良好,如果应用程序的活动类不存在,它不应该编译!这是怎么回事?最新最好的 Android 开发工具是否损坏了?

我尝试使用this solution(以及this one)中描述的Order and Export标签,但没有帮助。

我现在该怎么办?

【问题讨论】:

【参考方案1】:

你正在运行 Windows XP,所以我不确定我是否能提供帮助(我正在运行 Windows 7 64 位)但你对 @Boe-Dev 的评论关于“17 个未解决的类引用”提醒了我我最近经历了与你类似的升级:

我 solved it 将下面的行放在 proguard.cfg 中:

-dontwarn com.bta.myapp.MyAppActivity.R**

不知道你的问题是否和我的一样,但可能值得一试。

编辑:注意到即使您关闭 Proguard 时您也遇到问题,我可以提出以下建议吗?

    从标准 Java 构建路径中删除库:右键单击项目名称 > 属性 > Java 构建路径 > 选项卡库 > 删除除“Android X.X”和“Android 依赖项”之外的所有内容 将库文件夹从“lib”重命名为“libs”。这样,“libs”文件夹中的所有库都会被 Android 插件找到并添加到项目的“Android Dependencies”项中 清理项目(考虑到 Android 开发工具的不可预测性,这始终是必要的)

让我们知道它是如何工作的。

【讨论】:

感谢 +1 给予我片刻的希望。您的解决方法对我的情况没有帮助,但在那之后我所做的让我自升级以来第一次导出签名的 APK!这是我所做的:(1)我运行 CCleaner 来清理 Windows 系统中的所有临时文件和缓存,(2)然后我重新启动 Windows。它奏效了!但令我沮丧的是,下次我尝试导出时收到了相同的Failed to export application,但没有控制台消息!。现在我很清楚,Android 开发工具已经变得不稳定。我现在该怎么办? 成功了! 没有 -dontwarn。结果我需要在您的编辑中为我的应用程序项目所依赖的每个库项目执行步骤#1 和#2。那是魔术。谢谢!你摇滚!!!【参考方案2】:

你的错误日志怎么样。窗口->显示视图->错误日志。与控制台输出是分开的,错误代码 1 往往会出现在这里。

【讨论】:

感谢 +1 给予我片刻的希望。错误日志没有提供更多信息(请参阅原始帖子中的屏幕截图更新)。 关闭 proguard 后是否可以导出? 是的,它在 Proguard 关闭的情况下导出正常。但是当我启动它时,它会因为找不到应用程序的活动类(ClassNotFoundException)而立即崩溃。这很奇怪!它在调试模式下运行良好,如果应用程序的活动类不存在,它不应该编译!这是怎么回事?最新最好的 Android 开发工具是否损坏?【参考方案3】:

尝试在 eclipse 中重新安装 ADT 插件

【讨论】:

哈哈。看起来像voodoo。也许 OP 也应该升级他的 Eclipse?他没有提供任何关于他的 Eclipse 版本的信息。 @BillTheApe 不是巫毒教。 Proguard 地狱:***.com/questions/6974231/… @BillTheApe 我的 Eclipse 是 3.6.2。这是一个问题吗?如何重新安装我的 ADT 插件?我启动了 Android SDK Manager,它显示 Android SDK Tools Rev 19 和 Android SDK Platrform-tools Rev 11 已安装并且是最新的。如何让它们重新安装? 去帮助>关于eclipse>安装细节然后选择ADT部件卸载它。 @Boe-Dev 谢谢。我就是这样做的,我不再收到“无法导出应用程序”,但现在我收到了一个以前从未见过的新错误Proguard returned with error code 1. See console,控制台显示了 17 个未解决的类引用。当然,所有这些类都存在,所以我不知道它为什么会失败以及从这里去哪里。有什么建议吗?【参考方案4】:

这是对我有用的关键

http://android.foxykeep.com/dev/fix-the-conversion-to-dalvik-format-failed-with-error-1-with-adt-14

据说在 ADT-15 中已修复,解决方法是

1) 对于每个 X_src 元素,右键单击它,然后构建路径 > 从构建路径中删除。

2) 将打开一个弹出窗口。确保选中“同时从项目中取消链接文件夹”,然后接受它。

您仍然可以调试库代码,但您需要管理这些项目中的断点,然后在类文件选项卡中单步执行代码。

【讨论】:

以上是关于升级到 Proguard 4.8 后无法导出应用程序的主要内容,如果未能解决你的问题,请参考以下文章

启用 Proguard 后“应用程序停止工作”

升级Android Studio 3.1.2后,ProGuard配置解析器出错?

升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类

Android - proguard 和 google play 服务的应用程序导出错误

导出已签名、混淆的 Android 应用程序时,如何在 Eclipse 中设置 ProGuard?

Android Studio 更新后 ProGuard 无法正常工作