Zipalign apk對齊優化

2021-06-21 02:51:41 字數 1285 閱讀 3209

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

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

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

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

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

·           使用adt:

·           使用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

·           驗證對齊:

我們極力推薦手動zipalign你的應用程式,並確保將最新對齊後的版本提供給使用者。此外,別忘了還有你的新應用程式也需要這麼做!

Nginx記憶體對齊優化

nginx在記憶體使用方面做了較多優化,其中有一項就是記憶體對齊。記憶體對齊都有哪些好處?單從nginx的 來看,有兩點 減少cpu訪問記憶體次數,我們知道cpu都有乙個叫做匯流排寬度的東西,我們平時所說的32位cpu,其實就是它的匯流排寬度是32位,也就是一次能讀32 8 4個位元組。假設有一塊記...

JVM快取行對齊效能優化

快取是由多個快取行組成的,以快取行為基本單位,乙個快取行的大小一般為64位元組。因為快取行存在,當不同的執行緒在操作兩份不同的資料時,如果這兩份資料剛好位於同乙個快取行中,那麼彼此之間就會互相影響。所以為了解決偽共享的問題,就出現了快取行對齊的方式,也就是讓c d兩份資料分別獨佔乙個快取行,這樣就不...

Linux 位元組序與位元組對齊優化

1.位元組序跟linux windows無關,是由cpu構架決定 同乙個cpu不管裝的是windows 或 linux 位元組序都是一樣的 2.位元組對齊 linux 全用 attribute packed 作用於結構體,類似於pragma packet 1 使用方法如下 typdef struct...