Proguard那些事儿
Proguard功能
1 | - 压缩(Shrink): 侦测并移除代码中无用的类、字段、方法和属性. |
强烈建议阅读的博文:http://www.jianshu.com/p/60e82aafcfd0
ProGuard混淆规则/正则语法
语法
1
2
3
4
5-keep [modifier…] class_specification: 不混淆指定的类
-keepclassmembers [modifier,,,] class_specification: 不混淆指定类的特定成员.
-keepclasseswithmembernames [modifier,,,] class_specification: 不混淆指定的类和它的成员.
-dontwarn [class_filter]: 不提示指定包名的混淆打包warning.
-keepattributes [attribute_filter]: 不混淆特定的属性.正则语法
1
2
3
4
5
6? : 能匹配任意一个字符,但是不能表示package的分隔符,即.
* : 能匹配任意n个字符,但是不能表示package的分隔符,即.
** : 能匹配任意n个字符,并且可以表示package的分隔符.
% : 能匹配任何原始类型,如boolean、int等,但是不能表示void
*** : 能匹配任意类型,包括原始类型和非原始类型,数组类型和非数组类型.
… : 能匹配任何数量的任何参数.
Android中常用的选项
android使用一般首先指定sdk/tools/proguard文件夹中的proguard-android.txt文件,然后自己在定义自己的proguard文件。
sdk目录中的proguard-android.txt定义了一些android开发中通用的混淆规则,但是这并不能满足我们的需要,仍需要根据我们的需求继续添加规则。
android sdk中自带规则的说明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#混淆时不产生形形色色的类名
-dontusemixedcaseclassnames
##不跳过(混淆) jars中的 非public classes
-dontskipnonpubliclibraryclasses
#打印日志
-verbose
#不预校验,默认情况下如果类文件的目标平台Java 6 或更高时会进行预校验。Android没必要开启,关闭可减少处理时间。
-dontpreverify
#不优化输入的类文件,避免出现栈溢出异常,比较复杂的方法会出现栈溢出
-dontoptimize
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
Proguard中其他选项的含义可以参考:[ProGuard 选项](http://www.open-open.com/lib/view/open1449238996467.html)这个译文的说明
参考文章:
Android进阶之ProGuard代码混淆
读懂 Android 中的代码混淆
ProGuard 选项
Android ProGuard技术详解