1.混淆的目的:不想开源应用,为了加大反编译的成本,但是并不能彻底防止反编译
2.开启混淆:
- 通常我们需要找到项目路径下app目录下的build.gradle文件
- 找到minifyEnabled这个配置,然后设置为true.
release{
minifyEnabled true//是否启动混淆 ture:打开 false:关闭
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
- proguard-rules.pro文件中配置混淆信息(Proguard是一个集文件压缩,优化,混淆和校验等功能的工具,它检测并删除无用的类,变量,方法和属性,它优化字节码并删除无用的指令,它通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果,最后它还校验处理后的代码)
3.混淆文件分析
//不混淆某个类
-keep public class 类名 { *; }
//不混淆某个类的子类
-keep public class * extends 类名 { *; }
//不混淆所有类名中包含了“model”的类及其成员
-keep public class **.*model*.** {*;}
//不混淆某个接口的实现
-keep class * implements 类名 { *; }
//不混淆某个类的构造方法
-keepclassmembers class 类名 {
public <init>();
}
//不混淆某个类的特定的方法
-keepclassmembers class 类名 {
public void noHx(java.lang.String);
}
//不混淆某个类的内部类
-keep class 类名.方法名$* {
*;
}
//两个常用的混淆命令,注意:
//一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;
//两颗星表示把本包和所含子包下的类名都保持;
-keep class com.bjadks.readroom.widget.dialog.**
-keep class com.bjadks.readroom.widget.dialog.*
//用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,
//如果既想保持类名,又想保持里面的内容不被混淆,我们就需要以下方法了
//不混淆某个包所有的类
-keep class com.bjadks.readroom.widget.dialog.** { *; }
//在此基础上,我们也可以使用Java的基本规则来保护特定类不被混淆,比如我们可以用extend,implement等这些Java规则。如下
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View