前言:
APK是個什麼東西? “application package file”
簡單來說就是把編譯後的檔案和資源檔打包到一起,格式為zip的容器。我們簡單的瞭解下即可。
通常包含以下目錄和檔案:
1. META-INF\ 存放簽名密鑰;
2. res\ 存放沒有編譯到resources.arsc的資源檔,片 ;
3. lib\ 存放特定軟體編譯代碼,共用庫檔案;
4. AndroidManifest.xml 程式全域設定檔,描述程式名稱、版本、存取權限、應用程式調用庫檔案 ;
5. classes.dex 主要運行檔案
6. resources.arsc 先行編譯資源,如二進位xml。
題外話:漢化apk多是修改resources.arsc,個別還需要修改classes.dex。classes.dex很有意思,由java源碼編譯後的.class再編譯為安卓能懂的Dalvik虛擬機器檔案,加上了個dex就變成了classes.dex了。
為什麼要編譯APK?
通過使用apk編譯工具將apk檔案中的源檔案和資源反編譯出來,將得到的源檔案和資源檔進行處理後再進行編譯,以達到個人化定製,漢化等目的。
APK工具的使用
工欲善其事必先利其器。我們先來介紹一下編譯AKP檔案的工具APKtool。Apktool是一個反編譯和回編譯apk檔案的工具,有了它我們就可以打造自己的apk檔案。
首先我們可以用winrar開啟apk檔案,看似好像是一個普通的壓縮包,但實際上遠非這麼簡單。WINRAR解壓檔案後,查看圖片似乎沒有什麼問題,但當你查看xml檔案的時候就會發現—“亂碼”。
apk是經過程式編譯後的檔案,不能單純解壓後進行修改。當然主要針對classes.dex、resources.arsc ,RES目錄下的圖片等資源檔一般可不用反編譯直接替換。
要想修改APK檔案,我們首先要進行反編譯。進行反編譯工作前,我們先來構築JAVA運行環境。
一,構築運行環境
運行APKtool,首先要下載JAVA SDK 1.6,安裝後設定環境變數,JDK-6u37 32位
[GUIDE] How To Install and Use Android SDK
Windows XP:右鍵點擊“我的電腦”,點擊“屬性”,選擇“進階”選項卡,點擊“環境變數”
Windows 7:右鍵點擊“我的電腦”,點擊“進階系統設定”,點擊最下面的“環境變數”
在系統變數下
建立:
變數名JAVA_HOME
變數值C:\Program Files\Java\jdk1.6 此處路徑是按照你的JAVA安裝目錄為準。
建立:
變數名CLASSPATH
變數值 .;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar 注意前邊的點別丟了。
編輯PATH變數
在PATH變數後面添加 ;%JAVA_HOME%\bin 分號是為了與前邊已有項隔開
然後點擊開始菜單,點擊“運行”,輸入CMD,出現DOS視窗
輸入java和javac,如果顯示參數提示,環境設定就OK了。
可參考java環境變數配置
二,反編譯和回編譯
我們來看apktool,完整的apktool包括3個檔案,aapt.exe ;apktool.bat;apktool.jar
可將這3個檔案放入c:\windows目錄下方便調用。
可在C盤下建立APK檔案夾方便操作,把需要修改的apk檔案和系統架構framework-res.apk一起放入,如有副架構也需放入(如不清楚可把system/framework下所有apk放入)。
運行中輸入cmd開啟DOS視窗,輸入命令進入建立apk檔案夾
cd\
cd apk
C:\apk>
1.安裝架構
apktool if framework-res.apk
完成後顯示 I: Framework installed to: C:\Documents and Settings\Administrator\apktool\framework\1.apk
apktool已經包含了標準架構,大多數APK解包時不需要安裝架構,但某些製造商(如三星、HTC)使用了自己的架構檔案,如果要修改手機system/app下系統檔案必須載入架構,否則回編譯會出錯。架構檔案framework-res.apk在手機system/framework/下,應載入此檔案夾下所有apk檔案(一般1到2個)。華為U8825D也有副架構不過一般沒用。副架構載入一般會產生名為2.apk的檔案。
下面以修改systemui.apk為例
2.反編譯命令
Apktool d systemui.apk
會在目前的目錄下產生systemui目錄,反編譯後的檔案就在這裡。目錄名稱可自定,
如Apktool d systemui.apk 123 123為組建目錄
3.回編譯命令
Apktool b systemui 456.apk
回編譯systemui目錄,然後產生456.apk檔案,名稱自定。
此時已產生456.apk為編譯後檔案,用winrar開啟後發現與原檔案比較缺少META-INF目錄,此目錄包含apk簽名檔案,沒有被簽名的程式,系統將不能安裝。只有相同簽名的程式,才能替換升級。
為了不破壞簽名檔案,我們用winrar開啟原apk和修改後的apk(不要解壓出來),將resources.arsc 檔案拖回原apk視窗覆蓋源檔案,壓縮模式選擇儲存。將classes.dex也拖回覆蓋,壓縮模式選擇標準。如果修改了圖片等資源檔可將res檔案夾拖回覆蓋,關閉winrar完成對APK的修改。
補充:一般res目錄可刪掉然後把處理後的res目錄選擇儲存模式拖回原apk,但其中的.9.png格式比較特殊,會由aapt進行編譯,不可隨意替換。另外反編譯後也不要替換“AndroidManifest.xml” 否則容易出錯。
附:為什麼要簽名?
每個應用都有一個唯一合法的ID,這就簽名,簽名可以保證軟體升級的一致性,使用相同簽名的應用可以覆蓋安裝,不一致的簽名將無法共用使用資料,無法覆蓋安裝,這樣可防止篡改,保護開發人員利益。但簽名只能保證檢測到修改,並不能阻止你修改。
三,zipalign最佳化
使用zipalign最佳化你的APK檔案,可以減少運行記憶體RAM的佔用。
如果你下載過Android SDK Tools,此檔案位於android-sdk-windows\tools目錄下
命令格式
zipalign.exe -v 4 你的apk檔案
參數v:詳細輸出。 參數4:對齊為4位元組。
zipalign能夠確保apk檔案中未壓縮的資料在4個位元組邊界上對齊,這樣android系統就在讀取資源上獲得較高的效能,從而減少RAM佔用,但檔案大小一般會有所增加。
如果對APK進行簽名,那麼在簽名後才可進行zipalign最佳化。
四,版本選擇及工具下載
網上有不少整合的工具,可反編、回編、簽名、最佳化,相當方便。但掌握命令列模式將會讓我們打好基礎,出錯也比較好找原因。編譯framework-res.apk架構尤其推薦命令列模式。
如使用整合的工具,可自行將aapt.exe和apktool.jar替換為最新版,一般沒有問題。提示:系統apk無需自己簽名,用winrar替換回去可保留原檔案簽名,屬於只認簽名不認人的類型。
反編譯也不是一定保證成功,華為內建的架構和系統檔案就有點問題,可到找修改好能啟動並執行拿來修改,當然修改過的出問題的幾率也大。推薦用BCompare等比較工具比較檔案差異,這工具相當方便。
網上有很多apktool的版本,當初找的我頭暈眼花,也沒人說下原來這貨是有官網的,X,最新版是1.5,網上流傳多是1.43。
Apktool---XDA論壇發布地址 GOOGLE地址
aapt.exe和 zipalign.exe是Android SDK tools內建,可自行更新官方版,也可於XDA論壇下載作者修改版。(修改版個頭幾乎是原版10倍)
附錄:ODEX “optimized Dalvik executable”
classes.dex是apk檔案中的關鍵執行檔案,"odex"化就是將其預先解出並最佳化為.odex檔案,並將原apk中classes.dex檔案刪除,這樣可以加快系統引導進程和與預載入部分應用資料。
system/app/Phone.apk
system/app/Phone.odex
如上所示phone.apk存在一個同名的.odex檔案,即表明這個apk的人生已經不完整了。要編譯這樣的apk,需先用工具將phone.odex轉回classes.dex並和phone.apk合體為完整的phone.APK才可進行。
"odex"化常見於官方ROM,華為U8825D沒有所以不需要這一步,故文章中省略了APK合并過程。
將分離的.odex檔案還原為classes.dex,並將其放回apk檔案,這個過程稱為"Deodex"。合體為完整的apk檔案後才可正常編譯。
Deodex可使用的工具 smali 及 baksmali
命令列deodex
Manually Deodexing (Windows/Linux/OSX)
以上面的phone.apk , phone.odex 為例
電腦上建立一個非中文目錄,將手機中/system/framework下的所有檔案,包括apk、jar什麼的都複製進去,因為deodex時需要系統架構,但其實需要的就5,6個而已,但記住名字太麻煩不如都拖進去吧。baksmali.jar 和 smali.jar也複製進去。
第一步 java -jar baksmali.jar -x phone.odex 預設會產生out目錄,這個不用管。網上很多教程裡是這個樣子“baksmali-1.2.2.jar”,開始我以為-1.2.2是參數其實是版本號碼,把他改名為baksmali.jar方便些。
第二步 java -jar smali.jar out -o classes.dex -o參數後接的是自訂名稱,如果沒有-o參數,預設產生out.dex。
然後將classes.dex拖入殘疾的phone.apk,儲存格式選標準,然後zipalin處理下完成了。剩下的你自然知道怎麼做了。
When deodexing pre-ICS odex files, you must use the new --api-level/-a option to specify the api level
附dex2jar工具
| 命令列dex2jar [classes.dex] 產生classes.dex.dex2jar.jar在classes.dex所在目錄 jd-gui 用jd-gui開啟classes.dex.dex2jar.jar便可看到原始碼 |
參考 Android Power User: What are ODEX, DEODEX, and Zipalign?
What do"Odex"and"Deodex"mean? The All Inclusive Explanation
General information about odex files
筆者應用環境 XP SP3,JDK1.6,華為U8825D(4.0.4)
本文出自 “一樣” 部落格,請務必保留此出處http://yiyangde7.blog.51cto.com/392692/1068217