一個iOS開發的Android開發之旅-系統概述

最近在學習Android開發的知識,將學習過程當中的心路感想記錄下來,既是對本身的學習總結,也但願能給後人提供一些幫助。整個系列會盡可能穿插對比iOS開發中相關的知識和概念,包括控件、佈局、思想等。java

APK編譯打包過程

apk打包流程圖

流程概述:

  1. 經過AAPT命令對資源文件(res文件夾)進行編譯,生成R.java(資源id常量文件)和resources.arsc(資源索引表)。
  • 資源id相似於iOS中UIView的tag屬性,能夠惟一肯定一個資源;在Android中資源的概念不限於控件視圖,除了assets外,其餘的資源都會被賦予一個資源id。
  • 在開發工具如Andriod Studio中寫Android應用的時候,IDE直接幫咱們生成了R.java文件,本質上也是經過aapt來編譯資源文件生成的。
  • Resources.arsc是資源索引表,維護資源Id,name,path的對應關係。經過resources.arsc把id轉化成資源文件的名稱,而後交由AssetManager來加載。
  1. R.java,項目代碼src等java文件經過javac命令編譯成.class文件;
  2. 第二步的.class文件和第三方庫的.class文件經過dx命令打包成dex文件。dex會在下面解釋。
  3. apkbuilder會將編譯後的資源,編譯後的代碼以及不參與編譯的資源(如assets)一塊兒打包成apk文件。
  4. 簽名。
  5. 對齊處理.對齊主要是將apk包中的資源文件距離文件起始偏移爲4字節整數倍,這樣經過內存映射訪問apk文件時的速度會更塊。

runtime

JVM vs DVM

JVM&DVM

上文提到了dex文件,dex是和設備架構無關的字節碼.在Android程序運行時,DVM實時的將一部分Dalvik字節碼翻譯成機器碼。架構

DVM是Dalvik Virtual Machine(Android虛擬機)的縮寫,基於JVM(Java 虛擬機)的理念,同時進行了優化。JVM是基於棧的結構,DVM是基於寄存器的結構,速度更快。dex文件將多個class文件中公有的部分統一存放,去除了冗餘信息。工具

Dalvik vs ART

做爲iOS開發人員,提到runtime,必然聯想到objc的runtime。對比二者,objc的語法在編譯期就被轉化爲objc_msgSend等c語言的代碼,編譯成可直接運行的二進制碼,但這個二進制碼是平臺依賴的。而虛擬機的理念是平臺無關,因此編譯器生成的只是中間代碼,在不一樣的平臺,這個中間代碼被翻譯成不一樣的代碼。那麼,問題來了,Android程序自己就是運行在Android這個特定的平臺,理論上徹底能夠在編譯期間就編譯成可直接運行的二進制代碼,無需在運行時邊運行邊翻譯。帶着這個疑問查閱了一些資料,發現確實是有朝着這個方向發展的趨勢。佈局

ART

從Android 4.4開始,引入了ART運行時機制,ART使用AOT(Ahead of time )編譯,在應用的安裝期間,就將DEX字節碼翻譯成機器碼並存儲在設備的存儲器上。因爲ART執行的是native code,代碼執行速度和資源佔用都更有優點。學習

這一篇簡單介紹了apk編譯打包的流程及Android虛擬機的介紹,不足之處歡迎評論指出。下一篇將進入控件和界面佈局篇。開發工具

相關文章
相關標籤/搜索