简书链接:javaproguard混淆通配符
文章字数:1105,阅读全文大约需要4分钟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| 类名 通配符如下: | 通配符 | 含义 | | --- | | ? | 匹配单个字符,包名分隔符(.)除外 | | * | 匹配除(.)外的任意字符 | | ** | 匹配任意字符(包含.),如com.rush.**匹配com.rush包下的所有类及其所有子包的类。 |
字段和方法 通配符如下: | 通配符 | 含义 | | --- | | <init> | 匹配所有构造方法 | | <fields> | 匹配所有字段 | | <methods> | 匹配所有方法 | | ? | 匹配单个字符,包名分隔符(.)除外 | | * | 匹配除(.)外的任意字符 |
类型 通配符如下: | 通配符 | 含义 | | --- | | % | 匹配原始类型,如int, boolean等 | | ? | 匹配任意单个字符 | | * | 匹配除包名分隔符(.)外的任意字符 | | ** | 匹配任意字符,包括包名分隔符(.) | | *** | 匹配任意类型(原始类型、非原始类型、数组或非数组类型)| | ... | 匹配任意参数个数,任意参数类型 |
其中类配置完整定义如下,其中[]表示可选:
######说明: ***"[]“***方括号表示里面的内容是可选的; ***"..."***省略号表示可以能很多选项; ***"|"***竖线划分了不同的选择 "()"普通非粗体括号表示属于同一组的属性
- ***class***关键字表示任何类或接口,***interface*** 仅指示接口,***enum***关键字仅指示枚举;***interface,enum***前面加一个***"!"***表示非既是不是接口也不是枚举。 - 每个***classname***必须是全名,如:***java.lang.String、com.example.ClassName***;同时***classname***还可以是包含下面一些通配符的正则表达式:
***?*** 问号匹配单个字符,但不能是包名分隔符;如:***"mypackage.Test?"***,能匹配***"mypackage.Test1"、 "mypackage.Test2"***,但是不能匹配***"mypackage.Test12"***; ***\**** 单个星号能匹配任意多个字符,但除了包分隔符,如:***"mypackage.\*Test\*"***,能匹配***”mypackage.Test、mypackage.YourTestApplication“***,但是不能匹配***"mypackage.mysubpackage.MyTest"***; ***"mypackage.\*"***匹配包mypackage下面的类,但不包括它的子包里面的类; ***\*\**** 双星号匹配任意多个字符,包括包名的分隔符;如:***"\*\*.Test"***,匹配了所有Test类,***"mypackage.\*"***匹配了包mypackage下面的所有子类,包括它的子包的类。
- ***extends 、implements*** 指示一个特定的类,既是表示继承或者是实现了指定的类(接口)的类才符合条件。 - ***@*** 指示被注释类型注释了的类或类成员。注释类型与类名一样被指定。 - 类成员、方法和java语法差不多,方法参数就想javadoc一样,不用包含参数名称。成员、方法也可以包含一些通配符: ***<init>*** 匹配了构造方法; ***<fields>*** 匹配了成员变量; ***<methods>*** 匹配了方法; ***\**** 匹配了任意成员、方法; 上面这些没有任何返回类型,只有***"<init>"***有参数列表。 成员变量、方法也可以是包含通配符的正则表达式。可以包含以下通配符: ***?*** 匹配方法中任何单个字符; ***\**** 匹配方法中任何多个字符; 类型可以包含一下通配符 ***%*** 匹配方法中的原始类型(***"boolean"、"int"...***,不包括***"void"***); ***?*** 匹配类名中的单个字符; ***\**** 匹配类名中的多个字符,不包括包分隔符; ***\*\**** 匹配类名中的多个字符,包括包分隔符; ***\*\*\**** 匹配原始类型,非原始类型,数组、非数组 ***\-\-\-*** 匹配任意数量和类别的参数。 注意:***?、\*、\*\**** 不会匹配原始类型,只有**\*\*\***可以;如:***"\*\* get\*()"***匹配***“java.lang.Object getObject()”*** 不会匹配***"float getFloat()"*** 也不匹配***"java.lang.Object[] getObjects()"***; - 构造函数可以用短名(不含包名),或者全名(含包名);java中构造函数可以有参数,但没有返回类型。 - 可以设置类,类成员访问修饰符(***public,private...***),它们通常帮助限制通配符类和成员。只能匹配具有指定修饰符的类或者成员。**"!"**表示非。 容许设置多个标识(***"public static"***),但如果它们是冲突的就只能设置一个(如***public***和***private***)
ProGuard支持编译器设置的一些修饰符***synthetic、bridge、varargs***;
下面是一些简单的列子:
|