1.proguard下載地址
http://proguard.sourceforge.net/下載proguard,目前我下載并使用的是proguard5.3.3。
2.打包jar包
proguard是對(duì)打包后的jar包進(jìn)行混淆編譯誊稚,將包名谎仲、類名等轉(zhuǎn)為a~z格式,從而起到混淆作用泡垃。所以首先對(duì)項(xiàng)目中需要混淆編譯的代碼進(jìn)行打包旨怠。詳細(xì)打包過程參見“eclipse打包jar過程”一文渠驼。
3.proguard混淆編譯
進(jìn)入下載好的proguard5.3.3目錄的bin目錄下,雙擊“proguardgui.bat”即可打開該軟件鉴腻,如下圖:
接著按照下面截圖步驟一步步操作:
上面保存好該jar包的.pro文件后迷扇,在Editplus直接打開該.pro文件。打開后修改下圖指定內(nèi)容:
上面紅色框出的內(nèi)容爽哎,是本jar運(yùn)行時(shí)不需要設(shè)置的入口函數(shù)類蜓席。其他jar按自己需要設(shè)置,具體設(shè)置格式后面有介紹倦青。此處是將com.kingmes.command包下的所有類不用混淆瓮床,但其子包下的類還是會(huì)混淆,如果子包也不需要混淆产镐,需要對(duì)每一個(gè)子包設(shè)置隘庄。如下:
-keep public class com.kingmes.socket.webutil.* {*;}
-keep public class com.kingmes.socket.config.* {*;}
-keep public class com.kingmes.socket.message.* {*;}//下面的子包中的類需要單獨(dú)設(shè)置
-keep public class com.kingmes.socket.message.data.* {*;}
-keep public class com.kingmes.socket.message.data.json.* {*;}
-keep public class com.kingmes.socket.message.data.json.base.* {*;}
-keep public class com.kingmes.socket.message.data.json.requestbase.* {*;}
設(shè)置好后再次打開proguard,導(dǎo)入剛剛修改后的.pro文件:
導(dǎo)入后切換到Process癣亚,可以查看導(dǎo)入的配置內(nèi)容是否正確丑掺。檢查后點(diǎn)擊“Process!”即可進(jìn)行混淆。
混淆成功述雾,最后會(huì)提示“Processing complete successfully”街州。然后使用jd-gui軟件打開混淆后的jar包,如下:
上圖中框出的類名玻孟、變量名唆缴、函數(shù)名均用a、b黍翎、c表示面徽。
4.pro文件配置說明
參數(shù):
-include {filename}??? 從給定的文件中讀取配置參數(shù)
-basedirectory {directoryname}??? 指定基礎(chǔ)目錄為以后相對(duì)的檔案名稱
-injars {class_path}??? 指定要處理的應(yīng)用程序jar,war,ear和目錄
-outjars {class_path}??? 指定處理完后要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath}??? 指定要處理的應(yīng)用程序jar,war,ear和目錄所需要的程序庫文件
-dontskipnonpubliclibraryclasses??? 指定不去忽略非公共的庫類。
-dontskipnonpubliclibraryclassmembers??? 指定不去忽略包可見的庫類的成員匣掸。
保留選項(xiàng)
-keep {Modifier} {class_specification}??? 保護(hù)指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification}??? 保護(hù)指定類的成員趟紊,如果此類受到保護(hù)他們會(huì)保護(hù)的更好
-keepclasseswithmembers {class_specification}??? 保護(hù)指定的類和類的成員,但條件是所有指定的類和類成員是要存在碰酝。
-keepnames {class_specification}??? 保護(hù)指定的類和類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclassmembernames {class_specification}??? 保護(hù)指定的類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification}??? 保護(hù)指定的類和類的成員的名稱霎匈,如果所有指定的類成員出席(在壓縮步驟之后)
-printseeds {filename}??? 列出類和類的成員-keep選項(xiàng)的清單,標(biāo)準(zhǔn)輸出到給定的文件
壓縮
-dontshrink??? 不壓縮輸入的類文件
-printusage {filename}
-whyareyoukeeping {class_specification}
優(yōu)化
-dontoptimize??? 不優(yōu)化輸入的類文件
-assumenosideeffects {class_specification}??? 優(yōu)化時(shí)假設(shè)指定的方法送爸,沒有任何副作用
-allowaccessmodification??? 優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員
混淆
-dontobfuscate??? 不混淆輸入的類文件
-printmapping {filename}
-applymapping {filename}??? 重用映射增加混淆
-obfuscationdictionary {filename}??? 使用給定文件中的關(guān)鍵字作為要混淆方法的名稱
-overloadaggressively??? 混淆時(shí)應(yīng)用侵入式重載
-useuniqueclassmembernames??? 確定統(tǒng)一的混淆類的成員名稱來增加混淆
-flattenpackagehierarchy {package_name}??? 重新包裝所有重命名的包并放在給定的單一包中
-repackageclass {package_name}??? 重新包裝所有重命名的類文件中放在給定的單一包中
-dontusemixedcaseclassnames??? 混淆時(shí)不會(huì)產(chǎn)生形形色色的類名
-keepattributes {attribute_name,...}??? 保護(hù)給定的可選屬性铛嘱,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string}??? 設(shè)置源文件中給定的字符串常量
5.注意事項(xiàng)
由于混淆后包名暖释、類名、函數(shù)方法名已經(jīng)不是原名稱弄痹,如果外部方法仍用原名稱調(diào)用肯定會(huì)報(bào)錯(cuò)饭入。此時(shí)不能對(duì)這些類或者方法進(jìn)行混淆嵌器,保留原名稱肛真,尤其是入口函數(shù)類中的main函數(shù)。如果混淆了爽航,執(zhí)行時(shí)會(huì)提示找不到該類或該main函數(shù)蚓让。在jar包中單獨(dú)調(diào)用的可以直接混淆。