Android Studio:
只需在 build.gradle(Module:app)中的 buildTypes 中增加 release 的編譯選項即可,如下:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- rules.pro'
}
}
這個 proguard-android.txt 是 sdk 中 groguard 默認(rèn)的文件,具體地址在:/opt/sdk/tools/proguard/proguard-android.txt
而 proguard-rules.pro 是 AS 中專用的 proguard 配置文件,其實只是后綴名不同,與 Eclipse 中的 proguard-project.txt 是一樣的,配置規(guī)則相同,后面會詳細(xì)提到。
老版本開啟混淆的命令是 runProguard,現(xiàn)在統(tǒng)一用 minifyEnabled 命令了,將其設(shè)為 true 就好了。
編譯的時候可以使用命令:
./gradlew assembleRelease
或者用上一篇生成簽名 apk 的辦法都可。
Eclipse:
在 project.properties 文件中開啟 proguard 配置(放開注釋),如下:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
同樣,生成簽名時代碼就會被混淆。
混淆語法
請參考 ${sdk.dir}/tools/proguard/proguard-android.txt 文件,需要注意的是文件中雖然有了不混淆 Parcelable 的語句,如下:
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
但是還是要自己把繼承自 Parcelable 的類寫進(jìn)來避免混淆,否則會出現(xiàn) BadParcelableException 異常。
-keep class com.linc.datatype.XXInfo {*;}
為微信分享而引入的 jar 包,我們不需要對其進(jìn)行混淆,也需要在 proguard-android.txt 中注明,如下:
-keep class com.tencent.** { *; }
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
為了驗證是否混淆成功,可以使用下面的反編譯工具驗證。
主要用到三個工具:
dex2jar:將 dex 文件轉(zhuǎn)為 jar 文件
jd-gui:反編譯 jar 文件
AXMLPrinter2.jar:反編譯 xml 文件
使用方法參見《反編譯 apk 文件,得到其源代碼的方法》
對于 Ubuntu64位,運(yùn)行 jd-gui 或許會報錯:
嘗試解決如下:
$ sudo apt-get install libgtk2.0-0:i386 libnss3:i386 libcurl3-gnutls:i386 libidn11:i386 libpango1.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 librtmp0:i386 libxft2:i386
又報錯:
$ /opt/sdk/tools/jd-gui: error while loading shared libraries: libXxf86vm.so.1: cannot open shared object file: No such file or directory
解決辦法如下:
$ sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6
參考: