天天看點

apktool反編譯工具使用詳解

 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,當你嘗試反編譯的時候,你會得到以下錯誤資訊。

  1. $ apktool d HtcContacts.apk 
  2. I: Loading resource table...
  3. I: Decoding resources...
  4. I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
  5. W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable, value=0x02020542
  6. ...
  7. W: Could not decode attr value, using undecoded value instead: ns=android, name=icon, value=0x02020520
  8. 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中的該行)