在Android中,比較重要的Java組件包括Java核心庫(kù)、Dalvik虛擬機(jī)等,兩者一起構(gòu)成了Android的應(yīng)用環(huán)境基礎(chǔ)。
1.核心庫(kù)(Core Libraries)
在Android中,Java的核心庫(kù)如數(shù)據(jù)結(jié)構(gòu)(Data Structures)、工具(Utilities)、文件接入(File Access)、網(wǎng)絡(luò)接入(Network Access)、圖形(Grapgics)等得以保留。目前兼容的Java版本為JDK 5.0 update 12及以上,由于部分特性的兼容性原因,在Foryo以前,JDK 6.0尚不被兼容。這在開(kāi)發(fā)Android時(shí)需要稍加注意。
Android核心庫(kù)的具體實(shí)現(xiàn)位于libcore目錄中,Java部分終會(huì)被打包為core.jar包,經(jīng)過(guò)安裝,終將被放置在目標(biāo)文件系統(tǒng)的system\framework\目錄中,當(dāng)桌面啟動(dòng)時(shí)首先加載,作為Java程序的一個(gè)基礎(chǔ)包。
libcore中的C/C++代碼被編譯為libjavacore.a靜態(tài)庫(kù),是Java核心庫(kù)的本地代碼。
另外,libcore目錄中還包括部分測(cè)試用例,用來(lái)測(cè)試Java核心庫(kù)的基本接口功能實(shí)現(xiàn),在移植Android或者其虛擬機(jī)時(shí),也可以使用它們來(lái)測(cè)試Java核心庫(kù)的功能。
核心庫(kù)主要實(shí)現(xiàn)了以下Java基礎(chǔ)包:
-Java標(biāo)準(zhǔn)API(java包)
-Java擴(kuò)展API(javax包)
-企業(yè)和組織提供的Java類庫(kù)(org包)
注意:Android核心庫(kù)雖然實(shí)現(xiàn)了Java標(biāo)準(zhǔn)部分的大部分內(nèi)容,但也有部分API沒(méi)有被支持,比如GUI系統(tǒng)的Swing等。
2.Dalvik
Dalvik(Dalvik是冰島的一個(gè)小鎮(zhèn)名)是Google針對(duì)移動(dòng)終端環(huán)境下計(jì)算能力有限、RAM空間有限、沒(méi)有交換空間、電池供電的資源有限環(huán)境而開(kāi)發(fā)的Java虛擬機(jī)。通過(guò)基于寄存器而非內(nèi)存的優(yōu)化的字節(jié)碼,雖然Dalvik虛擬機(jī)并沒(méi)有采用目前流行的虛擬機(jī)技術(shù)如JIT,但Dalvik比傳統(tǒng)的JVM更加高效和節(jié)省內(nèi)存。JVM的內(nèi)容可以參考文獻(xiàn)[15]。
與傳統(tǒng)的JVM不同的另一方面在于,Android采用的Core Java并沒(méi)有包含Java SE和Java ME提供的全部特性,而是僅支持了Java SE的一個(gè)子集。
在Android運(yùn)行環(huán)境中,第一個(gè)啟動(dòng)的Dalvik虛擬機(jī)名為Zygote。Zygote在系統(tǒng)啟動(dòng)期間即被創(chuàng)建。
在運(yùn)行期間,Dalvik虛擬機(jī)啟動(dòng)運(yùn)行的是經(jīng)過(guò)優(yōu)化的DEX字節(jié)碼。傳統(tǒng)的JAR字節(jié)碼在編譯期間會(huì)被轉(zhuǎn)換為DEX字節(jié)碼。DEX字節(jié)碼能夠比JAR字節(jié)碼節(jié)省一半的空間。
另外,Dalvik還負(fù)責(zé)完成對(duì)象生命周期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等功能。