您的当前位置:首页正文

ProGuard配置详解

2024-10-31 来源:个人技术集锦

ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器。它通过删除未使用的类、字段、方法和属性,优化字节码指令,并重命名类、字段和方法,使反编译后的代码难以理解,从而提高应用的安全性。以下是对ProGuard配置文件的一些详细解释和常见配置项的说明。

ProGuard配置文件结构

常见配置项

1. -keep 指令

-keep指令用于保留类、方法、字段不被混淆。可以指定具体的类、方法、字段或带有某些特征的类。

# 保留所有继承自Activity的类
-keep class * extends android.app.Activity

# 保留所有带有特定注解的类
-keep @interface com.example.MyAnnotation

# 保留所有实现特定接口的类
-keep class * implements java.io.Serializable
2. -keepclassmembers 指令

-keepclassmembers指令用于保留类中的特定成员不被混淆。

# 保留所有实现Serializable接口的类中的所有字段和方法
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException;
    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException;
    java.lang.Object writeReplace() throws java.io.ObjectStreamException;
    java.lang.Object readResolve() throws java.io.ObjectStreamException;
}
3. -dontwarn 指令

-dontwarn指令用于告诉ProGuard忽略特定类的警告信息。

# 忽略某些库的警告信息
-dontwarn com.squareup.okhttp3.**
-dontwarn com.google.gson.**
4. -keepattributes 指令

-keepattributes指令用于保留类文件中的特定属性。

# 保留注解属性
-keepattributes *Annotation*

# 保留签名属性
-keepattributes Signature
5. -dontobfuscate 指令

-dontobfuscate指令用于告诉ProGuard不要混淆代码,只进行代码优化和压缩。

-dontobfuscate
6. -optimizations 指令

-optimizations指令用于指定哪些优化步骤可以被应用。

# 应用所有优化步骤
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
7. -printmapping 指令

-printmapping指令用于生成一个映射文件,记录了混淆前后的类、方法、字段的对应关系。

# 生成混淆映射文件
-printmapping mapping.txt

示例ProGuard配置文件

以下是一个常见的ProGuard配置文件示例,涵盖了基本的保留规则和常见的库配置。

# 保留所有注解属性
-keepattributes *Annotation*

# 保留四大组件的类
-keep class * extends android.app.Activity
-keep class * extends android.app.Service
-keep class * extends android.content.BroadcastReceiver
-keep class * extends android.content.ContentProvider

# 保留应用程序类
-keep public class * extends android.app.Application

# 保留自定义视图类
-keep class * extends android.view.View {
    *** get*();
    void set*(***);
    void *(android.content.Context);
}

# 保留 Parcelable 接口的实现类
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

# 保留 Gson 注解
-keep class com.google.gson.annotations.SerializedName { *; }

# 保留 Retrofit 的类
-keep class retrofit2.** { *; }
-keep class okhttp3.** { *; }
-keep class okio.** { *; }

# 保留 ButterKnife 注解
-keep class butterknife.** { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

# 保留序列化类
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException;
    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException;
    java.lang.Object writeReplace() throws java.io.ObjectStreamException;
    java.lang.Object readResolve() throws java.io.ObjectStreamException;
}

# 忽略一些库的警告信息
-dontwarn com.squareup.okhttp3.**
-dontwarn com.google.gson.**

# 生成混淆映射文件
-printmapping mapping.txt

注意事项

通过合理配置ProGuard,可以在保持应用功能完整的前提下,最大化混淆和优化效果,提高应用的安全性和性能。

Top