23

我在处理 ProGuard 和 Android 时遇到问题。

我在网上搜索了几个小时,发现了多种混淆 Android 应用程序的方法。现在我正在尝试一种看起来最简单的方法,所以:

  • 我在config.cfg项目的根目录中创建了一个文件
  • proguard.config=config.cfg在我的project.properties
  • 我使用 Eclipse 导出向导导出并签署 .apk 文件

Proguard returned with error code 1. See console在控制台中收到一条消息:

Proguard returned with error code 1. See console
Note: there were 3847 duplicate class definitions.
Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry
Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry
Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry
Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry
      You should check if you need to specify additional program jars.
Warning: there were 4 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').
Error: Please correct the above warnings first.

即使我使用 Proguard 官方网站提供的配置或默认配置,我也会有错误。
这是我的自定义配置(myProject/config.cfg):

-injars      bin/classes
-injars      libs
-libraryjars "C:\Program Files\Android\android-sdk\platforms\android-13\android.jar"

-dontskipnonpubliclibraryclasses
-optimizationpasses 5
-printmapping map.txt
-flattenpackagehierarchy
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-keep public class * extends android.app.Application
-keep public class * extends android.app.Activity
-keep public class * extends android.app.PreferenceActivity
-keep public class * extends android.view.View
-keep public class * extends android.widget.BaseAdapter
-keep public class * implements android.view.View.OnTouchListener

-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.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

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

我无法让它工作......任何想法将不胜感激!

注意:libs我使用存储在我的项目文件夹中的 Jackson JSON 库

4

3 回答 3

35

1)ProGuard手册>疑难解答>注意:程序/库类的重复定义

Android Ant/Eclipse 版本已经为您指定了 -injars/-libraryjars。如果您在配置中再次指定它们,ProGuard 会指出它们是重复的。所以不要指定-injars/-libraryjars。

2) ProGuard 手册 > 故障排除 > 警告:找不到引用的类

org.w3c.dom.bootstrap.DOMImplementationRegistry 不存在于输入代码中,但 com.fasterxml.jackson.databind.ext.DOMSerializer 正在使用它。如果您的应用程序仍然有效,您可以让 ProGuard 接受它:

-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
于 2012-06-28T17:18:29.173 回答
5

此处提供的 ProGuard 配置文件:

https://groups.google.com/forum/#!msg/robospice/xGLRbGkLwQU/cAkaUQF34RsJ

解决我的问题!

于 2013-04-16T12:43:09.763 回答
1

我刚刚遇到了同样的问题,我通过引用 JRE rt.jar 文件解决了这个问题:

-libraryjars /lib/rt.jar

我希望它有帮助

于 2013-03-21T17:08:07.747 回答