文章目录
  1. 1. ProGuard的工作原理
  2. 2. 编写ProGuard文件

ProGuard包括4各功能:

  • 压缩(Shrink) 移除代码中无用的类、字段、方法、和特性
  • 优化(Optimize) 对字节码进行优化,移除无用的指令
  • 混淆(Obfuscate) 使用剪短无意义的名称对类、字段、方法重命名
  • 预检(Preveirfy) 在Java平台上对处理后的代码进行预检

ProGuard的工作原理

ProGuard由Shrink,Optimize,Obfuscate,Preveirfy四个步骤组成,其中每个步骤都是可选的

编写ProGuard文件

  1. 基本指令
  • 代码混淆压缩比,在0~7之间,默认为5,-optimizationpasses 5
  • 混淆时不使用大小写混合,混淆的类名为小写 -dontusemixedcaseclassnames
  • 指定不去忽略废公共的库的类 -dontskipnonpubliclibaryclasses
  • 指定不去忽略废公共的库的类的成员 -dontskipnonpubliclibaryclassesmembers
  • 不做预校验 -dontpreverify
  • 生成映射文件 -verbose
  • 使用printmapping指定映射文件的名称 -printmapping proguardMapping.txt
  • 指定混淆时采用的算法 -optimizations ! code/ simplification/ arithmetic,!fiedld/*,class/merging/*
  • 保护代码中的Annotation不被混淆 -keepattributes *Annotation*
  • 避免混淆泛型 -keepattributes Signature
  • 抛出异常时保留代码行数 -keepattributes SourceFile,LineNumberTable
  1. 需要保留的
  • 保留本地native方法不被混淆

    1
    2
    3
    - keepclasseswithmembernames class * {
    native <methods>;
    }
  • 保留某些子类不被混淆

    1
    - keep public class * extends android.app.Activity
  • 保护在XML中设置onClick不被影响

    1
    2
    3
    - keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
    }
  • 保护Fragment - keep public class android.support.v4.app.Fragment.** {*;}

  • 保留枚举不被混淆

    1
    2
    3
    4
    - keepclassmembers enum * {
    public static **{} values();
    public static ** valueOf(Java.lang.String);
    }
  • 保留自定义控件不被混淆

    1
    2
    3
    4
    5
    6
    7
    - keep public class * extends android.view.View {
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context,android.util.ArrtibuteSet);
    public <init>(android.content.Context,android.util.ArrtibuteSet,int);
    }
  • 保留Parcelable序列化不被混淆

    1
    2
    3
    - keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
    }
  • 保留Serializable序列化类不被混淆

    1
    2
    3
    4
    5
    6
    7
    8
    - keepclassemembers class * implements java.io.Serializable {
    static final long serialVersionID;
    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();
    }
  • 保留R文件下的资源不被混淆

    1
    - keep class **.R${*;}
  • 保留内部类不被混淆

    1
    - keep class com.example.app.ui.MainActivity$*{*;}
  • 对WebView的处理

    1
    2
    3
    4
    5
    6
    7
    - 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,java.lang.String);
    }
  • 对JavaScript

    1
    2
    3
    - keepclassemembers class com.example.app.MainActivity$JSInterface {
    <methods>;
    }
  1. 针对第三方库的混淆保护
    1
    2
    3
    4
    5
    6
    - libraryjas libs/android-support-v4.jar
    - dontwarn android.support.v4.**
    - keep class android.support.v4.**{*;}
    - kepp interface android.support.v4.app.**{*;}
    - kepp public class * extends android.support.v4.**
    - keep public class * extends android.app.Fragment
文章目录
  1. 1. ProGuard的工作原理
  2. 2. 编写ProGuard文件