当前位置:   article > 正文

ProGuard 规则指南_proguard混淆规则

proguard混淆规则

关于我

ProGuard 是一个优化和混淆 Java 和 Android 应用程序的工具。它通过缩小、优化和混淆代码,减少应用程序的大小并提高安全性。ProGuard 规则用于控制这些操作,确保某些类、方法和字段在混淆过程中被保留或处理特定方式。

以下是一些常用的 ProGuard 规则及其解释:

1. 基本规则

保留类
-keep class com.example.MyClass
  • 1

保留 com.example.MyClass 类,不对其进行混淆。

保留类及其所有成员
-keep class com.example.MyClass {
    *;
}
  • 1
  • 2
  • 3

保留 com.example.MyClass 类及其所有字段和方法。

2. 成员保留规则

保留所有公共字段
-keepclassmembers class com.example.MyClass {
    public <fields>;
}
  • 1
  • 2
  • 3

保留 com.example.MyClass 类中所有公共字段。

保留所有公共方法
-keepclassmembers class com.example.MyClass {
    public <methods>;
}
  • 1
  • 2
  • 3

保留 com.example.MyClass 类中所有公共方法。

3. 泛型和继承

保留所有子类
-keep class * extends com.example.BaseClass
  • 1

保留所有继承自 com.example.BaseClass 的类。

保留所有实现特定接口的类
-keep class * implements com.example.MyInterface
  • 1

保留所有实现 com.example.MyInterface 的类。

4. 特殊用途规则

保留枚举类的所有成员
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
  • 1
  • 2
  • 3
  • 4

保留所有枚举类的 values()valueOf(String) 方法,这对于正常使用枚举至关重要。

保留带有特定注释的类和成员
-keep @interface com.example.MyAnnotation
-keepclassmembers class * {
    @com.example.MyAnnotation *;
}
  • 1
  • 2
  • 3
  • 4

保留带有 @com.example.MyAnnotation 注释的所有类成员。

5. Android 特定规则

保留所有活动类
-keep class * extends android.app.Activity
  • 1

保留所有继承自 android.app.Activity 的类。

保留所有服务类
-keep class * extends android.app.Service
  • 1

保留所有继承自 android.app.Service 的类。

6. 标记接口用法

标记接口用于简化 ProGuard 规则的配置,通过实现特定的接口来标识需要保护的类。

定义标记接口
public interface JNIProguardKeepTag {
}
  • 1
  • 2
实现标记接口的类
public final class JNISdk implements JNIProguardKeepTag {
    // 类内容
}
  • 1
  • 2
  • 3
ProGuard 配置文件
-keep class * implements com.example.jni.JNIProguardKeepTag {
    *;
}
  • 1
  • 2
  • 3

示例 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 {
    *;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

通过这些规则,您可以确保在混淆过程中保留必要的类和成员,以保证应用程序的正常运行和安全性。在实际使用中,可能需要根据具体项目的需求调整和添加规则。
联系我

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号