當前位置:首頁 » 安卓系統 » javaandroid虛擬機

javaandroid虛擬機

發布時間: 2023-08-21 03:38:08

安卓系統是用java開發的嗎

android是基於linux的開源操作系統。 linux是使用標准C語言開發的操作系統。 android底層驅動以及操作系統內核使用C語言以及匯編開發。 android操作系統本身是使用Java開發,並使用JNI調用本地的C語言庫,型鉛旁實現操作系統底層調度。 android應用是使用Java開發;同時也可以使用C/C++ native開發,但是多數時激明候不用用到C。所以基本上就是Java為標准開發語言。 android使用了修改過的JVM(Java虛擬機)叫做dalvik虛擬機,其本質還是Java虛擬機。 所以對應每一個APP都卜橡會創建個dalvik虛擬機,也就是一個linux進程。 說復雜了,其實就是基於linux下的修改版Java虛擬機,運行java程序。

㈡ Android現在支持純C/C++語言開發應用嗎還需要ART/Java虛擬機嗎

目前截止到2.3系統來看,最終安裝的文件仍然是apk格式,界面和系統大多數功能均使用Java開發,但是稍微高端的應用考慮到性能和安全性使用C/C++是必要的,C/C++最終編譯的so文件就相當於Windows下的dll動態庫,需要一個宿主去載入調用,我們通過Java的JNI去調用這些本地方法,目前從NDK的版本來看Google不斷增強和開放C++在Android開發的用處,以保證和iPhone這種使用本地語言開發出來的軟體體驗度不能差距太大。


安卓底層是用C/C++開發的,如果需要編和升寫很牛逼的android應用的話,毫無疑問的說,一定會用到C或者C++,但是Android的應用框架是用Java寫的,而開發者一般而言只會用到應用框架這一層面,所以可以這么說,Android開發基本上就是使用Java語言進行開發。如果你有對Java比較了解的話,那麼你一定就會知道JNI,是java調用C/C++代碼的一種機制,這樣就可以使得可以在Android終端設備上跑C++代碼了~我和你說,我就是大三才開始學Java和android開發的,喚渣老大二升大三的那個假期自學Java,開學後開始學Android開發的,想要學習,永遠都不晚!哇撒撒~碼了不少梁州字,望採納


㈢ Android java虛擬機和sun java虛擬機區別

(1) Dalvik VM和JVM 的第一個區別是 Dalvik VM是基於寄存器的架構(reg based),而JVM是棧機(stack based)。reg based VM的好處是可以做到更好的提前優化(ahead-of-time optimization)。 另外reg based的VM執行起來更快,但是代價是更大的代碼長度。

(2) 另外一個區別是Dalvik可以允許多個instance 運行,也就是說每一個Android 的App是獨立跑在一個VM中.這樣做的好處是一個App crash只會影響到自身的VM,不會影響到其他。 Dalvik的設計是每一個Dalvik的VM都是Linux下面的一個進程。那麼這就需要高效的IPC。另外每一個VM是單獨運行的好處還有可以動態active/deactive自己的VM而不會影響到其他VM
(3) 接下來就是關於版權之類爭論。(可以參看下面文章)
既然reg based VM有那麼多好處,為什麼之前設計JAVA的人沒有採用reg based而是採用stack based的呢? 原來stack based的VM也有其優點,就是它不對host平台的reg數量做假設,有利於移植到不同的平台。而Dalvik則不關心這些,因為它本來就是為ARM這樣的多reg平台設計的。另外Dalvik被移植到x86也說明,即使是x86這種reg很少的平台,reg based的VM也是沒有問題的。

下面著重說下DVM的優勢:(部分文字我加黑以突出)
1、在編譯時提前優化代碼而不是等到運行時
2、 虛擬機很小,使用的空間也小;被設計來滿足可高效運行多種虛擬機實例。
3、常量池已被修改為只使用32位的索引,以 簡化解釋器

JVM 的位元組碼主要是零地址形式的,概念上說JVM是基於棧的架構。Google Android平台上的應用程序的主要開發語言是Java,通過其中的Dalvik VM來運行Java程序。為了能正確實現語義,Dalvik VM的許多設計都考慮到與JVM的兼容性;但它卻採用了基於寄存器的架構,其位元組碼主要是二地址/三地址的混合形式。

基於棧與基於寄存器的 架構,誰更快?現在實際的處理器,大多都是基於寄存器的架構,從側面反映出基於寄存器比基於棧的架構更與實際的處理器接近。但對於VM來說,源架構的求值 棧或者寄存器都可能是用實際機器的內存來模擬的,所以性能特性與實際硬體又有不同。一般認為基於寄存器架構的Dalvik VM比基於棧架構JVM執行效率更高,原因是:雖然零地址指令更緊湊,但完成操作需要更多的load/store指令,也意味著更多的指令分派 (instruction dispatch)次數與內存訪問次數;訪問內存是執行速度的一個重要瓶頸,二地址或三地址指令雖然每條指令占的空間較多,但總體來說可以用更少的指令完 成操作,指令分派與內存訪問次數都較少。

我們從下面的截圖可以明了的看到與同一段Java代碼對應的Java bytecode 與Dalvid bytecode的比較:

JVM其核心目的,是為了構建一個真正跨OS平台,跨指令集的程序運行環境(VM)。DVM的目的是為了將android OS的本地資源和環境,以一種統一的界面提供給應用程序開發。嚴格來說,DVM不是真正的VM,它只是開發的時候提供了VM的環境,並不是在運行的時候提供真正的VM容器。這也是為什麼JVM必須設計成stack-based的原因。


JVM:所有的jar程序,其運行環境完全是由JVM來提供,包括運行時,各類資源的調度,而JVM的架構,其設計為一個JVM裡面可以運行多個java程序,JVM就像一個真正的「機器」,可以跑著多個程序。如果去看看一些企業級的JVM(例如tom cat,WAS),從OS的進程管理中,一般你只能看見一個JVM的進程(當然,你也可以起多個JVM,但JVM架構就是OS-JVM-APP的3層運行時模式),而看不見JVM裡面運行的程序,而一個JVM里,可以跑多個java app。簡單得說,JVM完全屏蔽了應用程序和OS之間的聯系,而改用JVM充當了中間層,這也是一個真正跨平台運行時VM必須要做到的。只要是相同的JDK,JVM為所有在其中運行的程序,提供了完全一致的運行環境,而不論你是什麼樣的底層OS和硬體條件。因此這也是我在其他一篇答案中提到,JVM的特點是取底層OS和硬體環境的交集,從而保障這種一致性。而所有應用程序和底層資源的互動,一定是依賴JVM的傳遞和轉換來實現。JVM真正實現了一個OS對應用程序運行時管理的所有功能。從開發環境角度和運行時角度,都是完全一致的真正VM

DVM:而DVM的特點在於使用了Zygote,Zygote有幾個非常有意思的特點。
一是Zygote採用預載入,由其首先判定安裝的APK的需要以及相互依存樹,以及OS及硬體環境的特點,在每次啟動的時候進行預載入(現在你明白為什麼android的app在應用管理里你能輕易查到它都調用了那些關鍵性的本地資源的原因了吧?),這就意味著,你安裝的應用越多,Zygote的載入就越慢,一般來說你的手機啟動就會越慢。另外來說,在不同的硬體環境里(例如有無GPS晶元)Zygote初始化的實例是不同的。也就是說,zygote並不提供一個統一的運行環境,具有更好的彈性,這種機制意味著DVM可以取底層資源的合集來提供上層應用使用,差別只是在程序安裝或者啟動的過程中,DVM可以提示程序需求資源,本地環境可能未能滿足而導致無法運行。DVM的Zygote並不是提供一個運行時容器,它提供的只是一個用於共享的進程,所有的應用程序運行,都是獨立的,OS級別的進程,直接受到OS層面的資源控制以及調度的影響,只是他們共享Zygote說預載入的類而已。這也就是我為什麼說,DVM就像是給每個應用程序在底層加了個套子,而不是提供了一個真正的運行時的VM。也就是說,DVM在開發環境中說提供的VM平台,和運行時的環境是很有可能不一致的。開發環境中提供的VM平台,是一個各種運行時可能環境的合集。
從這點上來說,一般我們認為,JVM中的JAVA程序的崩潰,最多導致JVM的崩潰,而不會導致OS崩潰,但是apk的崩潰,可以直接導致OS崩潰,android手機會因為應用程序死機,大家應該是很常見了。但是大家一般是不會看到java程序導致死機吧?因為運行時中間隔著一個JVM。(當然,其實還是有些小門道可以用java程序讓OS崩潰,因為這個,我和某些JAVA大拿打賭贏過飯局,呵呵,不過這是其他話題,不在這里展開了)

除此之外,在JVM的機制中,不同的程序,打包以後,他們都是在運行層級真正獨立的程序(指程序應用他們相互之間的關系,而不是和JVM的關系),即便他們在包里使用了同樣的類,運行時都是單獨載入,單獨運行的(及載入多遍)。
DVM這種預載入-共享的機制,使得不同應用之間,在運行時,是共享相同的類的,一般來說,在系統資源消耗方面,擁有更高的效率。

最後,補充一點,byte code並不意味著就是解釋執行,也能是載入編譯,安裝編譯,預編譯等等。實際上,不同的byte code的程序,不同的技術,不同的具體語言,其真正執行的情況是挺復雜,難以一概而論的,好多都是混合技術的案例,從我對odex的技術來看,就是個典型案例。

㈣ 安卓虛擬機和java虛擬機有什麼不同

安卓虛擬機即dalvik和java虛擬機的區別如下:
1.java虛擬機基於棧。 基於棧的機器必須使用指令來載入和操作棧上數據,所需指令更多更多 。而dalvik虛擬機是基於寄存器的:java虛擬機運行的是java位元組碼。(java類會被編譯成一個或多個位元組碼.class文件,打包到.jar文件中,java虛擬機從相應的.class文件和.jar文件中獲取相應的位元組碼)
2.Dalvik和Java之間的另外一大區別就是運行環境——Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:235
java駝峰 發布:2025-02-02 09:13:26 瀏覽:651
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726