代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。可以加大反编译的成本,但是并不能彻底防止反编译。
混淆我在项目build.gradle中android下的配置如下:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release }
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug }
}123456789101112
minifyEnabled 是否启动混淆 ture:打开 false:关闭
proguard-rules.pro是我们自定义的混淆规则的文件:
1、Proguard是一个集文件压缩,优化,混淆和校验等功能的工具
2、它检测并删除无用的类,变量,方法和属性
3、它优化字节码并删除无用的指令.
4、它通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果.
5、最后它还校验处理后的代码
混淆的常见配置:
Proguard关键字
具体使用举例:
1、保留包下面的类
-keep class com.***.***.****.bean.*{ ; }
2、保留Activity当中的View相关方法
-keepclassmembers class * extends android.app.Activity {
public void (android.view.View);
}
3、保留枚举类
-keepclassmembers enum * {
public static [] values();
public static ** valueOf(java.lang.String);
}
4、保留我们自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View{
*** get();
void set();
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
}
5、保留Parcelable序列化类不被混淆
-keep class * implements android.os.Parcelable { *;}
保留Serializable序列化的类不被混淆
-keep class * implements java.io.Serializable { *;}
6、dontwarn
使用dontwarn处理这些我们无法解决的library的警告。
以gson为例:
-dontwarn com.google.gson.*-keep class com.google.gson.** { *; }12
Proguard通配符
基本规则
//不混淆某个类-keep public class name.huihui.example.Test { *; }//不混淆某个类的子类-keep public class * extends name.huihui.example.Test { *; }//不混淆所有类名中包含了“model”的类及其成员-keep public class **.*model*.** {*;}//不混淆某个接口的实现-keep class * implements name.huihui.example.TestInterface { *; }//不混淆某个类的构造方法-keepclassmembers class name.huihui.example.Test {
public <init>(); }//不混淆某个类的特定的方法-keepclassmembers class name.huihui.example.Test {
public void test(java.lang.String); }//不混淆某个类的内部类-keep class name.huihui.example.Test$* {
*;
}//两个常用的混淆命令,注意://一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;//两颗星表示把本包和所含子包下的类名都保持;-keep class com.suchengkeji.android.ui.**-keep class com.suchengkeji.android.ui.*//用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,//如果既想保持类名,又想保持里面的内容不被混淆,我们就需要以下方法了//不混淆某个包所有的类-keep class com.suchengkeji.android.bean.** { *; }//在此基础上,我们也可以使用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<span class="token operator" style="outline: 0px; margin: 0px; padding: 0px; overflow-wrap: normal; color: rg