Proguard功能

1
2
3
4
- 压缩(Shrink): 侦测并移除代码中无用的类、字段、方法和属性.
- 优化(Optimize): 对字节码进行优化,移除无用的指令.
- 混淆(Obfuscate): 使用a,b,c,d这样简短而无意义的名称,对类,字段和方法进行重命名.
- 预校验(preverify): 在Java平台上对处理后的代码进行校验.

强烈建议阅读的博文:http://www.jianshu.com/p/60e82aafcfd0

ProGuard混淆规则/正则语法

  1. 语法

    1
    2
    3
    4
    5
    -keep [modifier…] class_specification: 不混淆指定的类
    -keepclassmembers [modifier,,,] class_specification: 不混淆指定类的特定成员.
    -keepclasseswithmembernames [modifier,,,] class_specification: 不混淆指定的类和它的成员.
    -dontwarn [class_filter]: 不提示指定包名的混淆打包warning.
    -keepattributes [attribute_filter]: 不混淆特定的属性.
  2. 正则语法

    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技术详解