修改和美化安卓系統的第一步~從認識APK開始(APK編譯、簽名、zipalign最佳化及APKTOOL的使用)

來源:互聯網
上載者:User
前言:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.