平時開發過程當中咱們經過android studio編寫完成android項目以後直接點擊 Run ‘app’就能夠在build/outputs/apk生成能夠在android設備中安裝的apk文件了,那麼整個android源碼的構建過程是怎麼樣的呢?java
咱們能夠根據Google官方提供的流程圖來具體瞭解構建的過程:
android
一般的構建過程就是如上圖所示,下面是具體描述:app
1.AAPT(Android Asset Packaging Tool)工具會打包應用中的資源文件,如AndroidManifest.xml、layout佈局中的xml等,並將xml文件編譯爲二進制形式,固然assets文件夾中的文件不會被編譯,圖片及raw文件夾中的資源也會保持原來的形態,須要注意的是raw文件夾中的資源也會生成資源id。AAPT編譯完成以後會生成R.java文件。dom
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:
使用Ant:
手動: