第一篇讲了怎么反编译,然后发现自己辛辛苦苦的结果就这样轻易的被别人破解,接下来就是代码混淆了,
1,混淆的目的和效果
代码混淆的目的就是让别人不能轻易读懂你的代码,还有精简编译后程序大小的作用,上一张图看一下混淆后的代码 就容易看懂了
混淆之后的代码,我们根本看不出来方法a是什么含义,所以这就是混淆的效果
2,代码混淆的使用和规则
1,使用
讲一下Androidstudio 使用混淆的配置
1,设置为true 打包的时候默认混淆代码,false则不混淆
2,混淆配置文件的名字
3,混淆的配置文件
2,规则
1,混淆的基本规则就是把不需要混淆的保存下来,其他全部都是默认混淆的
-keep class com.example.autils.*#表示这个包下所有的类都保持原状不进行混淆,而子包下的类名还是会被混淆 -keep class com.example.autils.** #表示这个包下所有的类都保持原状不进行混淆,包括子包下面的类也会保持 配置了上边的 ,但是方法和变量还是会被混淆,只是类名字没有被混淆 -keep class com.example.bean.** { *; }#表示保持方法和变量不进行混淆 -keep public class * extends android.app.Activity #所有继承android.app.Activity的类将不会进行混淆, -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclassmembers public class * extends android.view.View {#所有View的 子类 及其getset方法都不混淆 void set*(***); *** get*(); } -keepclassmembers class * extends android.app.Activity {#所有的activity子类中 参数类型为view的方法 public void *(android.view.View); } -keepclassmembers enum * { #不混淆枚举类型中的指定方法 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { #不混淆Parcelable 子类及其Creator成员变量 public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* {#不混淆R类里及其所有内部static类中的所有static变量字段 public static <fields>; }
2,现在就需要知道什么需要混淆,什么不需要混淆
别的地方调用的比如系统activity,防止混淆之后找不到抛异常 1,自定义控件不要混淆 2,第三方库(一般第三方库都会提供混淆模板) 3,枚举 4,四大组件 5,调用了反射的 6,使用gson解析的bean类 7,js调用的方法 8,Parcelable 的子类 9,所有fragment的子类,
3混淆简单的模板
#android 官方混淆配置
###########优化精简代码###########
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* #指定要启用和禁用的优化
-optimizationpasses 5 #压缩比率 0---7
-allowaccessmodification #指定在预先处理中 类和类成员的访问性可能会扩大
-dontpreverify #指定不预先验证处理类文件
#-dontoptimize
-dontusemixedcaseclassnames #指定不产生混合的情况下的类名称而混淆
-dontskipnonpubliclibraryclasses
#-dontskipnonpubliclibraryclassmembers #指定不去忽略包可见的库类的成员。
-verbose
-keepattributes SourceFile,LineNumberTable#保留行号
-keepattributes *Annotation* #保持注解
-keepattributes Signature
-keepattributes EnclosingMethod
-keep class * extends java.lang.annotation.Annotation { *; }
-keepclasseswithmembernames class * {#指定不混淆所有的jni方法
native <methods>;
}
-keepclassmembers public class * extends android.view.View {#所有View的 子类 及其getset方法都不混淆
void set*(***);
*** get*();
}
-keepclassmembers class * extends android.app.Activity {#所有的activity子类中 参数类型为view的方法
public void *(android.view.View);
}
-keepclassmembers enum * { #不混淆枚举类型中的指定方法
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { #不混淆Parcelable 子类及其Creator成员变量
public static final android.os.Parcelable$Creator *;
}
-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();
}
-keepclassmembers class **.R$* {#不混淆R类里及其所有内部static类中的所有static变量字段
public static <fields>;
}
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.support.v4.app.FragmentActivity
-dontwarn android.support.** #不提示兼容库的错误警告
# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
-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