ProGuard 是一个优化和混淆 Java 和 Android 应用程序的工具。它通过缩小、优化和混淆代码,减少应用程序的大小并提高安全性。ProGuard 规则用于控制这些操作,确保某些类、方法和字段在混淆过程中被保留或处理特定方式。
以下是一些常用的 ProGuard 规则及其解释:
1. 基本规则
保留类
-keep class com.example.MyClass
保留 com.example.MyClass
类,不对其进行混淆。
保留类及其所有成员
-keep class com.example.MyClass {
*;
}
保留 com.example.MyClass
类及其所有字段和方法。
2. 成员保留规则
保留所有公共字段
-keepclassmembers class com.example.MyClass {
public <fields>;
}
保留 com.example.MyClass
类中所有公共字段。
保留所有公共方法
-keepclassmembers class com.example.MyClass {
public <methods>;
}
保留 com.example.MyClass
类中所有公共方法。
3. 泛型和继承
保留所有子类
-keep class * extends com.example.BaseClass
保留所有继承自 com.example.BaseClass
的类。
保留所有实现特定接口的类
-keep class * implements com.example.MyInterface
保留所有实现 com.example.MyInterface
的类。
4. 特殊用途规则
保留枚举类的所有成员
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
保留所有枚举类的 values()
和 valueOf(String)
方法,这对于正常使用枚举至关重要。
保留带有特定注释的类和成员
-keep @interface com.example.MyAnnotation
-keepclassmembers class * {
@com.example.MyAnnotation *;
}
保留带有 @com.example.MyAnnotation
注释的所有类成员。
5. Android 特定规则
保留所有活动类
-keep class * extends android.app.Activity
保留所有继承自 android.app.Activity
的类。
保留所有服务类
-keep class * extends android.app.Service
保留所有继承自 android.app.Service
的类。
6. 标记接口用法
标记接口用于简化 ProGuard 规则的配置,通过实现特定的接口来标识需要保护的类。
定义标记接口
public interface JNIProguardKeepTag {
}
实现标记接口的类
public final class JNISdk implements JNIProguardKeepTag {
// 类内容
}
ProGuard 配置文件
-keep class * implements com.example.jni.JNIProguardKeepTag {
*;
}
示例 ProGuard 配置文件
以下是一个示例 ProGuard 配置文件,它结合了多个常见规则:
# 保留所有活动类
-keep class * extends android.app.Activity
# 保留所有服务类
-keep class * extends android.app.Service
# 保留所有自定义视图类
-keep class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留所有枚举类的静态方法
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留所有实现 Serializable 接口的类
-keep class * implements java.io.Serializable {
static final long serialVersionUID;
private 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();
}
# 保留所有实现 JNIProguardKeepTag 接口的类及其所有成员
-keep class * implements com.example.jni.JNIProguardKeepTag {
*;
}
通过这些规则,您可以确保在混淆过程中保留必要的类和成员,以保证应用程序的正常运行和安全性。在实际使用中,可能需要根据具体项目的需求调整和添加规则。