ProGuard配置详解
ProGuard是一个开源的Java class文件缩小器、优化器、肴杂器和预验证器。它通过删除未利用的类、字段、方法和属性,优化字节码指令,并重命名类、字段和方法,使反编译后的代码难以理解,从而提高应用的安全性。以下是对ProGuard配置文件的一些详细表明和常见配置项的阐明。ProGuard配置文件结构
ProGuard的配置文件通常命名为proguard-rules.pro,并包含在Android项目的根目录或app模块目录中。配置文件由各种规则和选项组成,每个选项都定义了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生成的肴杂报告(mapping文件)来调试和分析肴杂后的代码,以确保代码肴杂的正确性。
通过公道配置ProGuard,可以在保持应勤奋能完备的条件下,最大化肴杂和优化效果,提高应用的安全性和性能。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]