混淆配置參數


輸入輸出選項(Input/Output Options)

@filename 是-include filename簡寫

-include filename
從給定的文件名中遞歸的讀取配置選項

-basedirectory directoryname
為在這些配置參數里面的后續的相對文件名或這些配置文件指定一個目錄。

-injars class_path
指定應用程序的要處理的jars(or wars, ears, zips, or directories)路徑,這些jar里面的class文件將被處理和寫入到輸出jar中。默認的,所有的沒有包含.class的文件將會被原風不動的復制,請注意任何臨時文件,特別是你直接從目錄里導入文件。class路徑中的條目會像filters描述的那樣被過濾掉。為了更好的可讀性,可以使用多個指定的類路徑條目 -injars 選項。

-outjars class_path
指定處理完后要輸出的jar,war,ear和目錄的名稱 ,在先前-injars 輸入的文件將會被重寫到指定的jar中,這將允許你選擇輸入的jar到指定輸出的jar。另外,輸出條目可以按filters的規則過濾掉,每一個被處理過的class文件和資源文件會被寫入到第一個匹配過濾規則的輸入文件中。你必須避免讓輸出文件重寫任何的輸入文件中。為了更好的可讀性,可以使用多個類路徑條目 -outjars選項,如果沒有任何的-outjars 選項,將沒有jar會被重寫。

-libraryjars class_path
指定要程序所引用的 jar(比如jdk的rt.jar)( 或 war, ears,zips,或者目錄)。這些jar里面的文件不會輸入到輸出jar中,指定的library jars 至少包含application的子類。Library class files 只被調用而不必呈現,雖然它們的存在可以提升優化的結果,這些class路徑會filter的要求來過濾。為了更好的可讀性,可以使用多個類路徑條目 -libraryjars選項。請注意當尋找library class 時,引導路徑和progurad的運行路徑是不會被考慮在內的,這就意味着你要明確地指出你的代碼會用到的run-time jar。雖然這會看起來比較笨重,但是它允許你運行自己的程序在不同的運行時環境中。比如,你可以通過指定合適的run-time jar就可以運行J2SE applications和JME midlets。

-skipnonpubliclibraryclasses
為了加快運行和減少proguard的使用內存,當讀取library jars指定跳過non-public 類。在默認情況下ProGuard讀取non-public 和public類一樣,然而,如果它們沒有影響輸入jar里面的的程序代碼,non-public 類通常是不相關的。在沒有影響輸出的情況下,忽略它們來加速Proguard.不幸的是,一些庫,包括最近 的JSE run-time 庫,包含一些非public class繼承自公共的library classes,那在這種情況下你不能使用這個option。在使用這個選項ProGuard將打印出警告當找不到類的時候。

-dontskipnonpubliclibraryclasses
指定不去忽略非公共庫類,在4.5以上這個是默認設置。

-dontskipnonpubliclibraryclassmembers
指定不忽略包可見的庫類成員(字段和方法)。默認地,當解析庫類的時候ProGuard會跳過這些類成員,項目類一般不會去引用它們。然而有的時候,程序里的類相當於庫類存在於相同包。此時它們會引用他們的包可見的類成員。在這種情況下為了保持程序代碼保持一致性去讀取這些類的成員是有用的。

-keepdirectories [directory_filter]
指定要保存在輸出jars(或wars ,ears,或directories)的目錄。默認地,目錄部分是會被移除的,這樣可以減少jar的大小,但是當程序嘗試用構造器找尋它們時會出現不願看見的結果比如:“MyClass.class.getResource(“”)”如果這個選項沒過濾器,所有的目錄都會保存下來,有過濾器時只有符合過濾器的目錄會保存下來。

-target version
在被處理的class文件中指定版本號。版本號可以是1.0,1.1,1.2,1.3,1.4,1.5(或者就是5),1.6(或者就是6),1.7(或者就是7),默認地,class文件的版本號是保持不變的。比如,你可能想更新class file到Java 6,通過改變他們的版本讓他們預編譯。

-forceprocessing
指定輸入的過程,即使輸出看起來最新。這個最新的測試是基於比較指定輸入,輸出和配置文件或目錄的時間戳。

保留選項(Keep Options)

-keep [,modifier,…] class_specification
不混淆某些類。
如:-keep public class mypackage.MyMain {public static void main(java.lang.String[]);}

-keepclassmembers [,modifier,…] class_specification
不混淆類的成員,如果它們的類也被保護了它們會被保護的更好。比如你想保護可以序列化類的變量和方法。
如:-keepclassmembers class * implements java.io.Serializable {private 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();}

-keepclasseswithmembers [,modifier,…] class_specification
不混淆類及其成員,但條件是所有指定的類和類成員是要存在。比如,你想保持似有的包含主方法 的application而無需顯示的列出它們。
如:-keepclasseswithmembers public class * {public static void main(java.lang.String[]);}

-keepnames class_specification
是-keep,allowshrinking class_specification的縮寫,保護指定的類和類的成員的名稱。

keepclassmembernames class_specification
相當於-keepclassmembers,allowshrinking class_specification只保留成員名稱,混淆內容。

keepclasseswithmembernames class_specification
相當於-keepclasseswithmembers,allowshrinking class_specification如果這些指定的類在壓縮階段后存在, 保護指定的類和類的成員的名稱。
保持 native 方法不被混淆:-keepclasseswithmembernames class * {native ;}

-printseeds [filename]
列出匹配各種-keep選項的類和類的成員,標准輸出到給定的文件。

收縮選項(Shrinking Options)

-dontshrink
產壓縮輸入類文件,默認是要壓縮的,除了-keep列出的class和這些類文件直接或間接引用的文件間外其它類文件都會被移除,壓縮步驟在優化之后執行,因為優化可能會移除更多的類文件和類成員。

-printusage [filename]
指定輸入文件中的死代碼輸出到標准文件中,適用於使用了壓縮。

-whyareyoukeeping class_specification
打印出為什么在壓縮過程中保留了這些類文件和類成員的具體原因,也適用了使用了壓縮的情況。

優化選項(Optimization Options)

-dontoptimize
指定不優化輸入類文件。默認情況下,已啟用優化,所有的方法都在字節碼級優化。

-optimizations optimization_filter
指定要啟用和禁用的優化,在更精細的水平。只有當優化適用。

-optimizationpasses n
指定代碼的優化壓縮級別

-assumenosideeffects class_specification
優化試某個類中的方法不被執行,通常用來優化移除日志

-allowaccessmodification
優化時允許訪問並修改有修飾符的類和類的成員

-mergeinterfacesaggressively
指定接口可以合並,即使實現類沒實現所有的方法。該選項可以通過減少類的總數減少輸出文件的大小。只有開啟優化時可用。

混淆選項(Obfuscation Options)

-dontobfuscate
指定不混淆類文件,默認開啟。

-printmapping [filename]
輸出類和類成員新舊名字之間的映射到指定文件中。只有開啟混淆時可用。

-applymapping filename
重用映射,映射文件未列出的類和類成員會使用隨機的名稱。如果代碼結構從根本上發生變化,ProGuard 可能會輸出映射會引起沖突警告。你可以通過添加-useuniqueclassmembernames選項來降低風險。只能指定一個映射文件。只有開啟混淆時可用。

-obfuscationdictionary filename
使用文件中的關鍵字作為方法及字段混淆后的名稱。默認使用 ‘a’,’b’ 等短名稱作為混淆后的名稱。你可以指定保留關鍵字或不相關的標識符。文件中的空格、標點符號、重復的單詞及注釋會被忽略。只有開啟混淆時可用。

-classobfuscationdictionary filename
使用文件中的關鍵字作為類混淆后的名稱,類似於-obfuscationdictionary。只有開啟混淆時可用。

-packageobfuscationdictionary filename
使用文件中的關鍵字作為包混淆后的名稱,類似於-obfuscationdictionary。只有開啟混淆時可用。

-overloadaggressively
開啟侵入性重載混淆。多個字段及方法允許同名,只要它們的參數及返回值類型不同。該選項可使處理后的代碼更小(及更難閱讀)。只有開啟混淆時可用。注:Dalvik 不能處理重載的靜態字段。

-useuniqueclassmembernames
方法同名混淆后亦同名,方法不同名混淆后亦不同名。不使用該選項時,類成員可被映射到相同的名稱。因此該選項會增加些許輸出文件的大小。只有開啟混淆時可用。

-dontusemixedcaseclassnames
混淆時不會產生大小寫混合的類名。默認混淆后的類名可以包含大寫及小寫。如果 jar 被解壓到非大小寫敏感的系統(比如 Windows),解壓工具可能會將命名類似的文件覆蓋另一個文件。只有開啟混淆時可用。

-keeppackagenames [package_filter]
不混淆指定的包名。過濾器是由逗號分隔的包名列表。包名可以包含 ?、*、** 通配符,並且可以在包名前加上 ! 否定符。只有開啟混淆時可用。

-flattenpackagehierarchy [package_name]
重新打包所有重命名的包到給定的包中。如果沒參數或字符串為空,包移動到根包下。該選項是進一步混淆包名的例子,可以使處理后的代碼更小更難閱讀。只有開啟混淆時可用。

-repackageclasses [package_name]
重新打包所有重命名的類到給定的包中。如果沒參數或字符串為空,類的包會被完全移除。該選項覆蓋-flattenpackagehierarchy,是進一步混淆包名的另一個例子,可以使處理后的代碼更小更難閱讀。曾用名為-defaultpackage。只有開啟混淆時可用。

-keepattributes [attribute_filter]
保留任何可選屬性。過濾器是由逗號分隔的 JVM 及 ProGuard 支持的屬性列表。屬性名可以包含 ?、*、** 通配符,並且可以在屬性名前加上 ! 否定符。例如:處理庫文件時應該加上Exceptions,InnerClasses,Signature屬性。同時保留SourceFile及LineNumberTable屬性使混淆后仍能獲取准確的堆棧信息。同時如果你的代碼有使用注解你可能會保留annotations屬性。只有開啟混淆時可用。

-keepparameternames
保留已保留方法的參數的名稱及類型。只有開啟混淆時可用。

-renamesourcefileattribute [string]
指定一個常量字符串作為SourceFile(和SourceDir)屬性的值。需要被-keepattributes選項指定保留。只有開啟混淆時可用。

-adaptclassstrings [class_filter]
混淆與完整類名一致的字符串。沒指定過濾器時,所有符合現有類的完整類名的字符串常量均會混淆。只有開啟混淆時可用。

-adaptresourcefilenames [file_filter]
以混淆后的類文件作為樣本重命名指定的源文件。沒指定過濾器時,所有源文件都會重命名。只有開啟混淆時可用。

-adaptresourcefilecontents [file_filter]
以混淆后的類文件作為樣本混淆指定的源文件中與完整類名一致的內容。沒指定過濾器時,所有源文件中與完整類名一致的內容均會混淆。只有開啟混淆時可用。

預校驗選項(Preverification Options)

-dontpreverify
指定不對處理后的類文件進行預校驗。默認情況下如果類文件的目標平台是 JavaMicro Edition 或 Java 6 或更高時會進行預校驗。目標平台是 Android時沒必要開啟,關閉可減少處理時間。

-microedition
指定處理后的類文件目標平台是 Java Micro Edition。

常規選項(General Options)

-verbose
指定處理期間打印更多相關信息。

-dontnote [class_filter]
指定配置中潛在錯誤或遺漏時不打印相關信息。類名錯誤或遺漏選項時這些信息可能會比較有用。class_filter 是一個可選的正則表達式。類名匹配時 ProGuard 不會輸出這些類的相關信息。

-dontwarn [class_filter]
指定找不到引用或其他重要問題時不打印警告信息。class_filter 是一個可選的正則表達式。類名匹配時 ProGuard 不會輸出這些類的相關信息。*注意:如果找不到引用的類或方法在處理過程中是必須的,處理后的代碼將會無法正常運行。請明確該操作的影響時使用該選項。

-ignorewarnings
打印找不到引用或其他重要問題的警告信息,但繼續處理代碼。注意:如果找不到引用的類或方法在處理過程中是必須的,處理后的代碼將會無法正常運行。請明確該操作的影響時使用該選項。

-printconfiguration [filename]
將已解析過的配置標准輸出到指定的文件。該選項可用於調試配置。
-dump [filename]
標准輸出類文件的內部結構到給定的文件中。例如,你可能要輸出一個 jar 文件的內容而不需要進行任何處理。

通常的混淆模式是:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.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 class android.support.** { *; }
-keep public class * extends android.support.**
-keep public class * extends android.app.Fragment

...

 

原文鏈接:http://blog.csdn.net/byhook/article/details/52529617


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM