Proguard是什么?
- 关于如何进行反编译
- 混淆
Java代码是非常容易反编译的,为了很好的保护Java源代码,我们往往需要对编译好的class文件进行混淆处理 - Proguard
Proguard工具是用于压缩、优化、混淆我们的代码,打包时可以移除代码中无用类、方法、属性同时进行混淆
Proguard开启
- 开启混淆(build.gradle/app)
minifyEnabled true
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Proguard过滤
- 混淆为什么要保留一些类名或方法名
- 让C/C++程序可以通过jni使用Java方法
- 四大组件由于在Manifest文件中注册了,所以需要保留
- R文件混淆会导致引用错误
- 常用的一些过滤命令
#保留native的方法名,和包含native方法的类名不变
-keepclasseswithmembernames class *{
native <methods>;
}
# 四大组件
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
# Serializable相关
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Parcelable相关
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# R文件中的静态变量
-keepclassmembers class **.R$* {
public static <fields>;
}
# 过滤某一个类中的全部内容
-keep class com.app.util.share.ShareUtil{*;}
# 过滤某个目录下的全部内容
-keep class com.app.bean.** {*;}
Proguard原理
- EntryPoint
对不需要混淆的对象方法属性标记为EntryPoint,丢弃没有用到的类,最后重命名没有被EntryPoint标记的对象方法和属性
参考资料