編輯:關於Android編程
Android開發之反編譯與防止反編譯
防止反編譯是每個程序員的必修課,因為當你辛辛苦的研發一個應用,被人家三下五除二給反編譯了,是一件多麼尴尬的事啊。那麼如何防止反編譯啊?這裡就用Google Android自帶的代碼混編的方式來防止反編譯。孫子兵法中講得好:“知彼知己百戰不殆”,所以在講解防止反編譯之前,先讓我們了解一下如何反編譯一個應用。
Windows8.1企業版、dex2jar-0.0.9.9
Android反編譯工具包(升級版)
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,即可看到源代碼了,如下圖:
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
上述步驟一、二講述了命令行反編譯apk,現在提供一種圖形化反編譯工具:Androidfby
首先,下載上述反編譯工具包,打開Androidfby目錄,雙擊Android反編譯工具.exe,就可以浏覽打開要反編譯的apk文件。
先介紹一下什麼是代碼混淆:
代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。代碼混淆可以用於程序源代碼,也可以用於程序編譯而成的中間代碼。執行代碼混淆的程序被稱作代碼混淆器。目前已經存在許多種功能各異的代碼混淆器。
將代碼中的各種元素,如變量,函數,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符號,使得閱讀的人無法根據名字猜測其用途。重寫代碼中的部分邏輯,將其變成功能上等價,但是更難理解的形式。比如將for循環改寫成while循環,將循環改寫成遞歸,精簡中間變量,等等。打亂代碼的格式。比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。
混淆前和混淆後反編譯出來的代碼對比:
提示:有心的朋友可以發現:混淆後生成apk文件比混淆前生成的apk文件要小不少。這樣不僅減小了項目的大小而且可以提高代碼的執行速度。如下圖:
1) 查看項目中有沒有proguard.cfg。
如果沒有的話從這下載:
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.** { *;}
最後打包成功,祝君成功混淆加密!
前言安卓開發的過程中,需要對開發的程序進行調試。谷歌官方和非官方,提供了很多幫助我們調試代碼的工具和方法。有的使用起來很簡單,有的則功能強大,很少有機會接觸。因此,我們打
Android Camera探究之路——起步Camera在手機中有著舉足輕重的地位,不管是二維碼還是照片、識別,都離不開攝像頭,本文將對Andro
一、android service簡介 1、Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行於系統中不容易被用戶
眾所周知,Android系統對硬件擁有較高的要求,使用一段時間以後就會出現速度變慢、多任務處理卡頓的現象,其實通過一些小技巧,便能提升設備的運行速度,大家不