Proguard 混淆 基本使用

这两天打包发现用到反射的地方抛出异常,折腾半天才搞出来,记录一下,以便查看。
用到design包,不设置发现design包的属性已经发生混淆,导致反射获取不到指定属性 ==!简单粗暴,直接keep design包

  -keep public class android.support.design.** {*;}     # 保持哪些类不被混淆

Proguard关键字


  关键字                      描述
  -keep                        保留类和类中的成员,防止被混淆或移除
  -keepnames                   保留类和类中的成员,防止被混淆,成员没有被引用会被移除
  -keepclassmembers            只保留类中的成员,防止被混淆或移除
  -keepclassmembernames        只保留类中的成员,防止被混淆,成员没有引用会被移除
  -keepclasseswithmembers      保留类和类中的成员,防止被混淆或移除,保留指明的成员
  -keepclasseswithmembernames  保留类和类中的成员,防止被混淆,保留指明的成员,成员没有引用会被移除
  -keepattributes  保留某些属性不被混淆,可选(*Annotation*,InnerClasses,Signature,SourceFile,LineNumberTable)
  -keep

Proguard通配符

  通配符      描述
       匹配类中的所有字段
      匹配类中所有的方法
        匹配类中所有的构造函数
  *           匹配任意长度字符,不包含包名分隔符(.)
  **          匹配任意长度字符,包含包名分隔符(.)
  ***         匹配任意参数类型

·
#---------------------------------基本指令区----------------------------------
-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
#----------------------------------------------------------------------------

自定义混淆注解

  • 创建注解对象
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* NotProguard, Means not proguard something, like class,     method, field
*/ @Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) public @interface NotProguard { }
  • 注解修饰类,成员或者属性

     @NotProguard 
     public class Main {
     
       @NotProguard 
       public int id;
       @NotProguard 
       public void method (){
       }
     }
    
  • 在混淆文件设置被注解修饰的方法,类或者成员不被混淆

     # keep annotated by NotProguard
     -keep @com.mobi.zw.common.annotation.NotProguard class * {*;}
     -keep class * {
     @com.mobi.zw.common.annotation.NotProguard ;
     }
      -keepclassmembers class * {
     @com.mobi.zw.common.annotation.NotProguard ;
     }
    

你可能感兴趣的:(Proguard 混淆 基本使用)