ProGuard慣用法

運行Proguard,立即輸入(當然你需要定位到proguard.jar的目錄下面):
java -jar proguard.jar options …
proguard.jar在lib目錄下(android的sdk下/tools/proguard可以找到),而bin目錄下有了一些linux和windows腳本可以執行這個命令。典型的,你可以把選項都放在一個文件裏(比如說myconfig.pro),那就只需要這樣:
java -jar proguard.jar @myconfig.pro
你可以組合命令行選項和配置文件選項,比如:
java -jar proguard.jar @myconfig.pro -verbose
添加註釋使用的是#,可以註釋掉一行
文字與分隔符之間的空格會被忽略掉,文件名包含空格或者特殊字符用單引號或雙引號引用。選項可以由命令行中的參數或配置文件中的命令行任意組合,比如:你可以引用任意的命令行選項部分來避免特殊字符的shell擴展。
選項的順序通常是無關緊要的,爲了簡潔明瞭,你可以用它們第一個獨特的字母來替代。
Input/Output Options
Keep Options
Shrinking Options
Optimization Options
Obfuscation Options
Preverification Options
General Options
Class Paths
File Names
File Filters
Filters
Overview of Keep Options
Keep Option Modifiers
Class Specifications

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 an application,你可以單獨指定主類和它的主方法。爲了處理庫,你應該指定所有公開的元素。
e.g:
-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 <methods>;
}

-printseeds [filename]

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

Shrinking Options

-dontshrink

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

-printusage [filename]

指定輸入文件中的死代碼輸出到標準文件中,適用於使用了壓縮。

-whyareyoukeeping class_specification

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

Optimization Options

-dontoptimize

指定不優化輸入class文件,優化功能默認是開啓的,所有的方法在字節級被優化。、

-optimizations optimization_filter

指定優化是可用還是禁止,這個是一個更加精細的選項,只有當優化時適用。這是一個專業的選項。

-optimizationpasses n

指定代碼進行迭代優化的次數,在Android裏面默認是5,這條指令也只有在可以優化時起作用。

-allowaccessmodification

優化時允許訪問並修改有修飾符的類和類的成員,這可以提高優化步驟的結果。比如,當內聯一個公共的getter方法時,這也可能需要外地公共訪問。雖然java二進制規範不需要這個,要不然有的虛擬機處理這些代碼會有問題。當有優化和使用-repackageclasses時才適用。
指示語:不能用這個指令處理庫中的代碼,因爲有的類和類成員沒有設計成public ,而在api中可能變成public

-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 文件的內容而不需要進行任何處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章