[譯] ProGuard 選項
Input/Output Options
@filename
簡短版-include filename
-include filename
讀取指定文件的配置參數
-basedirectory directoryname
指定當前配置文件中所有相對文件路徑的基礎目錄
-injars class_path
指定需要處理的 jar/aar/war/ear/zip/apk/dir。文件(目錄)內的類文件會被處理并寫入到輸出的文件(目錄)。默認情況下,非類文件會直接復制而不會被修改。在 class_path 中的內容可以過濾,在 filters 部分會詳細說明。為了更好的可讀性,建議使用多個 -injars 來指定多個 class_path
-outjars class_path
指定處理完后輸出的 jar/aar/war/ear/zip/apk/dir 名字。前面指定的 -injars 會在處理后寫入到該文件(目錄)中。可以過濾輸出內容,在 filters 部分會詳細說明。
需要避免輸出文件覆蓋輸入文件。沒有 -outjars 配置時,不會有輸出文件。
-libraryjars class_path
指定相關必需的 jar/aar/war/ear/zip/apk/dir 類庫。這些文件不會包含在輸出的文件中。在 class_path 中的內容可以過濾,在 filters 部分會詳細說明。為了更好的可讀性,建議使用多個 -libraryjars 來指定多個 class_path
-skipnonpubliclibraryclasses
指定讀取類庫時跳過非公有類,該操作可以加快處理及減少 ProGuard 的內存使用。默認情況下 ProGuard 會讀取非公有類。然而,大多時候非公有類不會與 injars 有關聯,如果它不會影響到 injars 的文件,建議使用該選項。如果使用該選項導致找不到類,ProGuard 會輸出相應的警告信息。
-dontskipnonpubliclibraryclasses
指定不忽略非公有的 library 類。4.5 版后,該選項默認開啟。
-dontskipnonpubliclibraryclassmembers
指定不忽略包內可見的 library 類的成員(字段及方法)。默認情況下,ProGuard 解析類庫時會跳過這些成員,因為 injars 一般不會使用它們。然而有時 injars 與 library 的類同屬一個包,并且 jnjars 的類使用了這些包內可見成員。在這種情況下,這些類成員是有用的。
-keepdirectories [directory_filter]
指定要保留在輸出文件內的目錄。默認情況下,目錄會被移除。這會減少輸出文件的大小,但如果你的代碼引用到它們時可能會導致程序崩潰(例:mypackage.MyCalss.class.getResource(""))。這時就需要指定-keepdirectories mypackage。如果沒有指定過濾器,所有目錄會被保留。例如,-keepdirectories mydirectory匹配 mydirectory 目錄;-keepdirectories mydirectory/*匹配 mydirectory 的直接子目錄;-keepdirectorie mydirectory/**匹配所有子目錄。
-target version
指定類文件的版本號。版本號可以是 1.0,1.1,1.2,1.3,1.4,1.5(or 5),1.6(or 6),1.7(or 7),1.8(or 8)。默認情況下,類文件的版本號保持不變。一般不應降低類文件的版本號,因為可能包含部分舊版本不支持的代碼。
-forceprocessing
指定即使輸出是一樣的,也強制處理 injars。一致性判斷是基于指定的輸入,輸出和配置文件或配置文件夾的時間戳比較的。
Keep Options
-keep [,modifier,…] class_specification
保留指定的類及類成員
-keepclassmembers [,modifier,…] class_specification
保留指定的類的成員
-keepclasseswithmembers [,modifier,…] class_specification
保留滿足指定條件的類和類成員
-keepnames class_specification
簡短版-keep,allowshrinking class_specification
如果指定的類和類成員在壓縮期沒被移除,則保留它們的名稱。只有開啟混淆時可用。
-keepclassmembernames class_specification
簡短版-keepclassmembers,allowshrinking class_specification
如果指定的類的成員在壓縮期沒被移除,則保留它們的名稱。只有開啟混淆時可用。
-keepclasseswithmembernames class_specification
簡短版-keepclasseswithmembers,allowshrinking class_specification
如果滿足指定條件的類和類成員在壓縮期沒被移除,則保留它們的名稱。只有開啟混淆時可用。
-printseeds [filename]
詳盡地列出類和類成員匹配的 -keep 選項清單,標準輸出到指定的文件中。該清單可用于驗證預期的類和類成員是否真正被找到,特別是使用了通配符的情況下。
Keep Option Modifiers
includedescriptorclasses
指定保留 -keep 選項保留的方法、字段的類型描述符對應的類。通常用于保留 Native 方法。
allowshrinking
允許壓縮
allowoptimization
允許優化
allowobfuscation
允許混淆
Shrinking Options
-dontshrink
指定不壓縮輸入的類文件,默認開啟。被指定 -keep 選項的及其直接或簡直依賴的類和類成員外均會被移除。壓縮也會發生在優化階段后,因為優化后可能會使類和類成員存在壓縮的可能性。
-printusage [filename]
列出沒有被使用的類和類成員,標準輸出到指定的文件中。只有開啟壓縮時可用。
-whyareyoukeeping class_specification
輸出指定的類和類成員在壓縮步驟被保留的原因。一般情況下,可能會存在多個原因。該選項會輸出到目標的最短方法鏈。如果開啟了 -verbose 選項,最短鏈會包含字段及方法簽名。只有開啟壓縮時可用。
Optimization Options
-dontoptimize
指定不優化輸入的類文件,默認開啟。所有的方法進行字節碼級優化。
-optimizations optimization_filter
開啟或關閉更細粒度的優化。只有開啟優化時可用。高級選項。
-optimizationpasses n
指定優化次數,默認執行一次優化。多次優化可能會得到更好的結果。如果某次優化后沒有變化,優化會自動結束。只有開啟優化時可用。
-assumenosideeffects class_specification
假定某些方法可以移除。在優化步驟,如果可以確定返回值沒被使用,ProGuard 會移除這些方法。ProGuard 會分析你的代碼以查找相關調用。例如:指定System.currentTimeMillis(),任何返回值沒有被使用的調用均會刪除。某些情況下,你可以使用該選項刪除日志代碼。只有開啟優化時可用。一般情況下該操作比較危險,可能輕易導致程序崩潰,請明確該操作的影響時使用該選項
-allowaccessmodification
優化時允許擴大類和類成員的訪問修飾符。該選項可以改善優化的結果。例如,內聯公有 getter 可能需要將字段也改成公有。只有開啟優化(并開啟了-repackageclasses)。
-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
指定不對處理后的類文件進行預校驗。默認情況下如果類文件的目標平臺是 Java Micro 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 文件的內容而不需要進行任何處理。