这两天打包发现用到反射的地方抛出异常,折腾半天才搞出来,记录一下,以便查看。
用到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通配符
通配符 描述
<field> 匹配类中的所有字段
<method> 匹配类中所有的方法
<init> 匹配类中所有的构造函数
* 匹配任意长度字符,不包含包名分隔符(.)
** 匹配任意长度字符,包含包名分隔符(.)
*** 匹配任意参数类型
·
#---------------------------------基本指令区----------------------------------
-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<br/>
*/
@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 <fields>; } -keepclassmembers class * { @com.mobi.zw.common.annotation.NotProguard <methods>; }