1. 程式人生 > >android項目構建過程

android項目構建過程

cati 引入 程序啟動 如何 java代碼 什麽 cpu 平臺 dex

平時開發過程中我們通過android studio編寫完成android項目之後直接點擊 Run ‘app’就可以在build/outputs/apk生成可以在android設備中安裝的apk文件了,那麽整個android源碼的構建過程是怎麽樣的呢?

我們可以根據Google官方提供的流程圖來具體了解構建的過程:
技術分享圖片

通常的構建過程就是如上圖所示,下面是具體描述:

1.AAPT(Android Asset Packaging Tool)工具會打包應用中的資源文件,如AndroidManifest.xml、layout布局中的xml等,並將xml文件編譯為二進制形式,當然assets文件夾中的文件不會被編譯,圖片及raw文件夾中的資源也會保持原來的形態,需要註意的是raw文件夾中的資源也會生成資源id。AAPT編譯完成之後會生成R.java文件。

2.AIDL工具會將所有的aidl接口轉化為java接口。

3.所有的java代碼,包括R.java與aidl文件都會被Java編譯器編譯成.class文件。

4.Dex工具會將上述產生的.class文件及第三庫及其他.class文件編譯成.dex文件(dex文件是Dalvik虛擬機可以執行的格式),dex文件最終會被打包進APK文件。

5.ApkBuilder工具會將編譯過的資源及未編譯過的資源(如圖片等)以及.dex文件打包成APK文件。

6.生成APK文件後,需要對其簽名才可安裝到設備,平時測試時會使用debug keystore,當正式發布應用時必須使用release版的keystore對應用進行簽名。

7.如果對APK正式簽名,還需要使用zipalign工具對APK進行對齊操作,這樣做的好處是當應用運行時減少內存的開銷。

補充: 關於改善android性能工具zipalign的介紹

什麽是Zipalign?
Zipalign是一個android平臺上整理APK文件的工具,它首次被引入是在Android 1.6版本的SDK軟件開發工具包中。它能夠對打包的Android應用程序進行優化, 以使Android操作系統與應用程序之間的交互作用更有效率,這能夠讓應用程序和整個系統運行得更快。用Zipalign處理過的應用程序執行時間達到最低限度,當設備運行APK應用程序時占更少的RAM(Random Access Memory)隨機訪問內存,我們強烈推薦在新的和已經發布的程序上使用zipalign工具來得到優化後的版本--即使你的程序是在老版本的Android平臺下開發的

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

android項目構建過程