除此之外,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分隔符.

属性(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,可以用短类名或含包名的类名