之前介绍了如何使用命令行将Jar包根据配置文件进行ProGuard,以及ProGuard的过程,会遇到的问题等。接下来会介绍常用的ProGuard如何配置参数。不常用的可以在官网中查询如何使用。
java -jar proguard.jar @myconfig.pro
每一个类、属性、方法都会有一个全名,例如java.lang.String
。而我们也可以通过正则表达式来过滤我们所需要的名称。
?
:在class中匹配任意的单个字符
例如:mypackage.Test?
可以匹配mypackage.Test1
,mypackage.Test2
,但是不能匹配mypackage.Test12
*
:匹配任意class名称中的一部分
例如:mypackage.*Test*
可以匹配mypackage.Test
,也可以匹配mypackage.YouTestApplication
,但是不能匹配mypackage.subpackage.MyTest
**
:可以匹配class名称中的任意一部分,可以包括任何数字或者包分隔符。
例如:**.Test
可以匹配除了根目录下所有包名下的Test类。mypackage.**
则可以匹配所有在mypackage
和它子目录的所有类而Fields和Methods与Java中类似。除了Method的参数中不需要包含它的名字,就和Javap中一样。而匹配规则如下:
<init>
:匹配任意构造函数
-<fields>
:匹配任意属性
-<methods>
:匹配任意函数
-*
:匹配任意属性或者函数-include filename
的缩写,该选项的作用是递归读取所给文件中的属性extended
继承了。MyClass.class.getResource("")
这种代码出现,如果没有指定一个Directory Filter的话,那么所有的目录都会被Keep住。如果有Filter的话,则会Keep匹配目录。-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
Keep住所有继承自View类中的public构造函数以及所有以public void set
开始的函数。
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclassmembers class * implements java.io.Serializable {
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
long eventCount;
int workerCounts;
int runControl;
scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
}
-keepclasseswithmembernames class * {
native <methods>;
}