联系电话

15615179880 钱经理

13864954681 陈经理

智能客服

您的每一次提问,都能得到合适的答案

微信咨询

钱经理

陈经理

新闻公告

技术课堂

Android 项目架构系列之代码的混淆

Android 项目架构系列之代码的混淆

代码混淆(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