1、proguard的常用文法
-libraryjars class_path 應用的依賴包,如android-support-v4
-keep [,modifier,...] class_specification 不混淆某些類
-keepclassmembers [,modifier,...] class_specification 不混淆類的成員
-keepclasseswithmembers [,modifier,...] class_specification 不混淆類及其成員
-keepnames class_specification 不混淆類及其成員名
-keepclassmembernames class_specification 不混淆類的成員名
-keepclasseswithmembernames class_specification 不混淆類及其成員名
-assumenosideeffects class_specification 假設調用不産生任何影響,在proguard代碼優化時會将該調用remove掉。如system.out.println和log.v等等
-dontwarn [class_filter] 不提示warnning
2、标準proguard.cfg檔案内容
參考android标準,修改如下:
标準proguard.cfg檔案内容
3、常用proguard.cfg代碼段
不混淆某類的構造方法,需指定構造函數的參數類型,如jsonobject
java
1
2
3
-keepclassmembers class cn.trinea.android.common.service.impl.imagecache {
public <init>(int);
}
不混淆某個包所有類或某個類class、某個接口interface, 不混淆指定類則把**換成類名
-keep class cn.trinea.android.common.** { *; }
不混淆指某個方法,*可換成指定的方法或類名
public boolean get(java.lang.string, android.view.view);
不混淆parcelable的子類,防止android.os.badparcelableexception
-keep class * implements android.os.parcelable {
public static final android.os.parcelable$creator *;
添加android-support-v4.jar依賴包
4
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
4、proguard與log level結合解決debug模式log問題
常見的android debug日志的打法是定義一個靜态變量debug_status,如果為true,則列印log,否則不列印。對于release模式該變量為false,debug模式變量為true。這裡介紹一個更好的方法,不用擔心正式釋出時一不小心錯改了該變量。
proguard的作用就是在release模式壓縮、優化、混淆代碼,其中的壓縮和優化就包括去除不必要的代碼,我們可以利用這一特性解決debug日志的問題,在proguard.cfg中添加
-assumenosideeffects class android.util.log {
public static *** d(...);
public static *** v(...);
表示log.d和log.v代碼無副作用,在proguard時會被從源碼中remove掉,這樣release模式(正式釋出)就不會列印日志了,而debug模式(平常調試)照常列印,不用修改一點代碼大贊吧,嘿嘿*_^