在Android上使用ProGuard

fla*_*yte 23 java eclipse obfuscation android proguard

我在处理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.
Run Code Online (Sandbox Code Playgroud)

即使我使用官方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>;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*une 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
Run Code Online (Sandbox Code Playgroud)

  • @eyyo没看到你的评论.我记不太清楚,但我可能忽略了警告,或者只是禁用了优化,这可能不是最好的主意.但我需要一个快速的解决方案来为某人发布应用程序. (2认同)

And*_*son 5

此处提供的ProGuard配置文件:

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

解决我的问题!