odex合并的方法:
1. smali-1.2.2.jar 和 baksmali-1.2.2.jar
http://code.google.com/p/smali/downloads/list
2 . 需要這個 apk 所在的 rom 裡面的一些 jar 檔案,都在 /system/framework 裡面: core.jar, ext.jar, framework.jar, android.policy.jar, services. Jar
當然,這五個是最基本的,有可能還不夠,這種情況下面會講到。(所以建議將/system/framework下的內容全部pull出來)
3. 總共分四步:
(1) 把下載好的 smali-1.2.2.jar 和 baksmali-1.2.2.jar ,還有 rom 裡面摳出來的 5 個 jar ,放到工作目錄,然後 apk 和 odex 也放到一起
(2) 分解 odex 檔案為 class 檔案。 命令: java -jar baksmali-1.2.2.jar -x xxx.odex,命令完成之後,會產生一個 out 檔案夾,裡面就是所有的 class 檔案
如果出現問題,比如什麼異常,缺少包什麼的,就更到 rom 裡面把出錯資訊裡面要求的包拿出來,放到目前的目錄下。
(4) 將 class 產生為 classes.dex 檔案。 命令: java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex 這一步應該不會有什麼問題,然後會產生 classes.dex 檔案。
(5) 把 classes.dex 放入apk 裡面,把蓋子蓋上。 最後這一步最簡單了,用解壓縮軟體開啟 apk ,然後把千辛萬苦產生的 classes.dex 塞進去,就 ok 了。
這個 apk 就能用了。如果想給他重新簽個名的話,去找個 Auto Sign 簽名工具簽署一下就行。
Odex與deodex的區別:
開啟一個apk,裡面有很多個檔案夾和檔案,一般在layout負責介面,value負責字型顏色和文字顯示等。
odex是整個apk的核心部分,負責功能實現,deodex就是把odex檔案以classes.dex的形式和apk整合成一個檔案。
一般來說官方rom都是odex的rom,而定製rom大部分都是deodex化的。
兩者應該各有優點吧,貌似現在也沒有統一的說法。官方rom大部分每個apk對應一個.odex檔案,而deodex化的rom裡面只有一個apk,把.odex轉換成classes.dex放到apk包裡面了。
所以 odex rom的.apk+.odex=deodex化rom的1個.apk (簡單地來說,其實就上一個合并的過程)
== ODEX的優點 ==
1.刷完機首次進入系統的時間會縮短一些。檔案的運行速度應該也有所提升。
2.APK檔案不能單獨安裝,並且如果反編譯APK檔案,一般也只能得到資源檔。
可以說是起到一定的保護作用,避免被肆意修改和使用。這樣做可以使其廠商保證一定的反盜版,因為沒有沒有dex檔案的apk是無法正常安裝的。
3.會增加一些可安裝應用的空間,雖然不是很多。(這個我沒發現)
== ODEX的缺點 ==
1.不方便修改ROM以及檔案本身。
2.增加ROM包的體積,雖然不是很多
3.當你升級某個被ODEX的應用後,這個應用將會出現故障,最常見的就是FC。
而現在的定製rom之所以基本上都是deodex化的是因為:
1. 可以適當減小檔案的體積,起到節省rom空間的作用;
2.主要方便rom定製者對rom的個人化定製和移植;apk相對容易反編譯和修改,而odex先要解包成smali然後才能產生classes.dex,如果要再產生odex,還要用dexopt-wrapper,比較麻煩。
我個人感覺,如果只是簡單的使用,不美化,不經常修改system/app下的檔案的人,對系統檔案進行ODEX化,應該是能起到一定的最佳化作用的,而現在大部分的安裝應用程式都是單個apk檔案,升級也不會有FC的問題。
== zipalign ==
在你的應用程式上運行zipalign,使得在運行時Android與應用程式間的互動更加有效率。因此,這種方式能夠讓應用程式和整個系統運行得更快。
在Android中,當資源檔通過記憶體映射對齊到4位元組邊界時,訪問資源檔的代碼才是有效率的。zipalign 可以簡單最佳化APP.