這兩天打包發(fā)現(xiàn)用到反射的地方拋出異常,折騰半天才搞出來忍燥,記錄一下拧晕,以便查看。
用到design包梅垄,不設(shè)置發(fā)現(xiàn)design包的屬性已經(jīng)發(fā)生混淆厂捞,導(dǎo)致反射獲取不到指定屬性 ==!簡單粗暴哎甲,直接keep design包
-keep public class android.support.design.** {*;} # 保持哪些類不被混淆
Proguard關(guān)鍵字
關(guān)鍵字 描述
-keep 保留類和類中的成員蔫敲,防止被混淆或移除
-keepnames 保留類和類中的成員,防止被混淆炭玫,成員沒有被引用會被移除
-keepclassmembers 只保留類中的成員奈嘿,防止被混淆或移除
-keepclassmembernames 只保留類中的成員,防止被混淆吞加,成員沒有引用會被移除
-keepclasseswithmembers 保留類和類中的成員裙犹,防止被混淆或移除,保留指明的成員
-keepclasseswithmembernames 保留類和類中的成員衔憨,防止被混淆叶圃,保留指明的成員,成員沒有引用會被移除
-keepattributes 保留某些屬性不被混淆践图,可選(*Annotation*,InnerClasses掺冠,Signature,SourceFile,LineNumberTable)
-keep
Proguard通配符
通配符 描述
<field> 匹配類中的所有字段
<method> 匹配類中所有的方法
<init> 匹配類中所有的構(gòu)造函數(shù)
* 匹配任意長度字符码党,不包含包名分隔符(.)
** 匹配任意長度字符德崭,包含包名分隔符(.)
*** 匹配任意參數(shù)類型
·
#---------------------------------基本指令區(qū)----------------------------------
-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
#----------------------------------------------------------------------------
自定義混淆注解
- 創(chuàng)建注解對象
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 (){ } }
-
在混淆文件設(shè)置被注解修飾的方法揖盘,類或者成員不被混淆
# 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>; }