国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
Dalvik虛擬機(jī)簡(jiǎn)介

什么是Dalvik虛擬機(jī)?

      Google于2007年底正式發(fā)布了Android SDK, 作為Android系統(tǒng)的重要特性,Dalvik虛擬機(jī)也第一次進(jìn)入了人們的視野。它對(duì)內(nèi)存的高效使用,和在低速CPU上表現(xiàn)出的高性能,確實(shí)令人刮目相看。依賴于底層Posix兼容的操作系統(tǒng),它可以簡(jiǎn)單的完成進(jìn)程隔離和線程管理。每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。

      很多人認(rèn)為Dalvik虛擬機(jī)是一個(gè)Java虛擬機(jī),因?yàn)锳ndroid的編程語(yǔ)言恰恰就是Java語(yǔ)言。但是這種說(shuō)法并不準(zhǔn)確,因?yàn)镈alvik虛擬機(jī)并不是按照J(rèn)ava虛擬機(jī)的規(guī)范來(lái)實(shí)現(xiàn)的,兩者并不兼容;同時(shí)還要兩個(gè)明顯的不同:

  • Java虛擬機(jī)運(yùn)行的是Java字節(jié)碼,而Dalvik虛擬機(jī)運(yùn)行的則是其專有的文件格式DEX(Dalvik Executable)。
  • 在Java SE程序中的Java類會(huì)被編譯成一個(gè)或者多個(gè)字節(jié)碼文件(.class)然后打包到JAR文件,而后Java虛擬機(jī)會(huì)從相應(yīng)的CLASS文件和JAR文 件中獲取相應(yīng)的字節(jié)碼;Android應(yīng)用雖然也是使用Java語(yǔ)言進(jìn)行編程,但是在編譯成CLASS文件后,還會(huì)通過(guò)一個(gè)工具(dx)將應(yīng)用所有的 CLASS文件轉(zhuǎn)換成一個(gè)DEX文件,而后Dalvik虛擬機(jī)會(huì)從其中讀取指令和數(shù)據(jù)。


Dalvik和Android系統(tǒng)

      Android作為新一代的基于Linux的開(kāi)源手機(jī)操作系統(tǒng),其系統(tǒng)架構(gòu)由下而上可以分為以下幾部分:

  1. Linux內(nèi)核
  2. 本地庫(kù)
  3. Android運(yùn)行庫(kù)
  4. 應(yīng)用框架
  5. 應(yīng)用

圖表1 

      如圖所示,Android運(yùn)行庫(kù)包括兩部分:核心庫(kù)和Dalvik虛擬機(jī)。核心庫(kù)包括了最基本的類庫(kù),如data structure, network, Utilities, File system等的,很多實(shí)現(xiàn)代碼都是來(lái)自Apache Harmony項(xiàng)目,主要目的是保證虛擬機(jī)的類庫(kù)能夠和Java SE的類庫(kù)最大可能的兼容,從而降低應(yīng)用開(kāi)發(fā)者從JavaSE陣營(yíng)轉(zhuǎn)移到Android開(kāi)發(fā)陣營(yíng)的難度,增加其可用性。Dalvik虛擬機(jī)主要是完成對(duì)象生命周期的管理,堆棧的管理,線程管理,安全和異常的管理,以及垃圾回收等等重要功能。

Dalvik虛擬機(jī)的主要特征

     Dalvik虛擬機(jī)非常適合在移動(dòng)終端上使用,相對(duì)于在桌面系統(tǒng)和服務(wù)器系統(tǒng)運(yùn)行的虛擬機(jī)而言,它不需要很快的CPU速度和大量的內(nèi)存空間。根據(jù)Google的測(cè)算,64M的RAM已經(jīng)能夠令系統(tǒng)正常運(yùn)轉(zhuǎn)了。其中24M被用于底層系統(tǒng)的初始化和啟動(dòng),另外20M被用于高層啟動(dòng)高層服務(wù)。當(dāng)然,隨著系統(tǒng)服務(wù)的增多和應(yīng)用功能的擴(kuò)展,其所消耗的內(nèi)存也勢(shì)必越來(lái)越大。

      歸納起來(lái),Dalvik虛擬機(jī)有如下幾個(gè)主要特征:

  • 專有的DEX文件格式

      DEX是Dalvik虛擬機(jī)專用的文件格式,而問(wèn)什么棄用已有的字節(jié)碼文件(CLASS文件)而采用新的格式呢?

   1.一個(gè)應(yīng)用中會(huì)定義很多類,編譯完成后即會(huì)有很多相應(yīng)的CLASS文件,CLASS文件間會(huì)有不少冗余的信息;而DEX文件格式會(huì)把所有的CLASS文件內(nèi)容整合到一個(gè)文件中。這樣,除了減少整體的文件尺寸,I/O操作,也提高了類的查找速度。

      原來(lái)每個(gè)類文件中的常量池,在DEX文件中由一個(gè)常量池來(lái)管理,具體方式如下圖:

圖表2

圖表3

      2.增加了新的操作碼的支持

      3.文件結(jié)構(gòu)盡量簡(jiǎn)潔,使用等長(zhǎng)的指令,借以提高解析速度

      4. 盡量擴(kuò)大只讀結(jié)構(gòu)的大小,借以提高跨進(jìn)程的數(shù)據(jù)共享

      如何生成DEX文件呢?Android系統(tǒng)和Dalvik虛擬機(jī)提供了工具(DX),在把Java源代碼編譯成CLASS文件后,使用DX工具。

圖表4

  • DEX的優(yōu)化

      DEX文件的結(jié)構(gòu)是緊湊的,然是如果我們還想要求運(yùn)行時(shí)的性能有進(jìn)一步提高,我們就仍然需要對(duì)DEX文件進(jìn)行進(jìn)一步優(yōu)化。優(yōu)化主要是針對(duì)以下幾個(gè)方面:

  1. 調(diào)整所有字段的字節(jié)序(LITTLE_ENDIAN)和對(duì)齊結(jié)構(gòu)中的沒(méi)一個(gè)域
  2. 驗(yàn)證DEX文件中的所有類
  3. 對(duì)一些特定的類進(jìn)行優(yōu)化,對(duì)方法里的操作碼進(jìn)行優(yōu)化

      優(yōu)化后的文件大小會(huì)有所增加,應(yīng)該是原DEX文件的1-4倍。

     優(yōu)化發(fā)生的時(shí)機(jī)有兩個(gè):對(duì)于預(yù)置應(yīng)用,可以在系統(tǒng)編譯后,生成優(yōu)化文件,以O(shè)DEX結(jié)尾。這樣在發(fā)布時(shí)除APK文件(不包含DEX)以外,還有一個(gè)相應(yīng)的ODEX文件;對(duì)于非預(yù)置應(yīng)用,包含在APK文件里的DEX文件會(huì)在運(yùn)行時(shí)被優(yōu)化,優(yōu)化后的文件將被保存在緩存中。

  • 基于寄存器

      相對(duì)于基于堆棧的虛擬機(jī)實(shí)現(xiàn),基于寄存器的虛擬機(jī)實(shí)現(xiàn)雖然在硬件通用性上要差一些,但是它在代碼的執(zhí)行效率上卻更勝一籌。一般來(lái)講,虛擬機(jī)中指令的解釋執(zhí)行時(shí)間主要花在以下三個(gè)方面:

  1. 分發(fā)指令
  2. 訪問(wèn)運(yùn)算數(shù)
  3. 執(zhí)行運(yùn)算

      其中“分發(fā)指令”這個(gè)環(huán)節(jié)對(duì)性能的影響最大。在基于寄存器的虛擬機(jī)里,可以更為有效的減少冗余指令的分發(fā)和減少內(nèi)存的讀寫訪問(wèn),如:

圖表5

      雖然Dalvik虛擬機(jī)并沒(méi)有使用目前流行的虛擬機(jī)技術(shù),如JIT,但是根據(jù)Google的報(bào)告,這個(gè)功能的缺失并沒(méi)有另Dalvik虛擬機(jī)在性能上有所損失。我們也同時(shí)相信,Dalvik虛擬機(jī)的性能還有進(jìn)一步提高的空間。 

  • 一個(gè)應(yīng)用,一個(gè)虛擬機(jī)實(shí)例,一個(gè)進(jìn)程

     每一個(gè)Android應(yīng)用都運(yùn)行在一個(gè)Dalvik虛擬機(jī)實(shí)例里,而每一個(gè)虛擬機(jī)實(shí)例都是一個(gè)獨(dú)立的進(jìn)程空間。虛擬機(jī)的線程機(jī)制,內(nèi)存分配和管理,Mutex等等都是依賴底層操作系統(tǒng)而實(shí)現(xiàn)的。所有Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制。

      不同的應(yīng)用在不同的進(jìn)程空間里運(yùn)行,加之對(duì)不同來(lái)源的應(yīng)用都使用不同的Linux用戶來(lái)運(yùn)行,可以最大程度的保護(hù)應(yīng)用的安全和獨(dú)立運(yùn)行。

     Zygote是一個(gè)虛擬機(jī)進(jìn)程,同時(shí)也是一個(gè)虛擬機(jī)實(shí)例的孵化器,每當(dāng)系統(tǒng)要求執(zhí)行一個(gè)Android應(yīng)用程序,Zygote就會(huì)FORK出一個(gè)子進(jìn)程來(lái)執(zhí)行該應(yīng)用程序。這樣做的好處顯而易見(jiàn):Zygote進(jìn)程是在系統(tǒng)啟動(dòng)時(shí)產(chǎn)生的,它會(huì)完成虛擬機(jī)的初始化,庫(kù)的加載,預(yù)置類庫(kù)的加載和初始化等等操作,而在系統(tǒng)需要一個(gè)新的虛擬機(jī)實(shí)例時(shí),Zygote通過(guò)復(fù)制自身,最快速的提供個(gè)系統(tǒng)。另外,對(duì)于一些只讀的系統(tǒng)庫(kù),所有虛擬機(jī)實(shí)例都和Zygote共享一塊內(nèi)存區(qū)域,大大節(jié)省了內(nèi)存開(kāi)銷。

圖表6

      應(yīng)用程序包(APK)被發(fā)布到手機(jī)上后,運(yùn)行前會(huì)對(duì)其中的DEX文件進(jìn)行優(yōu)化,優(yōu)化后的文件被保存到緩存區(qū)域(優(yōu)化后的格式被稱為DEY),虛擬機(jī)會(huì)直接執(zhí)行該文件。如果應(yīng)用包文件不發(fā)生變化,DEY文件不會(huì)被重新生成。

圖表7 

Android應(yīng)用開(kāi)發(fā)和Dalvik虛擬機(jī)

    Android應(yīng)用所使用的編程語(yǔ)言是Java語(yǔ)言,和JavaSE一樣,編譯時(shí)使用SunJDK將Java源程序編程成標(biāo)準(zhǔn)的Java字節(jié)碼文件(.class文件),而后通過(guò)工具軟件DX把所有的字節(jié)碼文件轉(zhuǎn)成DEX文件(classes.dex)。最后使用Android打包工具(aapt)將DEX文件,資源文件以及AndroidManifest.xml文件(二進(jìn)制格式)組合成一個(gè)應(yīng)用程序包(APK)。應(yīng)用程序包可以被發(fā)布到手機(jī)上運(yùn)行。(作者:薛飛)

圖表8


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
圖解Android應(yīng)用程序構(gòu)建原理
Android系統(tǒng)層次結(jié)構(gòu)是怎樣的?各個(gè)層之間關(guān)系是什么?
Android中的動(dòng)態(tài)加載機(jī)制
APK應(yīng)用程序的解包、修改、編輯、打包及應(yīng)用 by SunnyOKOK
Android Kitkat系列文章—OAT文件分析—Part1
andriod的apk文件相關(guān)的編譯反編譯工具
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服