反編譯代碼:android
一、解壓apk獲得class.dexweb
二、dex2jar.bat class.dex工具
三、用Java decompiler查看編譯出來的*.jar文件就能夠看到代碼ui
反編譯資源文件:google
一、apktool.bat d *.apk <dri>spa
APKTool是GOOGLE提供的APK編譯工具,須要JAVA運行環境,推薦使用JDK1.6或者JDK1.7。
若是你想對APK文件進行修改,那麼就不可避免的要使用到APKTool。論壇裏有不少關於ROM美化的帖子都須要本身動手修改APK文件,好比修改framework-res.apk、systemUI.apk等等。
相信各位有很多人看了後都想親自來修改一番,可是結果倒是遇到了各式各樣的錯誤卻沒法進行改正,甚至都不知道本身錯在哪裏。
一.APKTOOL使用環境配置
1.安裝JAVA並設置環境變量。
下載安裝都很簡單,關鍵是安裝完後還須要親自設置環境變量以方便其餘程序可以條用JAVA。
以WIN7爲例,在桌面上右鍵點擊計算機——>屬性——>高級系統設置——>環境變量——>在下邊的系統變量裏新建一個變量,變量名爲JAVA_HOME,值爲JAVA的安裝路徑,好比個人是H:\ProgramFiles\Java\jdk1.6.0_26
二.APKTool的安裝
1.其實這個談不上安裝,不過若是你願意的話能夠把下載到的APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令.
2.可能有些人下載的APKTOOL裏有個安裝的bat文件,而且有另外兩個方便使用的bat文件,在這裏我不推薦你們使用這些bat文件,雖然使用起來很方便(其實我並不以爲方便),可是若是出現錯誤不方便查看。
三.APKTool的使用
1.decode
該命令用於進行反編譯apk文件,通常用法爲
apktool d <file.apk> <dir>
<file.apk>表明了要反編譯的apk文件的路徑,最好寫絕對路徑,好比C:\MusicPlayer.apk
<dir>表明了反編譯後的文件的存儲位置,好比C:\MusicPlayer
若是你給定的<dir>已經存在,那麼輸入完該命令後會提示你,而且沒法執行,須要你從新修改命令加入-f指令
apktool d –f <file.apk> <dir>
這樣就會強行覆蓋已經存在的文件
2.build
該命令用於編譯修改好的文件,通常用法爲
apktool b <dir>
這裏的<dir>就是剛纔你反編譯時輸入的<dir>(如C:\MusicPlayer),輸入這行命令後,若是一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲着編譯過程當中逐個編譯的文件以及最終打包的apk文件。
3.install-framework
該命令用於爲APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體狀況請看常見問題
四.常見問題
1.關於安裝和管理framework文件
如下大部分實際上是翻譯自http://code.google.com/p/android-apktool/wiki/FrameworkFiles
通常來講,你在使用apktool進行反編譯前不須要作其餘的事情,然而因爲有的廠商,如HTC,三星等,他們定製了framework文件而且在他們的系統應用中使用了這些文件,這時,爲了能正常的反編譯這些apk文件,你就必須從你的設備中拷貝出framework文件而且安裝到apktool中。
舉一個例子,好比你想反編譯HTCHero這款手機中的HtcContacts.apk,當你嘗試反編譯的時候,你會獲得如下錯誤信息。
$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable, value=0x02020542
...
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon, value=0x02020520
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
複製代碼
這就是在通知你必須先安裝HTC定製的framework文件,事實上在修改一些三星的系統應用時也是如此。
以三星的設備來舉例,你須要複製兩個framework文件來進行安裝,framework-res.apk和tzframework-res.apk,通常來講,這兩個文件在手機中的位置應該是system\framework\
使用如下代碼進行安裝
apktool if C:\framework-res.apk
apktool if C:\tzframework-res.apk
這裏假設2個文件都放在C盤根目錄
2.直接用build編譯後在dist中找到的apk文件沒法使用
其實這個問題我也不是特別理解,目前知道的就是,APK文件雖然本質是個zip文件,可是事實上zip包中的文件是按照兩種方式壓縮的,即XML文件進行deflate壓縮,其餘文件不進行壓縮(使用store存儲),而直接編譯獲得的APK文件對任何的文件都進行了deflate壓縮,所以你會發現編譯獲得的文件比原文件小好多。
一樣的,當你使用build文件夾中的文件替換原apk文件中的資源時,請務必確認是使用store存儲仍是deflate壓縮
3.其餘錯誤
其實在編譯過程當中會遇到不少其餘的問題,大多數是因爲刪除、修改、添加了資源後,沒有對應的修改res\values\public.xml文件而形成的,這裏我給你們說下修改的原則:
第一,public.xml文件中的資源不能重複定義。
第二,public.xml文件中的任意兩個資源的ID不能同樣
第三,public.xml文件中定義的資源必須能找到該文件(若是你刪除了一些文件,必需要對應的刪除public.xml中的該行)
第四,public.xml文件中儘量全面(若是你添加了某資源,最好確保在public.xml中也添加)
第五,public.xml文件中的資源的ID儘量連續(當你爲添加的文件添加聲明時,賦予的ID儘量是連續的)