除此之外,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 需要使用完全限定类名(即含包名的类名)
可以使用如下通配符匹配类名: ? 匹配一个任意字符 * 匹配多个任意字符,不含package分隔符. ** 匹配多个任意字符,含package分隔符. 属性(fields)和方法(methods): 它们的规范与java中的规范类似,只是方法中不需要写上参数名,有参数类型即可 <init> matches any constructor. <fields> matches any field. <methods> matches any method. * matches any field or method. 注意这四个通配符,本身不含 访问修饰符
属性或方法后面都要以分号(;)结尾
属性名或方法名可以使用的通配符:
?匹配任意一个字符
* 匹配任意多个字符
属性或方法类型(类型可以直接写,如果是一个class,则写上class的完全限定名)可以使用的通配符:
% 表示任意基本数据类型,不含void
? 表示匹配用作类型的 class name的任意一个字符
* 任意多个字符,不含package分隔符(.)
** 任意多个字符,含package分隔符(.) 匹配非基本数据类型和非数组类型
例: ** get*() 可匹配com.stone.User getCurUser(),
但不匹配String getName(),也不匹配com.stone.User[ ] getCurUser()。
*** 匹配任意类型
... 表示任意数量的任意参数类型
构造方法中的class name,可以用短类名或含包名的类名
|