使用 ProGuard 和 Android 应用程序时资源重复

Posted

技术标签:

【中文标题】使用 ProGuard 和 Android 应用程序时资源重复【英文标题】:Duplicate resources when using ProGuard and an Android application 【发布时间】:2012-02-03 05:32:29 【问题描述】:

我正在尝试将 ProGuard 与我的一个应用程序一起使用,比如 A。这个应用程序包含另一个应用程序作为库(比如 B)。这是我的 proguard 文件。

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * 
    native <methods>;


-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 *;


-injars      bin/classes
-libraryjars lib 

当我第一次执行它时,我得到了以下错误:

 Proguard returned with error code 1. See console
[2012-01-05 12:18:55 - BSabadellHC-Entrega] Note: there were 1059 duplicate class     definitions.
[2012-01-05 12:18:55 - BSabadellHC-Entrega] java.io.IOException: Can't write     [/private/var/folders/19/321lw_654pzdqr8y34ysvsx80000gn/T/android_7971378611269030364.jar]     (Can't read     [/private/var/folders/19/321lw_654pzdqr8y34ysvsx80000gn/T/android_1457478862713006376.jar]     (Duplicate zip entry [com/ideaknowing/labs/android/ikarengine/e.class ==     android_1457478862713006376.jar:com/ideaknowing/labs/android/ikarengine/R$anim.class]))

对我来说相关的部分是:

有重复的对象 他们应该是因为 R 文件。控制台说R$anim里面有重复资源(当然,因为应用A和库B都包含动画、布局等)。

所以我的想法显然是从 ProGuard 中排除 R 文件,为此我添加了以下代码行:

-keep public class net.firsrproject.android.R
-keep public class com.ideaknowing.labs.android.ikarengine.R 

尽管如此,我仍然遇到同样的错误(所以我猜这些文件仍然包含在 Proguard 中)。有没有人从 ProGuard 中删除 R 文件的经验?关于如何摆脱这个错误有什么提示或建议吗?

谢谢,问候

【问题讨论】:

这个运气好吗?我收到了类似的错误。 即使我收到同样的错误。运气好了吗? 【参考方案1】:

如果您使用的是 android 库项目,请删除 -injars bin/classes,因为使用此选项处理库中的类文件两次(这对我来说与 this 结合使用)。

如果上述方法不起作用,请尝试-dontnote 选项。

【讨论】:

以上是关于使用 ProGuard 和 Android 应用程序时资源重复的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ant 和 Proguard 编译 Android 应用程序的问题

在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,只有第二次出现警告/注释?

android应用程序中的proguard

通过在 Android 中实现 Proguard 在使用 JDBC 的 Asynctask 中应用程序崩溃

使用 ProGuard 导出 Android 应用程序会出现 ParseException 错误

使用 Android 库项目设置 ProGuard