一、為什么要混淆
為了避免apk在發(fā)布后被用戶通過反編譯拿到源代碼和資源文件,然后修改資源和代碼之后就變成一個新的apk。而經(jīng)過混淆后的APK,即使被反編譯,也難以閱讀,注意混淆不是讓apk不能閱讀,而是加大閱讀的難度,為了避免勞動成果被竊取,也避免出現(xiàn)安全漏洞和隱患,所以在apk發(fā)布之前一定要進行混淆。
二、混淆的原理
Java是一種跨平臺、解釋型語言,Java源代碼編譯成的class文件中有大量包含語義的變量名、方法名的信息,很容易被反編譯為Java源代碼。為了防止這種現(xiàn)象,我們可以對Java字節(jié)碼進行混淆?;煜粌H能將代碼中的類名、字段、方法名變?yōu)闊o意義的名稱,保護代碼,也由于移除無用的類、方法,并使用簡短名稱對類、字段、方法進行重命名縮小了程序的大小。
ProGuard由shrink、optimize、obfuscate和preverify四個步驟組成,每個步驟都是可選的,需要哪些步驟都可以在腳本中配置。參見ProGuard官方介紹。
壓縮(Shrink):默認開啟,偵測并移除代碼中無用的類、字段、方法和特性,減少應用體積,并且會在優(yōu)化動作執(zhí)行之后再次執(zhí)行(因為優(yōu)化后可能會再次暴露一些未使用的類和成員)。
-dontshrink 關閉混淆
優(yōu)化(Optimize):默認開啟,分析和優(yōu)化字節(jié)碼,讓應用運行的更快。
-dontoptimize 關閉優(yōu)化,默認混淆配置文件開始
-optimizationpasses n 表示proguard對代碼進行迭代優(yōu)化的次數(shù),Android一般為5
混淆(Obfuscate):默認開啟,使用a、b、c、d這樣簡短而無意義的名稱,對類、字段和方法進行重命名,增大反編譯難度。
-dontobfuscate 關閉混淆
上面三個步驟使代碼大小更小、更高效,也更難被逆向工程。
預檢(Preverify):在java平臺上對處理后的代碼進行預檢。
混淆流程圖:
Proguard讀入input jars(or wars,zip or directories),經(jīng)過四個步驟生成處理之后的jars(or wars,ears,zips or directories),Optimization步驟可選擇多次進行。
為了確定哪些代碼應該被保留,哪些代碼應該被移除或混淆,需要確定一個或多個Entry Point。Entry Point經(jīng)常是帶有main methods,applets,midlets的classes,它們在混淆過程中會被保留。
Proguard的幾個步驟如何處理Entry Points。
?。?).在壓縮階段,Proguard從上述E