上一篇java代码混淆只是proguard的基本配置,如果应用到实际工程里面,就需要有所提升。
1 定义不需要混淆的注解
下面的注解,可以应用到类、方法及属性中
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.FIELD})
public @interface NotProguard {
}
2 @NotProguard实例
@NotProguard
public void export(String keystorePath, String cerPath, String password) {
String[] arstringCommand = new String[] {
"cmd ",
"/k",
"start", // cmd Shell命令
"keytool",
"-export", // - export指定为导出操作
"-keystore", // -keystore指定keystore文件,这里是d:/demo.keystore
keystorePath,
"-alias", // -alias指定别名,这里是ss
"ss",
"-file",// -file指向导出路径
cerPath,
"-storepass",// 指定密钥库的密码
password
};
execCommand(arstringCommand);
}
@NotProguard
@NotProguard
public class CheckedException {
/**
* 将CheckedException转换为UncheckedException.
*/
public static RuntimeException unchecked(Exception e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
} else {
return new RuntimeException(e);
}
}
3 proguard.conf详细配置
#忽略警告信息
-ignorewarnings
#不做 shrink
-dontshrink
#指定不去忽略包可见的库类的成员
-dontskipnonpubliclibraryclassmembers
# 通过指定数量的优化能执行
-optimizationpasses 3
# 指定不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
# 输出生成信息
-verbose
#混淆时应用侵入式重载
-overloadaggressively
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
#确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
#这里添加你不需要混淆的类
# --------- 保护类中的所有方法名 ------------
-keeppackagenames
-keep @com.dzmsoft.framework.base.command.NotProguard class * {*;}
-keep class * {@com.dzmsoft.framework.base.command.NotProguard <fields>;}
-keepclassmembers class * {public <methods>;}
-keepclassmembers class * {@com.dzmsoft.framework.base.command.NotProguard <methods>;}
# Signature:避免混淆泛型,这在JSON实体映射时非常重要,比如fastJson
# SourceFile,LineNumberTable:抛出异常时保留代码行号,在异常分析中可以方便定位
# Annotation:保护代码中的Annotation不被混淆,这在JSON实体映射时非常重要,比如fastJson
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
-keep class **.$* {
*;
}
-keep enum * {
*;
}
# 保留序列化对象
-keepnames class * implements java.io.Serializable
-keepclassmembers class * extends java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}