# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# 需要混淆的jar包
-injars androidtest.jar
# 混淆後輸出的jar包路徑
-outjars out
# 需要混淆的jar包所依賴的jar包
-libraryjars /Users/tustar/Documents/Android/ADT/sdk/platforms/android-19/android.jar
-optimizationpasses 5
# 混淆時不會產生形形色色的類名
-dontusemixedcaseclassnames
# 指定不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
# 不預校驗
-dontpreverify
-verbose
# 優化
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
# 保留了繼承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService 的子類。因為這些子類,都是可能被外部調用的。
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
# 若webview中調用了js代碼, 保持原樣不混淆
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keep public abstract interface com.asqw.android.Listener{
# 所有方法不進行混淆
public protected
;
}
-keep public class com.asqw.android {
# 對該方法不進行混淆
public void start(java.lang.String);
}
# 保留了含有native方法的類
-keepclasseswithmembernames class * {
native ;
}
# 保留構造函數從xml構造的類(一般為View的子類)
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet);
}
# 保留構造函數從xml構造的類(一般為View的子類)
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet, int);
}
# 保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# 保留枚舉類型中的values和valueOf靜態方法
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留繼承Parcelable的跨進程數據類
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
ProGuard的作用:
1.創建緊湊的代碼文檔是為了更快的網絡傳輸,快速裝載和更小的內存占用.
2.創建的程序和程序庫很難使用反向工程.
3.所以它能刪除來自源文件中的沒有調用的代碼
4.充分利用java6的快速加載的優點來提前檢測和返回java6中存在的類文件.
參數:
-include {filename} 從給定的文件中讀取配置參數
-basedirectory {directoryname} 指定基礎目錄為以後相對的檔案名稱
-injars {class_path} 指定要處理的應用程序jar,war,ear和目錄
-outjars {class_path} 指定處理完後要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath} 指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫類。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可見的庫類的成員。
保留選項
-keep {Modifier} {class_specification} 保護指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)
-printseeds {filename} 列出類和類的成員-keep選項的清單,標准輸出到給定的文件
壓縮
-dontshrink 不壓縮輸入的類文件
-printusage {filename}
-whyareyoukeeping {class_specification}
優化
-dontoptimize 不優化輸入的類文件
-assumenosideeffects {class_specification} 優化時假設指定的方法,沒有任何副作用
-allowaccessmodification 優化時允許訪問並修改有修飾符的類和類的成員
混淆
-dontobfuscate 不混淆輸入的類文件
-printmapping {filename}
-applymapping {filename} 重用映射增加混淆
-obfuscationdictionary {filename} 使用給定文件中的關鍵字作為要混淆方法的名稱
-overloadaggressively 混淆時應用侵入式重載
-useuniqueclassmembernames 確定統一的混淆類的成員名稱來增加混淆
-flattenpackagehierarchy {package_name} 重新包裝所有重命名的包並放在給定的單一包中
-repackageclass {package_name} 重新包裝所有重命名的類文件中放在給定的單一包中
-dontusemixedcaseclassnames 混淆時不會產生形形色色的類名
-keepattributes {attribute_name,...} 保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string} 設置源文件中給定的字符串常量
Ant Example:
classpath="lib/proguard.jar" />
-injars in.jar
-outjars out.jar
-libraryjars ${java.home}/lib/rt.jar
-printmapping out.map
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-keepattributes *Annotation*
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
運行混淆器之後輸出的文件有:
dump.txt
描述.apk包中所有class文件的內部結構。
mapping.txt
列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建之後得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
每次混淆後,都需要保存dump.txt、mapping.txt 、seeds.txt 、usage.txt. 其中mapping.txt必須要保存,因為該文件丟失會導致查找不到BUG的源頭