【问题标题】:how to obfuscate jar file with dependencies by using proguard如何使用 proguard 混淆具有依赖项的 jar 文件
【发布时间】:2014-11-17 16:44:06
【问题描述】:

我正在使用 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);
}

我的 uber 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);
        }
    }
}

混淆后变成了class 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(我已经尝试过,但我遇到了同样的问题),请告诉我你的方法。谢谢!

【问题讨论】:

  • 您的配置看起来正确。你确定LogUtils 在包com.ifeng.media 内吗?请注意,您的配置是指main 方法,该方法适用于Java 应用程序。 ProGuard 文档中的示例为 Android 提供了配置。
  • 感谢您的回复,在我的sdk jar中,有四个包,com.ifeng.media(主包),com.ifeng.exception,com.ifeng.utils,com.ifeng.statistics , utils包下的LogUtils,而我的jar不是可运行的jar,没有包含main方法的类,我将查看有关proguard的文档以获得答案。
  • @Eric Lafortune 我已经阅读了你的 proguard 主页,我意识到 proguard 将删除未使用的类和方法,我再次检查我的代码发现我只在 LogUtils 中使用了两种方法,所以我'已经在我的问题中描述过可以解释,现在我想知道我可以配置一些属性来保留这个未使用的方法吗? proguard 中是否提供一些属性,例如 keepunusedmethods?
  • @Eric Lafortune,还有一个问题,在com.ifeng.utils包下有NetUtils.java、NetUtils和LogUtils三个java文件,我其实都用了,但是混淆了我的jar之后,在这个包下只能找到两个混淆的类,就像你说的“它检测并删除未使用的类、字段、方法和属性”。这似乎无法解释我所经历的。你能告诉我为什么吗?感谢您的回复。

标签: maven intellij-idea proguard obfuscation


【解决方案1】:

ProGuard 的目标是删除类、字段和方法,并尽可能重命名剩余的类、字段和方法。在这方面,它似乎运作良好。删除或重命名 LogUtils 和 NetUtils 类是合理的,因为它们位于您保留的 com.ifeng.media.** 之外。您也许可以更清楚地说明您的期望或处理后的代码遇到什么样的问题?

如果您想将代码作为 Android 应用程序处理,可以查看 ProGuard 手册 > 示例 > 完整的 Android 应用程序。或者,Android Ant 插件、Android Gradle 插件、Android Eclipse 插件或 Android Maven 插件可以让您走得更远。

如果你想将代码作为 Android 库处理,可以查看 ProGuard 手册 > 示例 > 典型库。或者,Android Gradle 插件可能会有所帮助。

【讨论】:

  • 谢谢,在阅读了更多关于如何使用 proguard 的内容后,我生成了混淆的 android lib,它运行良好。
  • ,我也尝试使用proguard-gui来混淆代码,除了keep classes和enum,我也想在我的sdk中保留interface,但是我只是找到了keep class\enum\RMI等的入口,但是没有找到公共接口的入口,在哪里?
猜你喜欢
  • 2016-04-22
  • 2012-06-09
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多