Android Apk反编译和代码混淆(第二篇代码混淆)

第一篇讲了怎么反编译,然后发现自己辛辛苦苦的结果就这样轻易的被别人破解,接下来就是代码混淆了,

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

猜你喜欢

转载自blog.csdn.net/qq_37488573/article/details/81782610