Dalvik是啥呢?
從未知道冰島有Dalvik這麼一個重要的村莊,直到Dan Bornstein将自己為Android系統編寫的程序虛拟機命名為Dalvik後才被我所知。
它是Android系統獨有的,主要作用就是使得已轉換為 .dex(即Dalvik Executable)格式的Java應用程式在Android系統上運作。
它是Java運作在Android系統的基礎。那麼問題就來了,有标準的Java虛拟機JVM,為啥還要新造一個Dalvik呢?
答案很簡潔,就是為了更加适合資源十分有限的嵌入式系統。
也許Google進行了很多努力使得Dalvik比JVM在Android上更高效,但是業界最終還是不滿意,認為Dalvik拖慢了Android的速度。
在Android4.4中Google進行了另外的嘗試,那就是ART(Android Runtime)的技術預覽。我當然也進行了切換(在設定--開發者選項---選擇運作環境),
結果是原來的應用會重新編譯(代碼預讀取編譯),變得很大,速度有多大的提升,我用肉眼去看還沒有太大差别,但官方公布的資料說提升還是很大的。
不過有些應用還不支援ART。在Android5.0中Google揮起大刀,終于将Dalvik砍掉,用ART完全将其替換掉。
Dalvik的口水戰
一年以前,我的閑暇時光是在玩微網誌中度過的。
有一天中午和齊天、周權午飯回來翻翻微網誌,看到“CSDN移動”發了這樣一條消息:
【Java通向ObjC語言的橋梁:谷歌J2ObjC 0.7新版亮相】Google近日釋出了開源指令行工具J2ObjC的最新版本:J2ObjC 0.7。J2ObjC完全開源,通過它,開發iOS應用隻需用Objective-C編寫UI部分代碼,其餘功能均可用Java語言編寫實作。
我對這種轉換是不太感冒的,掃了一眼評論,一個id叫辦公軟體的評論我覺得有待商榷,他是這樣說的:
“Android不是Java,無非是用了Java文法罷了,運作層面上和Java基本無關。”
我覺得哪裡有些别扭,也許他說的運作層面上和Java基本無關指的的Linux Kernel?但我了解的運作層面是包含了應用的運作以及FWK,那麼跟Java就逃不了關系了。我就回了一句:
“不是單單用了Java文法吧?上層應用是Java Applications,從下向上數第二層的Android Runtime中的Dalvik 虛拟機,都是Java的存在。請看Android系統架構。另外,看看為什麼google要提供NDK。”
沒想到我就是簡單的描述一下我的了解,卻造來了“辦公軟體”的指責:
“harmony的類庫, 照你這麼說,我當年用J#包裝了一堆Java API, 也算是Java? 請不要這麼不專業.”
我抱着心平氣和讨論的态度,順着他說:
“兄弟,其實我們倆可以心平氣和的讨論一些問題。J#是微軟用Java的文法來吸引原Java開發者,這個确實如你所說,隻是Java的文法,但是J#使用的.Net運作時,仍是一種虛拟機。”
對方的傲慢簡直令人做嘔:
“很遺憾,對于一些連名詞都搞喜歡混淆的同學,我的面試時間隻給3分鐘”
我一直壓着火,繼續回着:
“請問,我哪個名詞搞混淆?你說話之前不看人家的上下文麼?還是沒了解别人說的重點在哪裡?你這樣的面試官,偶一般隻給一分鐘。還擺上老資格了,誰沒當過呀。。。呵呵”
“也許沒猜錯的話,你一直在認為我說的是“JVM = Dalvik VM”,但是我主要表達的是,Dalvik VM 是一種Java 虛拟機。無論怎樣,我這樣表達應該是成立的。歡迎圖草。”
結果話題有轉到了JVM與Dalvik上面了,對方也回了三條:
“Dalvik VM壓根就不符合JVM規範,你卻說這是Java虛拟機? 照你這麼說,J#跑在CLR上,CLR也是Java虛拟機?”
“你主要表達的是,"Dalvik VM 是一種Java 虛拟機",奇葩啊奇葩, 哪門子來的Java虛拟機喲,”
“JRockit是一種Java虛拟機, J9 是一種Java虛拟機,ZingVM是一種Java虛拟機,Hotspot是一種Java虛拟機, 為啥這麼定義? 因為他們follow了Java虛拟機的規範. Dalvik VM是Java虛拟機嗎? 估計隻有你和你看的那邊書的作者才這麼認為”
後來的争論就在“Dalvik是不是一種Java虛拟機”這個命題上了。讓我想到了白馬非馬論,“求馬,黃黑馬皆可緻,求白馬,黃黑馬不可緻”。
但他的一些說法還是值得肯定的,比如:
“Harmony的虛拟機,就是個完全符合JVM标準的虛拟機. Android用了Harmony的類庫,但是Android 的VM,和JVM标準完全不搭界.”
齊天也看到了這場争吵,對我說,對方是個上了邪路的人,與他争論有和意義?
參考:
1.wikipedia中對Dalvik的描述:
Dalvik is the process virtual machine (VM) in Google's Android operating system, which, specifically, executes applications written for Android.