導航:首頁 > 操作系統 > 安卓為什麼要內嵌java虛擬機

安卓為什麼要內嵌java虛擬機

發布時間:2023-02-14 01:56:47

1. 安卓系統為什麼一定要藉助虛擬機來達到不同cpu的通用目的

  1. 藉助虛擬機,最大的好處是簡化了開發,比如安卓運行在x86之上和arm之上,只要安卓大版本一樣,那麼app的開發就是完全一樣的(除了個別用到具體硬體特性的功能),這對於開發人員非常有利,因為不需要考慮不同硬體帶來的差異,高通和華為海思這種同為arm的就更不在話下;

  2. 適配不同的硬體,主要問題是驅動程序的問題,這是在虛擬機這一層之下的,不至於說系統全部重寫,但你可以了解一下編寫驅動的難度,能寫驅動的人水平跟在虛擬機寫app的人的水平完全不在一個等級;

  3. 你的問法有問題,應該說是適配不同硬體,cpu只是其中一種硬體,其他的零部件都要去適配,就是2裡面說的寫驅動,安卓=linux內核+java虛擬機,不藉助虛擬機也可以做到適配不同硬體,但是,第一,這就不是安卓了,第二,無法做到app快速簡潔開發了,而且,安卓的體積會很恐怖,因為需要集成常見硬體的驅動,這個就好比是現在的windows,也是因為驅動不同,所以不同廠商,甚至同廠商不同型號手機的rom是無法通用的。

2. 安卓系統是用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程序。

3. 安卓為什麼要用虛擬機,而不直接在Linux系統上運行程序

  1. 因為本來Java在不同架構的CPU、不同操作系統上的開發就具有統一的優勢。

  2. Java是語言,Linux是平台,語言一定要依靠於某個平台來工作。

  3. 兼容性就是安裝了JVM的機器都可以跑Java程序。

  4. Java虛擬機是為每個平台都提供的。也就是說,每一個平台都會編寫一個特定的Java虛擬機。

  5. 至於為什麼其他軟體不能運行在其他操作系統上,這個取決於底層的體系結構和介面 Linux和Windows的文件結構都不一樣,而且操作系統的架構相差特別多,而且底層的介面也是相差巨大,特別是在庫文件方面。

  6. Android系統和Linux發行版的系統根本區別是Android上面只跑了一個Dalvik/ART,而Linux發行版上面跑了很多Dalvik/ART而已。

  7. Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。

4. 為什麼說安卓是虛擬機

因為其基於Linux的自由及開放源代碼的操作系統。

Android的系統架構和其操作系統一樣,採用了分層的架構。從架構圖看,Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。開發人員也可以完全訪問核心應用程序所使用的API框架。

Android為運行於Linux kernel之上,但並不是GNU/Linux。因為在GNU/Linux 里支持的功能,Android 大都沒有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。

(4)安卓為什麼要內嵌java虛擬機擴展閱讀:

虛擬機的系統特點:

1、虛擬化技術有操作系統中內存的虛擬化,實際運行時用戶需要的內存空間可能遠遠大於物理機器的內存大小,利用內存的虛擬化技術,用戶可以將一部分硬碟虛擬化為內存。

2、虛擬機為虛擬機技術的核心,它是一層位於操作系統和計算機硬體之間的代碼,用來將硬體平台分割成多個虛擬機。

3、VMM 運行在特權模式,主要作用是隔離並且管理上層運行的多個虛擬機,仲裁它們對底層硬體的訪問,並為每個客戶操作系統虛擬一套獨立於實際硬體的虛擬硬體環境(包括處理器,內存,I/O 設備)。

5. Android為什麼選擇Java作為開發語言

Android選擇Java作為開發語言原因有以下幾點:

1、Java是世界上使用人數最多的語言,所以更容易吸引開發者到Android生態里開發。
2、Java有一堆現成的開發工具,開發難度更小。
3、很多手機開發人員已經熟悉使用Java(Java ME),這個領域中,Java已為人所熟悉。
4、Java有內存管理,沒有指針。相對C、C++更安全,在手機中,安全性很重要!
5、因為Java跑在虛擬機上,可限制APP程序開發OS內核,以保證手機的安全性。
6、Java在編譯成JVM可運行的代碼後,不需要在多台不同手機(硬體設備)上重新編譯。手機硬體設備經常日新月異,所以這一點上也顯得格外重要。
7、和C、C++相比,APP在手機上的那一點速度差異並不是一個大問題,如果是的話,應該考慮使用匯編語言。

6. 什麼是 Microsoft Java虛擬機安裝了這個有什麼用

Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機?
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行, 至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯.
Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。

2.誰需要了解Java虛擬機

Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。
對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。
另外,如果你想擴展 Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。
3.Java虛擬機支持的數據類型

Java虛擬機支持Java語言的基本數據類型如下:

byte://1位元組有符號整數的補碼 short://2位元組有符號整數的補碼 int://4位元組有符號整數的補碼 long://8位元組有符號整數的補碼 float://4位元組IEEE754單精度浮點數 double://8位元組IEEE754雙精度浮點數 char://2位元組無符號Unicode字元

幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在 Java執行時不需要用硬體標記。操作這些原始數據類型數據的位元組碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型特別是int、long、float和double。
虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令, 包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。
虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:

object//對一個Javaobject(對象)的4位元組引用 returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令

注:Java數組被當作object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對 object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向 該object的數據。
用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。
Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。
從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可移植性。
二、 Java虛擬機體系結構

Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴 任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。

Java指令集
Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。虛擬機的內層循環的執行過程如下:
do{ 取一個操作符位元組; 根據操作符的值執行一個動作; }while(程序未結束)

由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。
指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為: 第一個位元組*256+第二個位元組
位元組碼指令流一般只是位元組對齊的。指令tableswitch和lookup是例外,在這兩條指令內部 要求強制的4位元組邊界對齊。

寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。 Java虛擬機的寄存器有四種:
pc:Java程序計數器。 optop:指向操作數棧頂端的指針。 frame:指向當前執行方法的執行環境的指針。 vars:指向當前執行方法的局部變數區第一個變數的指針。

Java虛擬機
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。所有寄存器都是32位的。


Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。
局部變數區
每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引 n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的虛擬機提供了把局部變數中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變數的指令。
運行環境區
在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號, 並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。
正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。
執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。

異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中出錯的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用

程序使用了throw語句。
當異常發生時,Java虛擬機採取如下措施:
檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內 ,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。
由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理,那麼系 統將調用一個預設的異常處理塊。
操作數棧區
機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。
操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。
例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。
操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數操作(操作符pe和swap),用於對運行時數據區進行操作時是不考慮類型的。
無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。

方法區
方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼 (編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是 Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范
三、 Java類文件(.class文件)

每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。

四、 Java晶元

由於Java語言是解釋型語言,在一般的通用處理器上其運行速度比起編譯型語言要慢很多。Sun公司為了進一步推廣Java的應用,推出了Java晶元。這些晶元可以說是Java虛擬機的硬體實現。與通用晶元和解釋器構成的虛擬機不同,Java晶元可以直接執行位元組碼,也就是說,位元組碼就是 Java晶元的指令集。這種用硬體實現的虛擬機當然要比軟體模擬的虛擬機的速度要快得多。
Sun公司計劃推出的Java晶元有三種:picoJava,mi-croJava和ultraJava。

picoJava是一個很小的Java內核晶元,其矽片面積只有25mm2。Sun公司准備向其它公司轉讓,以便其它公司可以定製自己的Java晶元,其低端產品的售價估計不到25美元。
microJava是基於picoJava的微控制器晶元,其晶元面積約為50mm2,用於通信設備和其它嵌入式控制設備。Sun公司希望Java晶元可以成為推動Java發展的主要技術之一。

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

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

8. 安卓系統怎麼運行java

需要安裝java才能運行的
安裝JAVA程序方法:
1、在網站上搜索一個APK格式的JAVA虛擬機,下載安裝程序後安裝在手機上,
安裝後手機上「所有程序」中增加此程序的圖標,如下圖(安裝方法與安裝
其他程序一樣,通過手機瀏覽器下載安裝或通過電腦下載安裝包)

2、先下載好自己需要的JAVA安裝包放在儲存卡上,進入手機已安裝好的「JAVA「,
再點擊菜單鍵(手機下方三條橫線的圖標),點擊儲存卡選項

3、手機上會自動識別到儲存卡上的JAVA軟體,點擊需要安裝的一個軟體,我們以安
裝QQ軟體為列(注意:並不是保存的所有的JAVA軟體都會被識別),選擇後點擊確定

4、手機會提示選擇文件夾,在點擊空白處會自動跳轉到下一個安裝界面

5、界面直接切換到下一步操作界面時,會提示:應用程序手機QQ不受信任,
確定繼續嗎?請點擊「確定」

6、點擊「確定「後,手機將開始安裝JAVA軟體

7、安裝完成後,手機會直接提示:想要啟動應用程序嗎?如需要啟動就點擊「確定「,
如不需要就點擊」取消「,QQ軟體就已安裝完畢,如果需要使用QQ軟體,就進入手機上
安裝的「JAVA」程序,安裝的JAVA軟體都會在此程序打開後的頁面顯示,點擊「手機QQ」即可運行

閱讀全文

與安卓為什麼要內嵌java虛擬機相關的資料

熱點內容
centos開機命令行模式 瀏覽:695
遍歷所有listpython 瀏覽:660
力控加密文件夾 瀏覽:515
如何更改移動伺服器密碼 瀏覽:686
蘋果8p手機加密 瀏覽:749
ipad建文件夾怎麼弄 瀏覽:833
iphone13對wap3加密 瀏覽:555
pdf文件打開失敗 瀏覽:913
dubbo怎麼調用不同伺服器介面 瀏覽:40
全能解壓王app歷史版本 瀏覽:75
優先隊列與拓撲排序演算法 瀏覽:281
pdf轉換formacbook 瀏覽:871
pdf文件內容怎麼編輯 瀏覽:48
134壓縮機排氣溫度多少 瀏覽:256
unity等待編譯後 瀏覽:806
黑鯊手機鎖屏視頻在哪個文件夾 瀏覽:781
wow地圖解壓後怎麼壓縮 瀏覽:823
有pdf卻打不開 瀏覽:461
七星彩軟體app怎麼下載 瀏覽:219
32單片機的重映射哪裡改 瀏覽:818