⑴ 為什麼android不可以繞開虛擬機直接運行
安卓是谷歌將它從開源linux上改造而來,依舊保持開源特性。為了應用開發者更多地開發安卓程序,自然也就保留了linux上的虛擬機機制。同時,安卓的目標是手機等移動終端,這些設備的處理器五花百門,而且開源安卓也會被各種深入定製,這同樣導致了安卓依然沿用了虛擬機機制來保持高兼容性。當然,這些華為研發了方舟編譯器,讓系統直接運行機器碼,以此來消除虛擬機帶來的弊端。
安卓系統最早並不是谷歌研發出來的,而是一家名叫Android的初創公司研發的。這家公司成立22個月後,就把原始Android雛形系統以4千萬美元的價格賣給了谷歌。 這個雛形原本就基於linux系統研發而來,自然裡面也還是沿用了linux的虛擬機機制。
谷歌拿到系統後,自己繼續研發Android系統,在2007年還集合了84家當時一流的硬體廠商組成研發聯盟。整個研發依然還是基於linux開源系統,但它解決了商業化的一個大難題。那就是,linux是開源系統,是有GPL開源協議的。很多硬體廠家為了適配該系統,必須將在上面研發的驅動程序公開,一旦公開驅動程序代碼就相當於公開了自己的硬體設計。而谷歌研發的Android系統解決了這個問題,它將驅動程序放置到了userspace裡面,並讓它可以通過l內核訪問硬體。同時,公開介面就可以讓硬體廠商編寫驅動程序。硬體廠商只需要提供驅動程序即可,不需要公開源代碼了。
這么多硬體廠商一起研發,自然就會 面臨一個問題就是每個廠商的硬體都不同。這對Android生態發展來說是個必須解決的兼容性問題。最好的辦法依然是沿用linux的虛擬機機制 ,這樣Android的軟體作者就無需針對不同硬體重新開發軟體。只需要一次開發就可以在安卓系統上的虛擬機中運行。
安卓的虛擬機機制在很大程度上解決了兼容性的問題,但是這種邊解釋邊執行的方式,也降低了軟體的運行效率。這些年,華為在這方面的研發上花了大功夫,成功研製出了「方舟」編譯器。該編譯器就是為了解決這個問題而誕生的。如果軟體作者採用方舟編譯器重新編譯自己的程序。它的軟體就可以以機器碼的形式在安卓系統上高效運行,並且方舟編譯器還會對程序進行優化。按照華為方面的數據顯示, 使用華為方舟編譯器編譯後的程序,操作流暢度提升24%,系統響應速度提升44%,第三方應用操作流暢度提升60%!
Android沒有繞開虛擬機直接運行,是因為從它研發之初為了保持高兼容性,不得不沿用了虛擬機的機制。但在這些年,華為研發了「方舟」編譯器,就是為了解決這個問題。通過方舟編譯器編譯後的程序可以直接以機器碼的形式在安卓系統上運行,效率大大提高。
為了多點兒面試題[機智]
當初設計android的時候,設計人員只是軟體工程師,無法針對某個CPU(目前有的CPU框架intel,arm,mips,rsicv等)去開發。最好的是,我針對所有CPU都支持。
跨平台,是指java語言編寫的程序,一次編譯後,可以在多個系統平台上運行。
因為機器針對不同機器語言,有不同執行邏輯。
就好比二進制000100,在arm裡面是調用加法器,而riscv是調用乘法器一樣。所以,需要給這些不同平台請個翻譯。而虛擬機就是起到翻譯作用。
這樣雖然增加了消耗(例如執行同樣代碼,時間消耗上,c明顯由於java),但是可以某種意義上,把軟體,物理硬體分開了。軟體重點設計自己app,而硬體不斷增加CPU性能。
因為上層應用是 建立在 java 庫的基礎上,運行 java 庫 需要 java 虛擬機,調試模式,可以登錄到系統里,直接運行linux 命令,也可以下載運行 c程序。
啥叫Android不可以繞開虛擬機直接運行?Android本質上是Linux的變種,它本身就是應用APP的虛擬機容器,Android源碼針對硬體平台編譯之後,就是直接在CPU上運行的機器碼了,它的運行並不依賴於其他的虛擬機。
APP是JAVA打包的,倒是需要在Android的JVM里運行,畢竟要考慮跨平台嘛。
ActivityThread.java就是一個應用程序,有main方法,是一個進程,就是靠虛擬機,沒有這個就沒有app。咋繞開,繞開就得不用這個,得從內部更換成別的,都更換了那就不是簡單的事情了
因為java代碼必須編譯成機器語言才行,這時候就要接助虛擬機
在問為什麼前,先問下是什麼?Android是可以不依賴虛擬機運行的,只需要改一下重新編譯就好了。
系統就是這么設計的
⑵ 安卓12能運行光速虛擬機嗎
可以運行。
微軟Drawbridge是在Windows上實現Windows,Google的gVisor則是linux上實現linux。光速虛擬機則是通過Android來實現Android,我們在安卓用戶態實現了一個完整的安卓內核和安卓硬體抽象層。從工程角度來看,光速虛擬機比gVisor實現的困難度要大不少,手機終端的多樣性遠大於後台linux伺服器版本的多樣性,對性能的要求也更加嚴苛。光速虛擬機除了能在安卓上運行安卓,實現了跨系統的遷移層,具有很好的遷移性,能夠在國產操作系統UOS、Linux、macOS和雲上來運行安卓和linux程序。
光速虛擬機是基於安卓系統和ARM處理器架構實現的一套虛擬化技術,在安卓系統的用戶態空間無需特殊許可權實現了一套完整的安卓內核和硬體抽象層,能夠在安卓APP內部運行另外一個安卓系統,虛擬機內部的APP和游戲運行性能能夠接近真機的運行性能和兼容性。光速虛擬機也可以認為是一種安卓系統上的庫操作系統(libos)。從行業的情況來看,微軟和Google分別在不同系統上實現過類似的方案,微軟DrawBridge是在Windows上實現Windows,以及其後續發展出來的WSL是Windows上實現linux,Google的gVisor則是linux上實現linux。光速虛擬機是通過安卓來實現安卓。光速虛擬機是市面上第一家在手機上實現完整安卓虛擬化的產品。
⑶ android 模擬器怎麼模擬nmea
Android中提供了一個模擬器來模擬ARM核的移動設備。Android的模擬器是基於QEMU開發的,QEMU是一個有名的開源虛擬機項目 ,它可以提供一個虛擬的ARM移動設備。Android模擬器被命名為goldfish,用來模擬包括下面一些功能的ARM SoC:
* ARM926ej-S CPU
* Thumb support
* MMC
* RTC
* Keyboard
* USB Gadget
* framebuffer
* TTY driver
* NAND FLASH
Android模擬器所對應的源代碼主要在external/qemu目錄下。如果你想將Android移植到其他設備上,熟悉它目前所針對的模擬器環境可以提供一些參考。
對於應用程序的開發者,模擬器提供了很多開發和測試時的便利。無論在Windows下還是Linux下,Android模擬器都可以順利運行,並且Google提供了Eclipse插件,可將模擬器集成到Eclipse的IDE環境。當然,你也可以從命令行啟動Android模擬器。
這款模擬器功能非常齊全,電話本、通話等功能都可正常使用(當然你沒辦法真的從這里打電話)。甚至其內置的瀏覽器和Google Maps都可以聯網。用戶可以使用鍵盤輸入,滑鼠點擊模擬器按鍵輸入,甚至還可以使用滑鼠點擊、拖動屏幕進行操縱。
當然模擬器畢竟是模擬器,和真實的機子還是存在差別的,
android模擬器和真機的不同之處:
* 不支持呼叫和接聽實際來電;但可以通過控制台模擬電話呼叫(呼入和呼出)
* 不支持USB連接
* 不支持相機/視頻捕捉
* 不支持音頻輸入(捕捉);但支持輸出(重放)
* 不支持擴展耳機
* 不能確定連接狀態
* 不能確定電池電量水平和交流充電狀態
* 不能確定SD卡的插入/彈出
* 不支持藍牙
2、創建和啟動Android模擬器
要玩GPhone的模擬器,當然需要先去http://developer.android.com/sdk(如果打不開就用http://androidappdocs.appspot.com/sdk/index.html)上面下載Android 的SDK,解壓出來後在SDK的根目錄下有一個tools文件夾,裡面就是模擬器和一些非常有用的工具。(SDK詳細的安裝過程請參照 http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx)
要正確的啟動模擬,你必須先要創建一個 AVD( Android Virtual Device 虛擬設備 ),你可以利用AVD創建基於不同版本的模擬器,下面就介紹如何創建AVD:
(1) 查看當前支持版本(在列出的版本中我們需要記住id值,這個值在第2步中使用):
magicyu@magicyu-desktop:~$ android list target
你可以看到幾個Available Android targets,比如:Name: Android 1.6,他們有各自的id號。
(2) 創建AVD:
magicyu@magicyu-desktop:~$ android create avd -n magicyu -t 2
-n後面接需要創建avd的名字,-t後面接需要創建虛擬器的類型,2即為步驟(1)中得到的類型id號。
(3) 查看是否創建成功(如果成功會顯示剛才我們創建的avd信息):
magicyu@magicyu-desktop:~$ android list avd
(4) 啟動模擬器:
magicyu@magicyu-desktop:~$ emulator @magicyu 或者
emulator -avd magicyu
其中@和-avd後接的是你創建過的avd名字
(5) 選擇啟動的皮膚
magicyu@magicyu-desktop:~$ emulator -avd magicyu -skin QVGA
skin後面接所要啟動皮膚的類型,所有的類型可以在/ platforms/android-1.*/skins目錄下找到,*為所指的版本。如在1.6版本的SDK下有HVGA,QVGA, WVGA800,WVGA854幾種。按Ctrl+F11,可以直接改變模擬器的橫縱擺放。
當然AVD也可以在Eclipse中創建和啟動。關於Eclipse+ADT+SDK的安裝請參見http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx。
運行Eclipse,Window->Android SDK and AVD Manager,就能得到如下的界面,選擇新建即可新建一個AVD。
3、Android模擬器的一些工具
(1)adb:
ADB(Android Debug Bridge)是Android 提供的一個通用的調試工具,藉助這個工具,我們可以管理設備或手機模擬器的狀態還可以進行以下的操作:
a、快速更新設備或手機模擬器中的代碼,如應用或Android系統升級;
b、在設備上運行shell命令;
c、管理設備或手機模擬器上的預定埠;
d、在設備或手機模擬器上復制或粘貼文件
一些常用的操作:
進入Shell: adb shell
通過上面的命令,就可以進入設備或模擬器的shell環境中,在這個Linux Shell中,你可以執行各種Linux 的命令,另外如果只想執行一條shell命令,可以採用以下的方式:
adb shell [command]
如:adb shell dmesg會列印出內核的調試信息。
(Android的linux shell做了大量精簡,很多linux常用指令都不支持)
上傳文件: adb push
下載文件: adb pull
安裝程序: adb install
卸載軟體: adb shell rm /data/app/
補充一點,通過adb安裝的軟體(*.apk)都在」/data/app/」目錄下,所以安裝時不必制定路徑,卸載只需要簡單的執行」rm」就行。
結束adb: adb kill-server
顯示android模擬器狀態:
adb devices (埠信息)
adb get-proct (設備型號)
adb get-serialno (序列號)
等待正在運行的設備: adb wait-for-device
埠轉發: adb forward adb forward tcp:5555 tcp:1234
(將默認埠TCP 5555轉發到1234埠上)
查看bug報告: adb bugreport
adb shell sqlite3 訪問資料庫SQLite3
adb shell logcat -b radio 記錄無線通訊日誌: 一般來說,無線通訊的日誌非常多,在運行時沒必要去記錄,但我們還是可以通過命令,設置記錄
應用程序配置文件:
「AndroidManifest.xml」中
「」
決定是否應用程序是否顯示在Panel上
(2)am指令(在shell內使用am來載入android應用):
am [start|instrument]
am start [-a ]
[-d ]
[-t ]
[-c [-c ] …]
[-e [-e ...]
[-n ] [-D] []
am instrument [-e ]
[-p ]
[-w]
啟動瀏覽器:
am start -a android.intent.action.VIEW -d http://www.google.cn/
撥打電話:
am start -a android.intent.action.CALL -d tel:10086
啟動google map直接定位到北京:
am start -a android.intent.action.VIEW geo:00?q=beijing
(3)為模擬器加上SD卡:
emulator -sdcard dcard.img
下面我們再來說說如何創建」sdcard.img」文件:
「tools」目錄下還有另外一個很好用的工具mksdcard,一看名字就知道——make sdcard。對,就用它來創建一個「SD卡」。
命令為:
mksdcard 1024M D:dcard.img
OK這樣一個容量為1G的SD卡就創建完畢了。
使用SDCard:
創建: mksdcard
(bytes(default),K,M)
連接到模擬器: emulator -sdcard
傳文件到SDCard: adb push
(4)Android模擬器打電話發簡訊
GPhone的模擬器有個特有的號碼:15555218135,這個就類似我們實體手機的SIM卡號碼啦。要實現撥號,用手機?當然不行!
更簡單,三步:
1.打開終端
2.連接: telnet localhost 5554(5554是你打開模擬器後上面顯示的數字)
3.命令:gsm call 15555218135
look!是不是模擬器上顯示來電了?接聽/掛斷和實體手機一樣。
發簡訊也一樣簡單,重復上面1,2兩步,第三部命令改一下:
sms send 15555218135 Hellothis is a Message.
4、Android模擬器主要命令參數介紹
emulator [- []] … [-]
下面的表總結了可用的參數
Help
-help列印模擬器參數列表。
-help-all列印所有啟動參數明細。
-help-列印指定啟動參數的信息。
-help-debug-tags列印所有被-debug 打開的列表。
-help-disk-images列印正在使用的磁碟鏡像信息。
-help-environment列印模擬器環境變數信息。
-help-keys列印當前的鍵盤映射。
-help-keyset-file列印一個自定義的鍵盤映射文件的定義。
Disk Images
-cache 使用 指定網路緩存分區鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。如果沒有指定緩存文件,模擬器會指定一個零時文件作為緩存文件。更多信息請參考-help-disk-images.
-data 使用作為用戶數據磁碟鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。如果-data沒有被使用,模擬器會在指定的目錄下尋找名叫」userdata-qemu.img」的鏡像文件。默認情況下,模擬器會尋找~/.android (on Linux/Mac)或者C:Documents and Settings/Local SettingsApplication DataAndroid (on Windows)。
如果您使用了-data ,但是文件並不存在,模擬器將創建同名文件。
更多信息請參見運行多個模擬器實例和-help-disk-images。
-image 使用作為系統鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。默認為/system.img。
-initdata
重寫用戶數據鏡像時,(使用 -wipe-data),復制此文件內容到新用戶數據文件鏡像中。默認方式下,模擬器拷貝/userdata.img。
自定義,您可以指定一個當前工作目錄的相對路徑。參見-wipe-data。
更多信息請參見-help-disk-images。
-kernel 使用作為模擬器內核。自定義,您可以指定一個當前工作目錄的相對路徑。
-nocache啟動模擬器時無緩存分區。參見-cache 。
-ramdisk 使用作為虛擬內存鏡像。默認為/ramdisk.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多信息請參見-help-disk-images。
-sdcard 使用作為SD卡鏡像。默認為/sdcard.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多信息請參見-help-disk-images。
-system 在指定的下搜索系統、虛擬內存和用戶數據鏡像文件。為當前路徑的相對目錄。
-wipe- data重至用戶數據鏡像文件。(that is the file specified by -datadir and -data or the default file). 模擬器刪除所有用戶數據,然後復制右-inidata參數指定的數據到鏡像文件,在啟動之前。參見-initdata. 更多信息請參見-help-disk-images。
Debug
-debug 開啟/關閉指定tag的調試信息。
是一個被空格/逗號/縱列所分割的調試組建名稱列表。更多信息參見-help-debug-tags。
-debug-開啟/關閉指定tag的調試信息。使用-help-debug-tags獲得您可以指定為的調試組件列表。
-debug-no-關閉指定tag的調試信息。
-logcat 打開指定tag的日誌輸出。如果環境變數ANDROID_LOG_TAGS被指定且不為空,她的值將成為日誌輸出的默認值。
-shell創建一個擁有root許可權的命令行窗口。即使模擬器的UI界面無法使用了,您依然可以使用命令行窗口。按Ctr-c鍵中斷模擬器運行。
-shell-serial 打開具有root許可權的腳本窗口。必須是一個QEMU類型的設備。參見』serial -dev』在 http://www.bellard.org/qemu/qemu-doc.html#SEC10上關於設備類型的列表信息。這兒有一些例子:
· -shell-serial stdio is identical to -shell
· -shell-serial tcp::4444servernowait 讓您的shell可以通過4444埠通訊。
· -shell-serial fdpair:3:6 讓模擬器可以使用3 (in)和6(out)磁碟機。
· -shell-serial fdpair:0:1 uses the normal stdin and stdout fds except that QEMU won』t tty-cook the data.
-show-kernel 顯示內核信息。
-trace Enable code profiling (press F9 to start) written to a specified file.
-verbose 開啟冗長輸出。Equivalent to -debug-init. 您可以定義ANDROID_VERBOSE環境變數作為冗長輸出參數。定義你想用到的參數,用逗號分割。這樣可以省略像-debug-這樣的參數。下面是一個設置ANDROID_VERBOSE的例子,它帶有-debug-init和 -debug-modem 參數:
ANDROID_VERBOSE=initmodem更多信息參見.
Media
-audio 使用指定的音頻後端。
-audio-in 使用指定的音頻輸入後端。
-audio-out 使用指定的音頻輸出後端。
-noaudio在當前虛擬機實例中關閉音頻支持。
-radio 重新定向收音機介面到本地的位元組設備。
-useaudio打開模擬器實例的音頻支持。默認為打開。
Network
-dns-server 使用指定的DNS伺服器。必須是以逗號分割,多於4個的伺服器名或IP地址。
-http-proxy 配置TCP連接使用HTTP/HTTPS代理。
必須符合以下格式:http://:
http://:@: 前綴http://可以被忽略。如果-http-proxy 未被指定,模擬器將尋找http_proxy環境變數,並且自動尋找所有符號格式要求的 值。
-netdelay 設置網路延遲默認值為none。參見Network Delay Emulation中關於的值。
-netfast快捷的 -netspeed full -netdelay none
-netspeed 指定模擬器網路速度為.默認值為full。參見表格Network Speed Emulation 中的值。
-port 指定模擬器網路埠為.控制台埠號必須介於5554和5584之間,並且+1必須留作ADB使用。
-report-console 啟動前向第三方同志此模擬器實例的網路埠。 必須是以下幾種格式
tcp:[server][max=]
unix:[server][max=]
更多信息參見 -help-report-console
System
-cpu-delay 降低模擬器CPU的速度到。支持0到100的整數。注意與具體的時鍾或其他的絕對頻率無關。它只表現為一種抽象的,相對於當前模擬器運行狀況的速度調節。
-gps 重定向NMEA GPS到位元組設備。
使用此參數通知模擬器模擬一個NMEA-compatible GPS,連接到一個擴展的設備或socket埠。格式必須符合QEMU-specific所指定的設備格式。更多信息參見』serial -dev』 和 http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-nojni在Dalvik運行時關閉JNI檢查
-qemu傳遞參數到qemu。
-qemu -h關閉qemu幫助。
-radio 重定向錄音機模塊到制定的字元設備。格式必須符合QEMU規定的序列設備。詳情參見http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-timezone 設定模擬器時區為,替換為系統時區。必須按照時區格式指定。比如:」America/Los_Angeles」,」Europe/Paris」
-version顯示模擬器版本號。
UI
-dpi-device 修改模擬器的解析度適配物理設備。默認值為165。參見-scale.
-no-boot-anim關閉模擬器啟動時的動畫。禁用啟動動畫可以加快啟動速度。
-no-window關閉模擬器的繪制窗口。
-scale 調整模擬器窗口。 是介於0.1到3的數字,它是調整屏幕的比例因子。您也可以指定一個DPI值,在添加dpi前綴的情況下。Auto參數告訴模擬器選擇自己最合適的尺寸。
-raw-keys關閉Unicode鍵盤reverse-mapping.
-noskin不使用任何模擬器皮膚。
-keyset 用指定的鍵盤設置文件代替默認。指定宿主鍵盤和模擬器之間的鍵盤映射文件。更多信息參見-help-keyset。
-onion 用圖片覆蓋屏幕。不支持JPEG,只支持PNG
-onion-alpha 指定onion皮膚透明值(百分比) 默認為50.
-onion-rotation 指定onion皮膚旋轉。 必須是 0 1 2 3中的一個。
-skin 啟動模擬器,搭配指定皮膚。
-skindir 在指定目錄下搜索皮膚
⑷ Android studio怎麼創建Android虛擬機
Android studio創建Android虛擬機步驟如下:
1. 下載模擬器鏡像
打開SDK安裝目錄,啟動SDK Manager,選擇對應Android版本的模擬器鏡像,下載。如下圖,以Android 7.0(API 24)版本的模擬器鏡像為例說明:
注意事項:如果選擇了Intel字樣的Android模擬器鏡像,那麼需要CPU虛擬化技術的支持(如果支持,可在BIOS中開啟),並下載SDK Manager中最後一個文件:Intel x86 Emulator Accelerator(HAMX installer),然後打開SDK安裝目錄,在extras-->intel-->Hardware_Accelerated_Execution_Manager文件夾下啟動intelhaxm-android.exe安裝它。