一、混淆基本原理和目的:
目的:使反编译APP的码不明显。 只是让别人难以理解。
基本原理:将代码中原本具有具体意义的包名、类名、变量名、方法名等名称全部替换为按顺序排列的无意义英文字母a、b、c….代码结构不变,得到相同的结果。
功能:【优化】优化java字节码,加快程序运行减少【压缩】APP大小,找出并删除混淆过程中未使用的类和类成员; 【混淆】反编译,难以理解。
二、安卓中代码混淆的介绍和配置:
Android的SDK附带了混淆工具Proguard,位于SDK根toolsproguard下。 代码混淆需要理解以下三个文件:
1 .默认混淆规则,包括1.proguard-Android.txt:SDK根 toolsproguardproguard-Android.txt中的相对常规规则
2.proguard-rules.pro :您的项目必须特别定义混淆规则。 那个在项目根目录下,内容需要自己制作
3.aapt_rules.txt :打包时在混淆过程中生成的文件。 如果混淆过程中发生错误,可以在此确定位置。 项目根目录的: buildintermediatesproguard-rulesreleaseaapt _ rules.txt
在Android Studio中启用自己的代码混淆规则。 如下构成。 在gradle需要发布的生产环境(即配置)中,添加以下红色边框代码:
图像
参数说明:
minifyEnabled : true,启用自定义混淆规则,即proguard-rules.pro; false,相反不使用自定义混淆规则
shrinkResources (打开并删除无用的资源,即未引用的文件(实际测量是drawable,layout,实际上不是完全删除,而是保留文件名,但没有内容等) )
proguardfilesgetdefaultproguardfile (proguard-android.txt )、(proguard-rules.pro ) :在SDK上)获取proguard-Android 注:此代码意味着混淆规则采用proguard-Android.txt proguard-rules.pro,因此在自定义混淆规则时不要重复。 当然,重复一遍也没什么大问题。
三、混淆规则(命令说明基础模板) :
混淆命令说明:
|代码|说明|
| -优化过程5 |代码混淆压缩率,0到7之间默认值为5,通常不更改|
| -dontusemixedcaseclassnames |不混合大小写,使混合类名小写|
|-dontskipnonpubliclibraryclasses |指定不忽略非公用库的类|
| -verbose | #混淆时是否记录|
|-dontskipnonpubliclibraryclassmembers |指定不忽略非公共库的类成员|
| -dontpreverify |无预检查。 预览是proguard的四个步骤之一,Android不需要预览。 消除这一步可以加速混淆。 |
| -优化|
采用的模糊化算法。 指定采用模糊处理的算法,后面的参数是过滤器。 此过滤器是谷歌推荐的算法,通常不更改。
-优化! 代码/简化/快速! field/class/merging/
|
| -dontshrink |压缩功能,默认启用。 |
| -dontoptimize |代码优化,java字节码优化,启用缺省|
|
-keep ``class XXXX
|类名保持不变,即类名不混淆,不保证类中的成员名称。 当然,也可以避免混淆继承XXX类的所有类名|
|
- keepclasseswithmembers ` ` class xxxx
|保存类名和成员名。 当然,也可以是类中的特定方法|
.
项目中的公告部分复制到你的项目中即可,其他部分根据自己的项目添加。 不能混淆的代码: 1、需要反射的代码
2、系统接口; 3、Jni接口4、需要
序列号和反序列化的代码(即实现Serializable接口的JavaBean);5、与服务端进行元数据交互的JavaBean(JSON、XML中对应的类);6、实体类,json解析类;7、第三方jar包。等等#-------------------------公共部分 start-------------------------------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
# 保留了继承自Activity、Application这些类的子类
# 因为这些子类有可能被外部调用
# 比如第一行就保证了所有Activity的子类不要被混淆
-keep public class * extends android.app.Fragment
-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
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
#如果有引用v4包可以添加下面这行
-keep public class * extends android.support.v4.app.Fragment
#忽略警告
-ignorewarning
#如果引用了v4或者v7包,
-dontwarn android.support.**
-keep class android.support.** {*;}
-keepclasseswithmembernames class * {
native ;
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-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);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
#-------------------------webview-------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, jav.lang.String);
}
#-------------------------公共部分 end-------------------------------