快轉到主要內容

Android-x86 QEMU虛擬機安裝教學,在Linux上執行手機APP,支援GPU加速的VM

Linux系統 虛擬機與容器技術 Android-x86 Linux QEMU VirGL Scrcpy
🗓️ 民國111年 壬寅年
✍ 切換正體/簡體字
目錄

🇺🇸 English version

註解:Android-x86版本有點太老了,建議您可以試試改進版的 BlissOS

要在Linux電腦執行Android APP,並要轉譯ARM、支援GPU加速,我在 Linux的Android模擬器有過討論。

本文要介紹設定Android-x86虛擬機的作法。

若設定的當的話,效能會比Google官方的Android模擬器要好。虛擬機軟體當然是挑靈活性高的QEMU/KVM用,那首先要解決二個問題。

一是3D效能。QEMU預設的QXL顯示卡只有讓3D應用程式勉強能跑起來的程度,要使用VirGL(virtual OpenGL renderer)或直通顯示卡,虛擬機的3D效能才會獲得大幅改進,如下圖FPS對比。

因為直通顯示卡過於麻煩,本文採用VirGL,而VirGL需要QEMU本身支援。

二是轉譯ARM應用程式的問題。Android-x86的ARM轉譯器"libhoudini"要自行下載,但這不是什麼難事。

接下來,讓我們看看如何在Linux安裝Android-x86虛擬機,再達成GPU硬體加速和ARM轉譯。

1. 系統資訊
#

因為Nvidia顯示卡520.56.06版的專有驅動不支援VirGL,所以我是用電腦的內顯測試。

  • 作業系統:GNU/Linux
  • CPU:Intel i5-7400
  • GPU:Intel® UHD Graphics 630
  • Android-x86版本:9.0-r2
  • QEMU版本:7.1.0
  • virglrender版本:0.10.1

2. 需要的軟體
#

這些軟體都能夠透過套件管理員安裝,Ubuntu請看 這裡,Arch Linux看 這邊,Gentoo看 這邊

  1. QEMU
  2. Llibvirt
  3. Virt Manager

確認CPU已經啟用虛擬化,用指令grep --color vmx /proc/cpuinfo查看。

確認已啟用KVM核心模組,用指令lsmod | grep kvm查看。

在Android-x86的選擇上,本文採用的是穩定的Android-x86 9.0,僅支援32位元ARM APP。不過市面上還有開發較快的 BlissOS,目前最新版Android 11.0,已支援64位元ARM APP。

3. 開始安裝Android-x86虛擬機
#

P.S. 如果不想用圖形界面安裝,或是啟用VirGL後開機有問題,請跳到 5.3. Android-x86多開虛擬機了解如何用QEMU指令開機。

  1. Android-x86官網下載64位元,Android 9.0-r2的ISO。

  2. 開啟Virt Manager,點選編輯偏好設定,勾選啟用XML編輯

  3. 點選左上角新增虛擬機,點選手動安裝

  4. 安裝系統選Android-x86 9.0

  5. 記憶體至少給4GB、CPU至少雙核心。

  6. 建立64GB的虛擬硬碟。QCOW2硬碟檔案不會一次佔用64GB,而是慢慢吃滿。

  7. 勾選在安裝前自訂配置

  8. 點選左邊的系統概覽,晶片組選Q35,韌體選UEFI x64 OVMF_CODE

  9. 點選左邊的IDE磁碟,切換成SATA

  10. 點選左邊的顯示協議,將監聽類型設定為無,勾選OpenGL,選擇Intel的顯示卡

  11. 點選左邊的顯示卡,選擇Virtio,並勾選3D加速

  12. 點選左下角新增硬體,加入CDROM,按選擇自訂儲存,選取Android-x86的ISO

  13. 點選左邊的開機選項,設定開機順序為CDROM優先

  14. 點選左上角開始安裝,開機進入Android後用鍵盤上下鍵移動到Installation後按Enter。

  15. 選取Create/Modify partitions,按Enter

  16. 選取Yes使用GPT

  17. 這個步驟要分割硬碟,首先建立EFI分區。用鍵盤左右鍵移動到[New],按Enter。

  18. First Sector按Enter,Size輸入+512M

  19. 輸入ef00將分區類型設為EFI,並輸入EFI作為分區名稱。

  20. 接著鍵盤上下鍵移動到最下面的選項,選取[New],接著3次Enter。

  21. 給該分區取名為Android

  22. 確認分區表無誤之後,左右鍵移動到[Write]寫入變更,輸入yes,然後移動到[Quit]退出。

  23. 選取vda2

  24. 選取格式化成Ext4,之後選取Yes。提示:如果硬碟已裝有舊版本Android-x86,未來可直接安裝新版本Android-x86進行更新,不用重新格式化。

  25. 選取Yes安裝EFI GRUB

  26. 將EFI分區格式化

  27. 選取Yes,避免將system分區設為唯讀

  28. 安裝好按Virt Manager上方的強制關機,再按燈泡圖示,到硬體選單移除CDROM。

  29. 將虛擬機重開機,開始設定Android系統。設定時要連線到VirtWifi這個虛擬Wifi。

  30. 進入桌面後開啟Android-x86的「模擬終端」APP,輸入su,取得root權限:

  31. 接著輸入dmesg | grep virgl,應該會看到VirGL已經載入的訊息,代表GPU加速正常。

到這邊Android-x86安裝完成,不過還只能執行x86架構的應用程式而已,請接著看如何安裝ARM轉譯器。

4. 安裝ARM轉譯器libhoudini
#

Android-x86安裝APP盡量找x86_64或者universal的APK,這樣比較穩定,例如在 ApkMirror下載APK的時候可得知該APP的架構。Google Play在下載APP的時候,也會自動判定支援Android-x86系統的APP。

但是很多APP只有ARM版的,那麼就得安裝libhoudini轉譯器。libhoudini是Intel研發的閉源ARM轉譯技術,Android 9的libhoudini可以在x86_64系統執行含有ARM架構(armv7)函式庫的APK,但是不支援只有ARM64(armv8a)架構的APK。 換句話說,如果該APP只有64位元ARM版,那就無法安裝。

  1. 開啟Android系統設定 → Android-x86設定 → 勾選原生相容模式。

  2. 照理說系統應該會自動安裝libhoudini才對,可是這個版本會下載失敗。所以開啟虛擬機的瀏覽器,從Android-x86官網自行下載 Android 9.0的libhoudini

  3. 開啟Android-x86的模擬終端,切換成su

su
  1. 將libhoudini移動到系統目錄並重新命名
mkdir /data/arm
cp /sdcard/Download/houdini.sfs /data/arm/houdini9_y.sfs
  1. 啟用Native Bridge,忽視跳出的錯誤訊息,重新開機。
enable_nativebridge

至此,你應該能在Google Play下載原本顯示「不相容」的ARM架構應用程式了,比方說 Smash Hit。如果還是不行,就再勾選一次原生相容模式。

5. Android-x86其他使用技巧
#

5.1. 遊戲鍵盤映射
#

遊戲滑鼠點了沒反應?有玩動作遊戲的需求?你可以安装 QtScrcpy解决。

  1. Linux直接下載解壓縮,對QtScrcpy點二下。在右下角ADB連線的位址填寫虛擬機的IP,點選無線連接。虛擬機IP可從Virt Manager編輯硬體→網路卡查看。

  2. 在左邊列表對虛擬機名稱按二下,接著就會顯示虛擬機的桌面。

  3. QtScrcpy可以撰寫自訂指令稿來映射按鍵,例如將 和平精英的範本稍作修改,便可以用鍵盤玩其他FPS遊戲,下圖為Wings of Steel:

5.2. Android-x86多開虛擬機
#

模擬器「多開」即為同時執行多個虛擬機,以便同時執行二個以上遊戲,或是一個遊戲同時開二個帳號。

以Virt Manager來說,要多開的話就是複製多個虛擬機,再重複利用就好了。

  1. 將虛擬機關機。在Virt Manager管理界面,點選Android-x86,右鍵複製虛擬機。

  2. 如此會複製出第二個虛擬機。此虛擬機會繼承剛剛安裝的一切東西,只要取不同名字就可以了,因此便可開一個虛擬機再啟動另一個。

注意多開需要考慮CPU和遊戲所需性能,建議每個虛擬機至少要給2核CPU和4GB RAM,調低虛擬機螢幕解析度也會有幫助。

5.3. 用QEMU指令開機
#

不需要使用Virt Manager,也可以直接使用QEMU指令開機安裝。

對於想使用QEMU命令行的用戶,參照 BlissOS的指用以下腳本啟動Android-x86 (需要sudo):

#!/bin/bash
~/qemu-7.1.0/build/qemu-system-x86_64 \
-enable-kvm \
-M q35 \
-m 4096 -smp 4 -cpu host \
-drive file=/var/lib/libvirt/images/android-x86-9.0.qcow2,if=virtio \
-usb \
-device virtio-tablet \
-device virtio-keyboard \
-device qemu-xhci,id=xhci \
-machine vmport=off \
-device virtio-vga-gl -display gtk,gl=es \
-net nic,model=virtio-net-pci -net user,hostfwd=tcp::4444-:5555

總結
#

此方法因為是完整系統,對應用程式的支援度較佳。此外Android-x86尚有 Bliss OS這類第三方版本,他們有新增大量輔助工具,Android版本也更新。

參考資料
#

相關文章

QEMU/KVM安裝ChromeOS Flex虛擬機
Linux系統 虛擬機與容器技術 Linux QEMU Immutable Distro
如何將Libvirt的QEMU虛擬機轉換複製到實體機器上
Linux系統 虛擬機與容器技術 Libvirt QEMU
Ubuntu Linux如何安裝Windows 10虛擬機 (QEMU/KVM)
Linux系統 虛擬機與容器技術 Ubuntu QEMU Windows

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。