Android 代码混淆

Android Studio 工程中,默认就创建了 proguard-rules.pro 文件,可以在其中编写 Proguard 的混淆规则。

但是,默认是不打开混淆的,需要在 build.gradle 文件中,找到这一段:

build.gradle
1
2
3
4
5
6
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

minifyEnabled 从 false 改为 true,即可开启在 release 打包时进行混淆。

为什么混淆开关的名字是 minify enabled ?所谓的”混淆“,其实也就是用无意义的符号(如 a,b,c)去代替代码中有意义的符号(如 title, imagePath, url 等),那么代码即使被反编译后,依然很难直接看懂其含义。从另一个角度看,其实也是让代码精简化的过程。(另外,混淆代码的英文是 Shrink Code)

打开混淆后,在 proguard-rules.pro 文件中编辑混淆规则即可。这个文件其实就是之前用 Eclipse 时的 proguard.cfg,混淆规则的写法是一样的,需要在其中写明哪些类不要进行混淆。

具体可参考 Android 文档 Shrink Your Code and Resources

需要注意的是,不要对第三方库进行混淆,否则调用第三方库的地方,将找不到对应方法,应该不难理解。LeanCloud 给出了一个混淆规则,可以参考:

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
-keepattributes Signature
-dontwarn com.jcraft.jzlib.**
-keep class com.jcraft.jzlib.** { *;}
-dontwarn sun.misc.**
-keep class sun.misc.** { *;}
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *;}
-dontwarn sun.security.**
-keep class sun.security.** { *; }
-dontwarn com.google.**
-keep class com.google.** { *;}
-dontwarn com.avos.**
-keep class com.avos.** { *;}
-keep public class android.net.http.SslError
-keep public class android.webkit.WebViewClient
-dontwarn android.webkit.WebView
-dontwarn android.net.http.SslError
-dontwarn android.webkit.WebViewClient
-dontwarn android.support.**
-dontwarn org.apache.**
-keep class org.apache.** { *;}
-dontwarn org.jivesoftware.smack.**
-keep class org.jivesoftware.smack.** { *;}
-dontwarn com.loopj.**
-keep class com.loopj.** { *;}
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** { *;}
-keep interface com.squareup.okhttp.** { *; }
-dontwarn okio.**
-dontwarn org.xbill.**
-keep class org.xbill.** { *;}
-keepattributes *Annotation*