本文转载自 https://ivonblog.com/posts/android-x86-virgl-libhoudini/
要在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/LinuxCPU:Intel i5-7400GPU:Intel® UHD Graphics 630Android-x86版本:9.0-r2QEMU版本:7.1.0virglrender版本:0.10.1
2.需要的軟體
這些軟體都能夠透過套件管理員安裝,Ubuntu請看這裡,Arch Linux看這邊,Gentoo看這邊。
安裝下面軟體
- QEMU
- Llibvirt
- 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指令開機。
- 至Android-x86官網下載64位元,Android 9.0-r2的ISO。

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

-
點選左上角新增虛擬機,點選
手動安裝。

-
安裝系統選
Android-x86 9.0:

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

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

-
勾選
在安裝前自訂配置

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

differencesbenefits_between_i440fx_and_q35
-
點選左邊的IDE磁碟,切換成SATA

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

-
點選左邊的
顯示卡,選擇Virtio,並勾選3D加速。這裡的3D加速是使用VirGL達成的,參見Linux透過virtio-gpu virglrenderer給QEMU/KVM虛擬機3D加速。

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

-
點選左邊的
開機選項,設定開機順序為CDROM優先
安裝Android系統
-
點選左上角
開始安裝,開機進入Android後用鍵盤上下鍵移動到Installation後按Enter。

-
選取
Create/Modify partitions,按Enter

-
選取
Yes使用GPT

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

-
首先第一個選項First Sector按下Enter,接著 Size輸入
+512M

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

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

-
給該分區取名為
Android

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

-
選取
vda2

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

-
選取
Yes安裝EFI GRUB

-
將EFI分區格式化

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

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

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

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

-
接著輸入
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版,那就無法安裝。
- 開啟虛擬機的瀏覽器,從Android-x86官網自行下載Android 9.0的libhoudini。
https://github.com/isGt93/git2020
- 開啟Android-x86的模擬終端,切換成su
su
- 將libhoudini移動到系統目錄並重新命名
mkdir /data/arm
cp /sdcard/Download/houdini.sfs /data/arm/houdini9_y.sfs
- 啟用Native Bridge,忽視跳出的錯誤訊息,重新開機。
enable_nativebridge
這裡的
enable_nativebridge其實是shell腳本, 可以通過whereiswhich找到對應的文件。
可以發現如果開啟成功,那麼logcat打印的日誌裡面會有houdini enabled
至此,你應該能在Google Play下載原本顯示「不相容」的ARM架構應用程式了,比方說Smash Hit。如果還是不行,就再勾選一次原生相容模式。

5.Android-x86其他使用技巧
5.1. 遊戲鍵盤映射
遊戲滑鼠點了沒反應?有玩動作遊戲的需求?你可以安装QtScrcpy解决。
或者可以使用 scrcpy
-
Linux直接下載解壓縮,對QtScrcpy點二下。在右下角ADB連線的位址填寫
虛擬機的IP,點選無線連接。虛擬機IP可從Virt Manager編輯硬體→網路卡查看。

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

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

5.2 Android-x86多開虛擬機
模擬器「多開」即為同時執行多個虛擬機,以便同時執行二個以上遊戲,或是一個遊戲同時開二個帳號。
以Virt Manager來說,要多開的話就是複製多個虛擬機,再重複利用就好了。
- 將虛擬機關機。在Virt Manager管理界面,點選
Android-x86,右鍵複製虛擬機。

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

注意多開需要考慮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
參考資料
- QEMU - Gentoo Wiki
- QEMU - Build instructions
- On Qemu, some apps ignore my input (9.0-r2) - Google Groups
- How to Run Android in QEMU to Play 3D Android Games on Linux - Linux Hint
- How to install libhoudini on a custom Android x86 rig - stackoverlow
- 如何在虚拟机中运行知乎App - 知乎专栏
其他連接
https://ivonblog.com/posts/android-x86-virgl-libhoudini/
https://stackoverflow.com/questions/49634762/how-to-install-libhoudini-on-a-custom-android-x86-rig
https://github.com/isGt93/git2020
https://ivonblog.com/posts/linux-qemu-virglrenderer/
