ProGuard 规则指南

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 {
    *;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值