proguard只对方法体进行混淆应该怎么配置,不混淆成员变量,类名,注解,方法名,实体,枚举。仅混淆方法体的内容。
时间: 2024-09-13 20:14:39 浏览: 97
ProGuard 是一个用于压缩、优化和混淆 Java 字节码的工具,它经常用于 Android 应用的构建过程中,以减小应用的大小,提高运行效率并保护代码。要配置 ProGuard 仅对方法体进行混淆,而保留类名、成员变量名、注解、方法名、实体类和枚举类型不混淆,可以在 ProGuard 的配置文件中做如下设置:
```
-optimizationpasses 5
-dontobfuscate
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keep class * {
public protected private *;
}
# 保留接口的名称
-keepnames interface * { *; }
# 保留枚举的名称
-keepnames enum * { *; }
# 保留注解的名称
-keepnames @interface * { *; }
# 保留实体类的名称
-keepnames class * extends java.lang实体类 { *; }
# 保留不被重写的公共方法名称
-keepclassmembers class * extends java.lang实体类 {
public <init>();
}
# 不混淆方法体内容
-keepclassmembers class * {
*; <- 这会保留所有成员,但不会对成员进行混淆
}
# 不混淆枚举类型成员
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 不混淆注解成员
-keepattributes *Annotation*
# 保留类的成员变量名称(但是不进行混淆)
-keepclassmembers class * {
public <fields>;
}
# 保留所有的类成员,但不进行混淆
-keepclassmembers class * {
!public <fields>;
public <fields>;
}
# 保留所有的本地方法名称
-keepclassmembers class * {
native <methods>;
}
# 保留所有抽象类的抽象方法名称
-keepclassmembers class * extends java.lang实体类 {
public abstract <methods>;
}
# 保留所有类的初始化方法
-keepclassmembers class * {
void *(**);
}
# 如果有内部类,保留名称
-keepnames class * {
public static *;
}
# 如果有匿名内部类,保留名称
-keepnames class * {
#^java.lang实体类$;
}
# 如果有嵌套类,保留名称
-keepnames class * {
#^java.lang实体类$.*;
}
# 如果有嵌套接口,保留名称
-keepnames class * {
#^java.lang实体类$.*;
}
```
这个配置文件中,`-dontobfuscate` 选项告诉 ProGuard 不要进行混淆。其他选项和规则用于保留类和成员名称,但不会对它们进行混淆。请注意,这个配置文件需要根据实际的应用程序结构和需求进行调整和测试,以确保保留正确的内容。
阅读全文