除此之外,proguard中的通配符也比较让人难懂,proguard-android.txt中就使用到了很多通配符,我们来看一下它们之间的区别:
通配 符 | 描述 |
<field> | 匹配类中的所有字段 |
<method> | 匹配类中的所有方法 |
<init> | 匹配类中的所有构造函数 |
* | 匹配任意长度字符,但不含包名分隔符(.)。 比如说我们的完整类名是com.example.test.MyActivity ,使用com.*,或者com.exmaple.*都是无法匹配的, 因为*无法匹配包名中的分隔符, 正确的匹配方式是com.exmaple.*.*, 或者com.exmaple.test.*,这些都是可以的。 但如果你不写任何其它内容,只有一个*, 那就表示匹配所有的东西。 |
** | 匹配任意长度字符,并且包含包名分隔符(.) 。比如proguard-android.txt中使用的 -dontwarn android.support.** 就可以匹配android.support包下的所有内容, 包括任意长度的子包。 |
*** | 匹配任意参数类型。比如void set*(***) 就能匹配任意传入的参数类型 ,*** get*()就能匹配任意返回值的类型。 |
… | 匹配任意长度的任意类型参数 。比如void test(…)就能匹配任意void test(String a) 或者是void test(int a, String b)这些方法。 [ ] 表示里面的内容是可选的。 @ 表示是一个注解类型 annotationtype的规范与classname类似 ... [[!]public|final|abstract|@ ...] : ...表示可以写上前面选项中的任意一种或多种。不参与语法 (argumenttype,...) :... 参与语法,表示0个或多个任意参数类型 ! 表示非 ()在表示方法时,才是语法的一部份;其它时候,只是用来分组 classname 需要使用完全限定类名(即含包名的类名) 属性或方法后面都要以分号(;)结尾 属性名或方法名可以使用的通配符: ?匹配任意一个字符 * 匹配任意多个字符 属性或方法类型(类型可以直接写,如果是一个class,则写上class的完全限定名)可以使用的通配符: % 表示任意基本数据类型,不含void ? 表示匹配用作类型的 class name的任意一个字符 * 任意多个字符,不含package分隔符(.) ** 任意多个字符,含package分隔符(.) 匹配非基本数据类型和非数组类型 例: ** get*() 可匹配com.stone.User getCurUser(), 但不匹配String getName(),也不匹配com.stone.User[ ] getCurUser()。 *** 匹配任意类型 ... 表示任意数量的任意参数类型 构造方法中的class name,可以用短类名或含包名的类名 |