什么是Zipalign?
Zipalign是一個android平台上整理APK文件的工具,它首次被引入是在Android 1.6版本的SDK軟件開發工具包中。它能夠對打包的Android應用程序進行優化, 以使Android操作系統與應用程序之間的交互作用更有效率,這能夠讓應用程序和整個系統運行得更快。用Zipalign處理過的應用程序執行時間達到最低限度,當設備運行APK應用程序時占更少的RAM(Random Access Memory)隨機訪問內存,我們強烈推薦在新的和已經發布的程序上使用zipalign工具來得到優化后的版本——即使你的程序是在老版本的Android平台下開發的。這篇文章將介紹zipalign運行原理,以及如何使用它來優化你的app。
Zipalign如何優化?
Zipalign對apk文件中未壓縮的數據在4個字節邊界上對齊,當資源文件通過內存映射對齊到4字節邊界時,訪問資源文件的代碼才是有效率的。4字節對齊后,android系統就可以通過調用mmap函數讀取文件,進程可以像讀寫內存一樣對普通文件的操作,系統共享內存IPC,以在讀取資源上獲得較高的性能。 如果資源本身沒有進行對齊處理,它就必須顯式地讀取它們——這個過程將會比較緩慢且會花費額外的內存。
mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以像訪問普通內存一樣對文件進行訪問,不必再調用read(),write()等操作.
程序中大量運用mmap,用到的正是mmap的這種“像訪問普通內存一樣對文件進行訪問”的功能。當要對一個文件頻繁的進行訪問,並且指針來回移動時,調用mmap比用常規的方法快很多
在4個字節邊界上對齊的意思就是指編譯器吧4個字節作為一個單位來進行讀取的結果,這樣的話,CPU能夠對變量進行高效、快速的訪問(較之前不對齊)。
android系統中的Davlik虛擬機使用自己專有的格式DEX,DEX的結構是緊湊的,為了讓運行時的性能更好,可以進一步用"對齊"進一步優化,但是大小一般會有所增加。
從未對齊的apk中讀取資源比較慢且花費較多內存。最好的情況是,Home程序和未對齊的程序啟動得比對齊后的慢(這也是唯一可見的效果)。最壞的情況是,安裝一些未對齊資源的應用程序會增加內存壓力,並因此造成系統反復地啟動和殺死進程。最終,用戶放棄使用如此慢又耗電的設備。
Zipalign如何使用?
使用ADT:
- 如果你使用導出向導的話,Eclipse中的ADT插件(從Ver. 0.9.3開始)就能自動對齊Release程序包。使用向導,右擊工程屬性,選擇“Android Tools” > “Export Signed Application Package…”。當然,你還可以通過AndroidManifest.xml編輯器的第一頁做到。
使用Ant:
- Ant編譯腳本(從Android 1.6開始)可以對齊程序包。老平台的版本不能通過Ant編譯腳本進行對齊,必須手動對齊。
- 從Android 1.6開始,Debug模式下編譯時,Ant自動對齊和簽名程序包。
- Release模式下,如果有足夠的信息簽名程序包的話,Ant才會執行對齊操作,因為對齊處理發生在簽名之后。為了能夠簽名程序包,進而執行對齊操作,Ant必須知道keystore的位置以及build.properties中key的名字。相應的屬性名為key.store和key.alias。如果這些屬性為空,簽名工具會在編譯過程中提示輸入store/key的密碼,然后腳本會執行簽名及apk文件的對齊。如果這些屬性都沒有,Release程序包不會進行簽名,自然也就不會進行對齊了。
手動:
- 為了能夠手動對齊程序包,Android 1.6及以后的SDK的tools/文件夾下都有zipalign工具。你可以使用它來對齊任何版本下的程序包。你必須在簽名apk文件后進行,使用以下命令:zipalign -v 4 source.apk destination.apk
- 驗證對齊:
- 以下的命令用於檢查程序包是否進行了對齊:zipalign -c -v 4 application.apk