如何使用proguard来混淆带有依赖项的jar文件

时间:2014-09-23 12:57:42

标签: maven intellij-idea proguard obfuscation

我在Idea IDE中构建了一个与maven有两个依赖关系(fastjson和volley)的jar,现在我想混淆我的jar但没有混淆两个依赖jar,我试过在proguardgui中做这个,我的proguard .pro内容如下:

-injars android_video_tv_sdk_player-1.0.0-SNAPSHOT-shaded.jar
-outjars android_video_tv_sdk_player-1.0.0-SNAPSHOT-proguard.jar

-libraryjars 'C:\Users\hangl\IDE\sdk\platforms\android-16\android.jar'
-libraryjars 'C:\Users\hangl\IDE\sdk\extras\android\support\v4\android-support-v4.jar'

-dontoptimize
-dontusemixedcaseclassnames
-dontpreverify
-verbose
-dontwarn com.alibaba.**,com.android.volley.**


-keep class com.ifeng.exception.InvalidParamsException

-keep class com.ifeng.media.** {
    <fields>;
    <methods>;
}

-keep class com.alibaba.** {
    <fields>;
    <methods>;
}

-keep class com.android.volley.** {
    <fields>;
    <methods>;
}

# Keep - Applications. Keep all application classes, along with their 'main'
# methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  PlayState {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
    native <methods>;
}

# Remove - System method calls. Remove all invocations of System
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.System {
    public static long currentTimeMillis();
    static java.lang.Class getCallerClass();
    public static int identityHashCode(java.lang.Object);
    public static java.lang.SecurityManager getSecurityManager();
    public static java.util.Properties getProperties();
    public static java.lang.String getProperty(java.lang.String);
    public static java.lang.String getenv(java.lang.String);
    public static java.lang.String mapLibraryName(java.lang.String);
    public static java.lang.String getProperty(java.lang.String,java.lang.String);
}

我的超级jar的主要包是com.ifeng.media,我想在这个包下保持类并在其他包中混淆其他类,但在我处理混淆了我的jar后,我发现混淆类中的大多数方法和文件都消失了!这是一个例子,我定义了类LogUtils.java,这里是代码:

/**
 * Created by hangl on 2014/9/19.
 */
public class LogUtils {

    private static boolean isDebug = true;

    public static void d(String tag, String msg) {
        if (isDebug) {
            Log.d(tag, msg);
        }
    }

    public static void v(String tag, String msg) {
        if (isDebug) {
            Log.v(tag, msg);
        }
    }

    public static void i(String tag, String msg) {
        if (isDebug) {
            Log.i(tag, msg);
        }
    }
    public static void e(String tag, String msg) {
        if (isDebug) {
            Log.e(tag, msg);
        }
    }
    public static void w(String tag, String msg) {
        if (isDebug) {
            Log.w(tag, msg);
        }
    }
}
在混淆之后,它变成了类a.class,现在它的代码变成你现在看到的:

import android.util.Log;

public class a
{
  private static boolean a = true;

  public static void a(String paramString1, String paramString2)
  {
    if (a) {
      Log.d(paramString1, paramString2);
    }
  }

  public static void b(String paramString1, String paramString2)
  {
    if (a) {
      Log.e(paramString1, paramString2);
    }
  }
}

我不知道为什么,其他类中存在同样的情况,我的proguard.pro文件有问题吗?谁能告诉我我需要做什么?   如果你有其他方法可以达到目标,比如在maven pom.xml中安装插件来混淆maven mudule(我已经尝试了这个,但我遇到同样的问题),请告诉我你的方式。谢谢!

1 个答案:

答案 0 :(得分:0)

ProGuard的目标是删除类,字段和方法,并尽可能重命名其余的类,字段和方法。在这方面,似乎工作正常。 LogUtils和NetUtils类被删除或重命名是合理的,因为它们位于com.ifeng.media。**之外,您将保留它们。您可以更清楚地说明您对处理过的代码的期望或遇到的问题?

如果您想将代码作为Android应用程序处理,可以查看ProGuard手册&gt;例子&gt;完整的Android应用程序。或者,Android Ant插件,Android Gradle插件,Android Eclipse插件或Android Maven插件可以为您提供很长的路要走。

如果您想将代码作为Android库处理,可以查看ProGuard手册&gt;例子&gt;典型的图书馆。或者,Android Gradle插件可能有所帮助。