混淆通過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。
某些情況下,proguard文件的缺省配置可以滿足需求了。但是,對於混淆器來說,大多數情況做出正確的分析是困難的,並且它或許會刪除在它看來是無用的,但對於程序來說卻確實需要的代碼。
注意:jar包現在基本上是無法混淆的,用工具就可以直接看到你的jar包的源碼。所以這裏的混淆是針對apk混淆
低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。
高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時需要在 proguard-project.txt 文件中進行如下信息的配置,然後再將項目 Export 即可。
在Android的SDK低版本中,混淆配置文件是proguard.cfg。在新版SDK中(例如4.0以上版本)用的是proguard-project.txt。用法和配置都是一樣的。現在以高版本爲例簡要說明下配置文件:
將proguard-project.txt裏的#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前的#去掉。
這樣就開啓了混淆工作。當然如果你的APK簽名導出了的話,Android會默認給你混淆一下。
默認的混淆配置文件是這樣的:
#代表已經註釋掉了這一樣,去掉#號就是取消註釋這一行。
-keep這個參數是表示哪些類不被混淆
下面大概說下配置含義:(部分前綴dont代表don’t)
-optimizationpasses 5 設置混淆的壓縮比率 0 ~ 7 # 指定代碼的壓縮級別 -dontwarn 包名.** --------告訴ProGuard不要警告找不到包名.**這個包裏面的類的相關引用 -dontusemixedcaseclassnames #是否使用大小寫混合 -dontskipnonpubliclibraryclasses # 是否混淆第三方jar -dontpreverify # 混淆時是否做預校驗 -verbose # 混淆時是否記錄日誌 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時所採用的算法 -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 # 保持哪些類不被混淆 -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自定義控件類不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { # 保持自定義控件類不被混淆 public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { # 保持自定義控件類不被混淆 public void *(android.view.View); } -keepclassmembers enum * { # 保持枚舉 enum 類不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; } -keep class MyClass; # 保持自己定義的類不被混淆 -keep class **.R$* { *; }//過濾R文件的混淆 -keep class packagename.** {*;}//過濾第三方包的混淆(其中packagename爲第三方包的包名) -injars libs\your_library.jar //表示你要混淆的jar文件 -outjars libs\your_library_out.jar //是混淆後的jar文件名