把原來有具體含義的類名,變量名,方法名,修改爲讓人看不懂的名字,例如方法名getxx混淆爲方法名a。javascript
Android工程目錄下有個文件,proguard-rules.pro,內容是:html
# Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /usr/local/sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # 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 *; #}
proguard-rules.pro是AS中專用的proguard配置文件,其實只是後綴名不一樣,與Eclipse中的proguard-project.txt是同樣的,配置規則相同,後面會詳細提到。 java
在gradle中處理混淆的語句是:android
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
這個proguard-android.txt是sdk中groguard默認的文件,而文件是存在於sdk/tools/proguard/中:web
# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). -dontoptimize -dontpreverify # Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the # "proguard-android-optimize.txt" file instead of this one from your # project.properties file. -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static <fields>; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.**
將runProguard設置爲true,gradle混淆編譯:apache
./gradlew assembleRelease
# ------------------------------------- # android 原始混淆模板 # ------------------------------------- # ---------------------------------- # 經過指定數量的優化能執行 # -optimizationpasses n # ---------------------------------- -optimizationpasses 5 # ---------------------------------- # 混淆時不會產生形形色色的類名 # -dontusemixedcaseclassnames # ---------------------------------- #-dontusemixedcaseclassnames # ---------------------------------- # 指定不去忽略非公共的庫類 # -dontskipnonpubliclibraryclasses # ---------------------------------- #-dontskipnonpubliclibraryclasses # ---------------------------------- # 不預校驗 # -dontpreverify # ---------------------------------- # -dontpreverify # ---------------------------------- # 輸出生成信息 # -verbose # ---------------------------------- -verbose # ---------------------------------- # 優化選項 # optimizations {optimization_filter} # ---------------------------------- -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 <methods>; } # ----------------- # modify 修改合併 # ----------------- -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #-------------------------- # 保護類型 -keepattributes 說明 # Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, # LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, # RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault # -------------------- -keepattributes ** -libraryjars <java.home>/lib/rt.jar # ---------------------- # 不壓縮指定的文件 # -dontshrink # ---------------------- -dontshrink # ---------------------- # 不優化指定的文件 # -dontoptimize # ----------------------- -dontoptimize # ----------------------- # 不混淆指定的文件 # -dontobfuscate # ----------------------- # ----- 混淆包路徑 ------- -repackageclasses '' -flattenpackagehierarchy '' -target 1.6 # -------- 如下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能須要保護的字段及類相關 -------- -keep class com.google.inject.Binder -keepclassmembers class * { @com.google.inject.Inject <init>(...); } -keepclassmembers class * { void *(**On*Event); } -keepclassmembers class **.R$* { public static <fields>; } # ------ 編譯時須要用到的 jar 包 -libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar # ------ 保護 谷歌第三方 jar 包,界面特效 ---------- -keep class android.support.v4.** -dontwarn android.support.v4.** # ------ 保護百度地址jar包 -------- -keep class com.baidu.mapapi.** { *; } -dontwarn com.baidu.mapapi.** # --- 打包時忽略如下類的警告 -- -dontwarn com.classpackage.AA #-keepnames class * implements java.io.Serializable # ---------保護全部實體中的字段名稱---------- -keepclassmembers class * implements java.io.Serializable { <fields>; } # --------- 保護類中的全部方法名 ------------ -keepclassmembers class * { public <methods>; }
更多可查看:http://proguard.sourceforge.net/index.html#manual/examples.htmljson
-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 不混淆輸入的類文件 -obfuscationdictionary {filename} 使用給定文件中的關鍵字做爲要混淆方法的名稱 -overloadaggressively 混淆時應用侵入式重載 -useuniqueclassmembernames 肯定統一的混淆類的成員名稱來增長混淆 -flattenpackagehierarchy {package_name} 從新包裝全部重命名的包並放在給定的單一包中 -repackageclass {package_name} 從新包裝全部重命名的類文件中放在給定的單一包中 -dontusemixedcaseclassnames 混淆時不會產生形形色色的類名 -keepattributes {attribute_name,...} 保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. -renamesourcefileattribute {string} 設置源文件中給定的字符串常量
後面的文件名,類名,或者包名等可使用佔位符代替windows
?表示一個字符api
能夠匹配多個字符,可是若是是一個類,不會匹配其前面的包*] 能夠匹配多個字符,會匹配前面的包名。android-studio
在android中在android Manifest文件中的activity,service,provider, receviter,等都不能進行混淆。一些在xml中配置的view也不能進行混淆,android提供的默認配置中都有。
混淆以後,會給咱們輸出一些文件,在gradle方式下是在/build/proguard/目錄下,ant是在/bin/proguard目錄,eclipse構建在/proguard目錄像。
分別有如下文件:
+ dump.txt 描述apk文件中全部類文件間的內部結構。 + mapping.txt 列出了原始的類,方法,和字段名與混淆後代碼之間的映射。 + seeds.txt 列出了未被混淆的類和成員 + usage.txt 列出了從apk中刪除的代碼
當咱們發佈的release版本的程序出現bug時,能夠經過以上文件(特別時mapping.txt)文件找到錯誤原始的位置,進行bug修改。同時,可能一開始的proguard配置有錯誤,也能夠經過錯誤日誌,根據這些文件,找到哪些文件不該該混淆,從而修改proguard的配置。
-keep class android.net.http.SslError -keep class android.webkit.**{*;} -keep class cn.sharesdk.**{*;} -keep class com.sina.**{*;} -keep class m.framework.**{*;}
-keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } -keep class com.idea.fifaalarmclock.entity.*** -keep class com.google.gson.stream.** { *; }
-keepclassmembers class * { public <init>(org.json.JSONObject); } -keep class com.umeng.** -keep public class com.idea.fifaalarmclock.app.R$*{ public static final int *; } -keep public class com.umeng.fb.ui.ThreadView { } -dontwarn com.umeng.** -dontwarn org.apache.commons.** -keep public class * extends com.umeng.** -keep class com.umeng.** {*; }