【发布时间】: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