Android開發(fā)之反編譯與防止反編譯防止反編譯是每個程序員的必修課,因為當你辛辛苦的研發(fā)一個應用,被人家三下五除二給反編譯了,是一件多么尷尬的事啊。那么如何防止反編譯啊?這里就用Google Android自帶的代碼混編的方式來防止反編譯。孫子兵法中講得好:“知彼知己百戰(zhàn)不殆”,所以在講解防止反編譯之前,先讓我們了解一下如何反編譯一個應用。 一、反編譯Android應用實驗環(huán)境:Windows8.1企業(yè)版、dex2jar-0.0.9.9 反編譯工具包:1.將Apk反編譯得到Java源代碼具體步驟:1) 首先將apk文件后綴改為zip并解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的,將classes.dex復制到dex2jar.bat所在目錄dex2jar-0.0.9.9文件夾。 在命令行下定位到dex2jar.bat所在目錄,運行 dex2jar.bat classes.dex 如圖: 生成classes_dex2jar.jar 如圖: 2) 進入jdgui文件夾雙擊jd-gui.exe,打開上面生成的jar包classes_dex2jar.jar,即可看到源代碼了,如下圖: 2. 將apk反編譯生成程序的源代碼和圖片、XML配置、語言資源等文件具體步驟:1) 下載上述反編譯工具包,打開apk2java目錄下的apktool1.4.1文件夾,內含三個文件:apktool.jar ,aapt.exe,apktool.bat, 注:里面的apktool_bk.jar是備份的老版本,最好用最新的apktool.jar 在命令行下定位到apktool.bat文件夾,輸入以下命令:apktool.bat d -f abc123.apk abc123 如下圖: 上圖中,apktool.bat 命令行解釋:apktool.bat d -f [apk文件 ] [輸出文件夾]
將反編譯完的文件重新打包成apk,很簡單,輸入apktool.bat b abc123(你編譯出來文件夾)即可,命令如下: 打包apk后的文件在目錄C:\HelloAndroid下,生成了兩個文件夾: build dist 其中,打包生成的HelloAndroid.apk,在上面的dist文件夾下,Ok 3. 圖形化反編譯apk上述步驟一、二講述了命令行反編譯apk,現在提供一種圖形化反編譯工具:Androidfby 首先,下載上述反編譯工具包,打開Androidfby目錄,雙擊Android反編譯工具.exe,就可以瀏覽打開要反編譯的apk文件。 二、防止應用被反編譯先介紹一下什么是代碼混淆: 代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。執(zhí)行代碼混淆的程序被稱作代碼混淆器。目前已經存在許多種功能各異的代碼混淆器。 將代碼中的各種元素,如變量,函數,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符號,使得閱讀的人無法根據名字猜測其用途。重寫代碼中的部分邏輯,將其變成功能上等價,但是更難理解的形式。比如將for循環(huán)改寫成while循環(huán),將循環(huán)改寫成遞歸,精簡中間變量,等等。打亂代碼的格式。比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。 混淆前和混淆后反編譯出來的代碼對比: 提示:有心的朋友可以發(fā)現:混淆后生成apk文件比混淆前生成的apk文件要小不少。這樣不僅減小了項目的大小而且可以提高代碼的執(zhí)行速度。如下圖: 具體步驟:1) 查看項目中有沒有proguard.cfg。 如果沒有的話從這下載:
然后將proguard.cfg復制到項目中。
2) 在項目中的project.properties文件中添加:proguard.config=proguard.cfg 3) 然后按照正常的簽名對自己的應用進行簽名,生成后的apk經過反編譯后就會和源代碼有很大的不一樣。 注意:一定要通過正常的簽名方式對應用進行簽名,項目bin目錄中生成的apk文件是使用系統默認簽名的方式,沒有達到代碼混編的效果的。 如果簽名不成功請往下看: 4) 不過這一步你會遇到很多問題,根本就簽名不成功。例如:①如果工程引入了android-support-v4的jar類庫,那么在工程打包混淆時,就會出現報錯提示你:You may need to specify additional library jars (using'-libraryjars')。②引用第三方包等問題 如果工程引入了android-support-v4的jar類庫,那你就在proguard.cfg里的后面,添加如下內容: -libraryjars /android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep public class * extendsandroid.support.v4.** -keep public class * extendsandroid.app.Fragment 然后你再打包看看,應該可以正常生成apk安裝包了。 如果出現:"類1 can't find referenced class 類2" 字面上的意思就是類1找不到類2的引用;它會建議你:"You may need to specify additional library jars (using'-libraryjars')."; 需要使用-libraryjars加上項目中使用到的第三方庫就OK了。 例如:-libraryjars /android-support-v4.jar 注意:這里引用方式是當前工程的根目錄(也可以配置其他目錄),也就是說,你要把第三方jar放到當前目錄下,否則就會警告說找不到jar文件! 如果出現: can't find superclass or interfaceandroid.os.Parcelable$ClassLoaderCreator,碰到這樣的情況,可以使用-dontwarncom.xx.yy.**,不對錯誤提出警告。 注意:使用這個方式的話,要確保自己沒有用到這個庫里面的類!否則就會拋ClassNotFoundException! 如果在工程中確實用到了該類,采用上面方式還是不行。這個時候就要再增加一項:-keep class com.xx.yy.** { *;},讓當前類不混淆。 總結: 對于引用第三方包的情況,可以采用下面方式避免打包出錯: -libraryjars /aaa.jar -dontwarn com.xx.yy.** -keep class com.xx.yy.** { *;} 最后打包成功,祝君成功混淆加密! |
|