[Android]Ziplign打包最後一步

大搜車-自娛發表於2013-11-18
Android SDK中包含一個“zipalign”的工具,它能夠對打包的應用程式進行優化。在你的應用程式上執行zipalign,使得在執行時Android與應用程式間的互動更加有效率。因此,這種方式能夠讓應用程式和整個系統執行得更快。我們強烈推薦在新的和已經發布的程式上使用zipalign工具來得到優化後的版本——即使你的程式是在老版本的Android平臺下開發的。這篇文章將描述zipalign如何有助於效能改善以及如何使用它來優化你的app。

在Android中,每個應用程式中儲存的資料檔案都會被多個程式訪問:安裝程式會讀取應用程式的manifest檔案來處理與之相關的許可權問題;Home應用程式會讀取資原始檔來獲取應用程式的名和圖示;系統服務會因為很多種原因讀取資源(例如,顯示應用程式的Notification);此外,就是應用程式自身用到資原始檔。

[color=red]在Android中,當資原始檔通過記憶體對映對齊到4位元組邊界時,訪問資原始檔的程式碼才是有效率的。但是,如果資源本身沒有進行對齊處理(未使用zipalign工具),它就必須回到老路上,顯式地讀取它們——這個過程將會比較緩慢且會花費額外的記憶體。[/color]

對於應用程式開發者來說,這種顯式讀取方式是相當便利的。它允許使用一些不同的開發方法,包括正常流程中不包含對齊的資源,因此,這種讀取方式具有很大的便利性(本段的原始意思請參考原文)。

[color=red]遺憾的是,對於使用者來說,這個情況恰恰是相反的——從未對齊的apk中讀取資源比較慢且花費較多記憶體。最好的情況是,Home程式和未對齊的程式啟動得比對齊後的慢(這也是唯一可見的效果)。最壞的情況是,安裝一些未對齊資源的應用程式會增加記憶體壓力,並因此造成系統反覆地啟動和殺死程式。最終,使用者放棄使用如此慢又耗電的裝置。[/color]

幸運的是,對應用程式中的資源作對齊操作很簡單:

· 使用ADT:

o 如果你使用匯出嚮導的話,Eclipse中的ADT外掛(從Ver. 0.9.3開始)就能自動對齊Release程式包。使用嚮導,右擊工程屬性,選擇“Android Tools” > “Export Signed Application Package…”。當然,你還可以通過AndroidManifest.xml編輯器的第一頁做到。

· 使用Ant:

o Ant編譯指令碼(從Android 1.6開始)可以對齊程式包。老平臺的版本不能通過Ant編譯指令碼進行對齊,必須手動對齊。

o 從Android 1.6開始,Debug模式下編譯時,Ant自動對齊和簽名程式包。

o Release模式下,如果有足夠的資訊簽名程式包的話,Ant才會執行對齊操作,因為對齊處理髮生在簽名之後。為了能夠簽名程式包,進而執行對齊操作,Ant必須知道keystore的位置以及build.properties中key的名字。相應的屬性名為key.store和key.alias。如果這些屬性為空,簽名工具會在編譯過程中提示輸入store/key的密碼,然後指令碼會執行簽名及apk檔案的對齊。如果這些屬性都沒有,Release程式包不會進行簽名,自然也就不會進行對齊了。

· 手動:

o 為了能夠手動對齊程式包,Android 1.6及以後的SDK的tools/資料夾下都有zipalign工具。你可以使用它來對齊任何版本下的程式包。你必須在簽名apk檔案後進行,使用以下命令:zipalign -v 4 source.apk destination.apk

· 驗證對齊:

o [color=red] 以下的命令用於檢查程式包是否進行了對齊:zipalign -c -v 4 application.apk
[/color]
我們極力推薦手動zipalign你的應用程式,並確保將最新對齊後的版本提供給使用者。此外,別忘了還有你的新應用程式也需要這麼做!

相關文章