第一部分:apk應用介紹,解包和打包,常用軟體
http://blog.csdn.net/kuangren_01/article/details/9318977
第二部分:三星閉源系統apk檔案的處理,漢化和簽名
http://blog.csdn.net/kuangren_01/article/details/9319027
第三部分:介紹apk檔案打包解包的各種應用
http://blog.csdn.net/kuangren_01/article/details/9319049
在這一部分,我們要進入實戰。首先,利用一個具體的例子來闡述apk工具包的使用,對apk檔案進行解包、漢化、打包和簽名。然後,我們來對付三星閉源系統的apk程式,達到我們修改、漢化和美化的目的。我們假定所有apk檔案都是單個獨立檔案,不含odex檔案(在官版ROM中,通常每個apk都分成兩部分,第一部分是apk,第二部分是odex。將它們合并是另一個題目,這裡不作敘述)。
1. 組態架構(Framework)環境
在處理APK檔案時,apktool需要架構檔案(framework-res.apk)來解碼和打包。apktool已經包含了標準的架構,所以在大多數APK檔案的解包時,不需要另外提供架構檔案。但是,某些製造商(例如三星)使用了他們自己的架構檔案,為瞭解包,就不得不從手機中或從ROM中把架構檔案(framework-res.apk)提取出來,然後安裝到電腦。安裝命令是:
apktool if framework-res.apk
安裝後就會得到:~\apktool\framework\1.apk
注意:三星系統(例如:I897)有兩個架構檔案:framework-res.apk和twframework-res.apk。在使用apktool之前,要安裝這兩個架構檔案。安裝方法同上:
apktool if framework-res.apk
apktool if twframework-res.apk
安裝後就會得到:~\apktool\framework\1.apk和
~\apktool\framework\2.apk。
許多人拿來apktool工具包用,說解不開包,運行出錯。原因是沒有組態架構環境。
2. akp檔案的漢化和修改
我首先來講對一般的(非三星)apk應用程式進行解包、漢化和打包。為你們方便和敘述目的,我在上傳的apktool和apk manager工具包裡都帶了一個小的apk應用程式SilentBoot_EN.apk。這個程式是“靜音啟動”,就是通過這個程式來設定開機時是否有開機音樂。我在我的2.3.4 XXJVP ROM裡也整合了這個akp程式,現在你們自己來把它漢化一下吧。我們用apktool工具包來做。
漢化步驟如下:
1) apk程式解包首先把SilentBoot_EN.apk複製到Unpack-apk.bat的同一個目錄裡(我已經放好了)
雙擊Unpack-apk.bat,apk檔案解包開始。DOS視窗出現,顯示解包進程和一系列資訊,直到解包結束。
2011-6-30 23:46 上傳
下載附件(29.93 KB)
解包結束後,在工作目錄下產生3個子檔案夾:New_APK,Raw_APK和Working_APK。解包了的檔案被放在Working_APK檔案夾內,原始apk檔案(SilentBoot_EN.apk)被複製一份到Raw_APK檔案夾儲存。見介面如下:
2011-6-30 23:27 上傳
下載附件(38.56 KB)
在Working_APK字檔案夾裡產生了一個子夾_SilentBoot_EN.apk,裡面存放所有解包後的檔案。在_SilentBoot_EN.apk之下有兩個檔案夾 /res和/smali,還有兩個檔案AndroidManifest.xml和apktool.yml。用文字編輯器開啟AndroidManifest.xml看看,是不是在第一部分裡介紹的內容。你要修改的內容在/res檔案夾內。
開啟/res檔案夾,看到裡面有5個子夾,/drawable存放apk應用的表徵圖(Icon),drawable-hdpi存放其它要用的圖形檔案,/layout是apk的布局檔案,/values裡是字元檔案。漢化apk就是漢化/alues檔案夾內string.xml檔案的內容。
2) 字元漢化
這裡只適用於懂英語的同學。如果你不懂英語,就照表抄課好了。
用文字編輯器開啟string.xml,其內容為:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="app_name">Silent Boot</string>
<string name="labelEnabled">Enable Silent Boot</string>
<string name="textEnabled">Device is muted on shutdown.</string>
<string name="textDisabled">Device is NOT muted on shutdown.\nBoot sound is played if the device is shut down with sounds enabled.</string>
</resources>
要漢譯的字元是:Silent Boot,Enable Silent Boot,Device is muted on shutdown,Device is NOT muted on shutdown.\nBoot sound is played if the device is shut down with sounds enabled。
先別急,我現在來教你怎樣處理檔案。有兩種漢化方法:a) 正規漢化,b) 強制漢化。
a) 正規漢化
一個apk應用在漢化後應該能在英文和中文系統下都能使用。/values目錄下的是英文語言套件。為了建一個中文語言套件,與/values並行建立一個子檔案夾:/values-zh-rCN(必須用這個檔案名稱!)。這裡values-zh是中國地區語言套件(包含港澳台及內地),values-zh-rCN是中文簡體語言套件(只包含內地),values-zh-rTW是中文繁體語言套件(港澳台)。
把/values檔案夾裡的strings.xml等語言檔案複製進/values-zh-rCN。在我們的例子中,只有strings.xml一個檔案。
進入/values-zh-rCN,用文字編輯器開啟strings.xml,然後你就翻譯吧,把英文描述譯成相應的中文。
例如,我們可以把上面的string.xml檔案譯成:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="app_name">靜音啟動</string>
<string name="labelEnabled">開啟靜音啟動</string>
<string name="textEnabled">關機也是靜音</string>
<string name="textDisabled">關機不是靜音\n如果沒有開啟靜音啟動,關機時播放開機音樂。</string>
</resources>
裡面有個操作符“\n”是分行符號,迫使換行顯示常值內容。之後存檔,用“另存新檔”(Save As)存成UTF-8格式。這是保持中文文本的格式。
在作漢化工作時,要對string.xml檔案進行修改。有時也需要修改其它xml檔案,一個一個地認真查看,一個一個地漢化。
b) 強制漢化
所謂“強制漢化”就是不產生/values-zh-rCN檔案夾。而是在/values檔案夾內把需要漢化的檔案都直接譯成中文。顯然,如果在英文作業系統中沒有中文字型檔的話,強制漢化的apk在英文系統中可能顯示亂碼。所以,建議養成良好習慣,採用“正規漢化”。
進階內容:以上的漢化是修改string.xml,把英文譯成相應的中文就好了,然後打包和簽名。但是,在有些apk檔案裡,所顯示的字元文字並不都在xml檔案裡。apk原作者把某些字元寫在代碼中。反編譯後,存放在/smali檔案夾裡。一層一層地找下去,最後你會看到一大堆Dalvik碼檔案,都是以.smali為副檔名。舉一個例子,用文字編輯器開啟某個.smali檔案,看到:
const-string v5, "ServiceMode"
“ServiceMode”會在apk執行時顯示為英文。因此,需要漢化。在I897 ROM裡,用工程模式特殊代碼看到的多半屬於這一類。漢譯起來非常花時間。我們要把ServiceMode譯成“服務模式”。怎麼處理呢?你不能把const-string v5, "ServiceMode"直接改成const-string v5, "服務模式"。打包會失敗的。正確的做法是把相應的中文字元用16進位的unicode來表示。例如:把“服務模式”用16進位的unicode表示就是\u670d\u52a1\u6a21\u5f0f
。每一個漢字用4個字元表示,\u表示為16進位的unicode碼。好了,正確的漢譯是:
const-string v5, "\u670d\u52a1\u6a21\u5f0f "
網上有中文字元與16進位unicode碼的對照表或轉換工具。我在這部分提供一張轉換表供你們使用。見附件。
3) Apk打包和簽名
打包操作很簡單,沒有什麼好講的。照著做就行了。
回到apktool目錄,滑鼠雙擊批次檔Repack-apk.bat,apk檔案就打包好了。在Repack-apk.bat批處理中,每個apk檔案打包好後就緊跟著進行簽名操作。所以,執行完Repack-apk.bat後,打包和簽名都完成了。
打包和簽名好了的apk檔案存放在New_APK檔案夾內,檔案名稱加了一個首碼New_。在我們的例子中,所產生的新的apk應用程式為New_SilentBoot_EN.apk。這就是漢化好了的apk程式了。
現在你需要把檔案改成你需要的名字:SilentBoot_CN.apk,安裝到手機試一下吧!欣賞一下你自己漢化的apk程式!是不是很爽!有成就感吧!
3. 三星akp檔案的漢化和修改
好了,有了以上對apk解包、修改(漢化)、打包、簽名做基礎,我們現在來看怎樣對三星apk進行操作。我們手裡用的是三星I897手機,/system/app目錄下的很多apk應用程式都是三星程式,典型的包括framework-res.apk,twframework-res.apk,TouchWiz30Luancher.apk。由於三星採用自己的閉源系統,對其漢化、修改、打包和簽名有一定難度,目前還沒有發現完全適合於三星apk的專用工具。因此,需要採取特殊手段來達到目的。
apktool對所有三星apk檔案都是可以解包的,對某些apk是可以打包簽名的,但是,對另外一些apk的打包總是失敗。這裡需要指出的是,即使你對三星apk檔案打包簽名成功,這個產生的apk程式也無法在三星手機上運行!原因是三星使用了其閉源的特殊簽名。
由於某些三星apk檔案無法用apktool進行打包,所以我們在這一節使用功能更強大的apk manager進行解包和打包。在執行apk manager指令碼批處理Script.bat時,有很多選項(見)。我們用到選項9和11。選項9是反編譯(解包),選項11是再編譯(打包)。由於三星不承認其它簽名,所以這裡簽名並不重要。但是,如果你在處理非三星的apk檔案,那簽名還是需要的,要用的選項12和14。
操作步驟:
1)把待解包的apk檔案(例如:TouchWiz30Launcher.apk)放到place-apk-here-for-modding子目錄裡
2)雙擊指令碼批次程式Script.bat,你會看到上面的介面
2011-6-30 23:27 上傳
下載附件(22.91 KB)
3)選擇選項9進行解包,斷行符號,開始解包
4)解包結束後,產生一個子檔案夾projects,裡面有一個字檔案夾(TouchWiz30Launcher.apk),解包後的檔案被放在這個子檔案夾內。
5)選擇選項24退出程式
6)按照上一節的方法進入projects/TouchWiz30Launcher.apk檔案夾,把string.xml和有關的部分進行了漢化修改
7)修改和漢化結束後,再運行批次程式Script.bat
8)選擇選項11進行打包。需要的時間較長,請耐心等待打包結束
9)打包結束後,在place-apk-here-for-modding檔案夾內產生了一個新的未簽名的apk檔案:unsignedTouchWiz30Launcher.apk
為了在手機上運行apk應用程式,簽名是必需的。那怎樣對三星apk應用程式進行簽名處理呢?一個有效方法就是借用原來解包前apk檔案已經有的簽名,把原來的簽名與新的編輯內容進行合成。從而,達到我們解包、修改、漢化、打包和“簽名”的目的,使新的apk程式可以在三星I897上運行。
合成操作步驟:
1)先用WinRAR開啟原始的apk檔案TouchWiz30Launcher.apk,裡面有3個檔案和兩個檔案夾。在第一部分講過每一個檔案和檔案夾的作用。這裡不再描述。
2011-6-30 23:27 上傳
下載附件(52.29 KB)
2)再用WinRAR開啟產生的apk檔案unsignedTouchWiz30Launcher.apk。 裡面是沒有簽名檔案的,就沒有檔案夾META-INF,我們也不需要它。
2011-6-30 23:27 上傳
下載附件(46.96 KB)
3)從unsignedTouchWiz30Launcher.apk中提取我們編輯過的東西。為此,用滑鼠把resources.arsc檔案從unsignedTouchWiz30Launcher.apk檔案視窗拖進TouchWiz30Launcher.apk的視窗,去覆蓋原來的resources.arsc檔案。你也可以先把原來的resources.arsc刪除,然後再做拖入的動作。
4)出現一個參數視窗。在壓縮方式處選擇“Store”(儲存)。然後按“OK”。
2011-6-30 23:27 上傳
下載附件(28.13 KB)
5)退出WinRAR。結束。新的三星apk應用程式就製作好了,簽名是利用了原始的簽名。檔案是TouchWiz30Launcher.apk。
說明:
1)如果修改了/res目錄下的內容,在第3步,就複製resources.ars。如果修改了/smali目錄下的內容,在第3步,就複製classes.dex。
2)只可以替換這兩個檔案,別的都不要動。
3)在第4步的壓縮方式,一定要選“Store”。