Android Proguard混淆相关总结

Proguard是什么?

  • 关于如何进行反编译
  • 混淆
    Java代码是非常容易反编译的,为了很好的保护Java源代码,我们往往需要对编译好的class文件进行混淆处理
  • Proguard
    Proguard工具是用于压缩、优化、混淆我们的代码,打包时可以移除代码中无用类、方法、属性同时进行混淆

Proguard开启

  • 开启混淆(build.gradle/app)
    minifyEnabled true
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

Proguard过滤

  • 混淆为什么要保留一些类名或方法名
    • 让C/C++程序可以通过jni使用Java方法
    • 四大组件由于在Manifest文件中注册了,所以需要保留
    • R文件混淆会导致引用错误
  • 常用的一些过滤命令
#保留native的方法名,和包含native方法的类名不变
-keepclasseswithmembernames class *{
    native <methods>;
}

# 四大组件
-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

# Serializable相关
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# Parcelable相关
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

# R文件中的静态变量
-keepclassmembers class **.R$* {
    public static <fields>;
}

# 过滤某一个类中的全部内容
-keep class com.app.util.share.ShareUtil{*;}

# 过滤某个目录下的全部内容
-keep class com.app.bean.** {*;}

Proguard原理

  • EntryPoint
    对不需要混淆的对象方法属性标记为EntryPoint,丢弃没有用到的类,最后重命名没有被EntryPoint标记的对象方法和属性

参考资料

  • Android Proguard工具使用和配置详解

你可能感兴趣的:(Android基础,其他工具,Proguard)