Waydroid 是一種基於容器的、能在常規的 Linux 系統上啟動完整 Android 系統的方法。
準備工作
CPU 要求
CPU 要求取決於 CPU 架構。更多信息可參閱此表格。
可以使用 cat /proc/cpuinfo
檢查是否具備所需的 CPU 指令集。
GPU 要求
Waydroid 目前最適合在 Intel GPU 上使用(可開箱即用)。
已支持所有 AMD GPU;如果 Waydroid 不工作,您可能需要構建一個新的 Waydroid 映像(在 Radeon 680M 上正常工作),或者嘗試以下有關 NVIDIA 的說明。
NVIDIA GPU 目前不被支持。有兩種解決方法:
- 可能的話,切換到集成顯卡
- 使用軟體渲染(參見#軟體渲染)
Wayland 會話管理器
Waydroid 只在 Wayland 會話管理器中工作,因此請確保您處於 Wayland 會話中。
請注意,即使處於 X11 會話中,許多 Wayland 會話管理器也支持嵌套會話,因此可以在 X11 會話中運行 Waydroid(最簡單的例子是 cage包)。
內核模塊
需要運行包含 binder 模塊的內核,linux包、linux-lts包、linux-zen包 和 linux-lilyCNRepo均包含該模塊。若您使用不同的內核,則可能需要重新編譯或通過 DKMS 安裝 。
DKMS 模塊
安裝 binder_linux-dkmsAUR 並使用 devices=binder,hwbinder,vndbinder
內核選項加載 binder_linux
內核模塊(參見 bug 報告)。
# modprobe binder-linux devices=binder,hwbinder,vndbinder
此外,您也可以通過在 /etc/modules-load.d/
和 /etc/modprobe.d/
創建配置文件來讓 binder_linux
在啟動時被加載(這是可選的,參閱內核模塊以獲取更多信息)。
/etc/modules-load.d/binder_linux.conf
# Load binder_linux at boot binder_linux
/etc/modprobe.d/binder_linux.conf
# Options for binder_linux options binder_linux devices=binder,hwbinder,vndbinder
您還需要使用 ibt=off
內核參數來解決 5.18+ 版本內核上的一個問題,參閱 Segmentation fault when mounting /dev/binderfs
構建內核
另外,可以用必要的選項重新編譯 linux包 內核——或者其他內核版本 (>=5.7)。參見內核#編譯。
當構建一個最小內核時,請遵循以下需求:
- IPv6 支持:若內核沒有構建 IPV6,Waydroid 會沒有 IPv4 連接。
- Netlink sockets (
CONFIG_NF_CT_NETLINK=y
)。 - PSI (
CONFIG_PSI=y
)。 - Loop block devices (
CONFIG_BLK_DEV_LOOP=m
):loop
模塊必須在 Waydroid 啟動前被加載。
當設置編譯選項時,有兩個選項:binder 和 binderfs。下面提供了有關這兩者的說明。
使用 binder
模塊既可以被編譯到內核中 (y
),也可以被編譯到模塊中 (m
),或者不編譯 (n
) 。此外,配置中的選項不能任意組合,有些選項依賴於其他選項。
以下配置選項會將 binder 編譯成模塊,與此同時最後一個選項指定了在 binder 模塊加載時,將在 /dev/
目錄下創建 3 個設備。
CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=m CONFIG_ANDROID_BINDERFS=n CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
當從 AUR 構建內核時,可以按照以下步驟更新配置:
- 執行
makepkg --nobuild
,將會下載原始碼、驗證並解壓原始碼包,然後執行prepare()
函數。 - 編輯位於內核根目錄下的
.config
文件 (注意文件名裡的點)。 - 在
prepare()
函數尾部的命令很可能被用於從配置文件信息重新生成 Makefile (可能是make olddefconfig
) 。將這條命令移動到build()
函數裡,或者單獨執行。 - 執行
makepkg --noextract
,將自動從makepkg --nobuild
停下的位置繼續執行。
使用 binderfs
已知 binder 內核模塊會給部分用戶造成一些問題。為了解決這些問題,binderfs 應運而生。編譯內核時,必須要在新舊方式之間做出選擇。使用以下選項,可以使用 binderfs 來替代 binder。
內核原始碼也附帶了用於設置配置選項的簡單腳本。此腳本不會做依賴檢查,就像手動編輯配置文件一樣。當與 .config
處於相同目錄時,可以執行以下命令:
$ scripts/config --enable CONFIG_ANDROID $ scripts/config --enable CONFIG_ANDROID_BINDER_IPC $ scripts/config --enable CONFIG_ANDROID_BINDERFS $ scripts/config --set-str CONFIG_ANDROID_BINDER_DEVICES ""
當從 AUR 構建內核時,將這幾行插入到 PKGBUILD 中的合適位置即可 (通常在 prepare()
中) 。
設置 binder 設備
確保已經安裝 Waydroid 軟體包的最新版本。Waydroid 將自動處理此問題。
安裝
可以選擇通過 AUR 安裝 waydroid-imageAUR 或 waydroid-image-gappsAUR 來提供所需的 Android 映像。然而,讓 Waydroid 自己下載映像是更推薦的做法。
在初始化 Waydroid 之後,如果映像不可用,將會自動下載最新的 Android 映像(可能會耗時很久;你也可以自行下載之後將文件放到 /usr/share/waydroid-extra/images/)。
# waydroid init
初始化支持 GApps 的 Waydroid:
# waydroid init -s GAPPS
接下來啟動/啟用 waydroid-container.service
。
# systemctl enable --now waydroid-container
Waydroid 現在應該能正常工作了。
用法
確保 waydroid-container.service
被啟動了,然後執行:
$ waydroid session start
Waydroid 會話現在已處於活動狀態,以下是一些與 Waydroid 交互的實用命令:
啟動 GUI:
$ waydroid show-full-ui
啟動 shell:
# waydroid shell
安裝應用程式:
$ waydroid app install $path_to_apk
運行應用程式:
$ waydroid app launch $package-name
獲取應用程式列表:
$ waydroid app list
網絡
網絡應該開箱即用,否則可能需要確保在執行 waydroid session start
之前,內核中已啟用包轉發並且允許以下規則通過防火牆:
以 ufw包 為例:
- 允許 DNS 流量:
# ufw allow 67
# ufw allow 53
- 允許包轉發:
# ufw default allow FORWARD
對於 firewalld包, 可以使用這些命令:
- DNS:
# firewall-cmd --zone=trusted --add-port=67/udp
# firewall-cmd --zone=trusted --add-port=53/udp
- 包轉發:
# firewall-cmd --zone=trusted --add-forward
/usr/lib/waydroid/data/scripts/waydroid-net.sh
文件中的 LXC_USE_NFT
設置為 false
,否則會出現ip分配正確,但是流量發送出去但是轉發不回來的現象。waydroid-container.service
前沒有啟用 TUN Proxy,避免導致錯誤的網絡設置;在啟動後可以啟用。
- 將 waydroid 接口添加為可信:
# firewall-cmd --zone=trusted --add-interface=waydroid0
trusted
內。如果不是這樣,請調整上述命令,或將 waydroid0
移動到 trusted
。為了使重新啟動時能保留更改,可能還需要執行以下命令:# firewall-cmd --runtime-to-permanent
提示和技巧
在桌面環境中整合窗口
Waydroid 默認全屏運行,若您想讓 Waydroid 上的應用與您的桌面環境實現窗口整合(即應用擁有獨立的窗口而不影響其他 Linux 應用窗口),請先啟動 Waydroid session:
$ waydroid session start
然後設定所需屬性:
$ waydroid prop set persist.waydroid.multi_windows true
現在應用可以在其獨立的窗口中運行了。另請參閱 Waydroid 官方文檔
軟體渲染
確保您已經執行:
# waydroid init
(參閱#安裝章節以獲取更多信息)
接下來,向 waydroid_base.prop
添加以下內容:
/var/lib/waydroid/waydroid_base.prop
ro.hardware.gralloc=default ro.hardware.egl=swiftshader
最後,重啟 waydroid-container.service
。
調整視圖尺寸
用以下命令將 Waydroid 窗口尺寸調整到您喜歡的大小:
$ waydroid prop set persist.waydroid.width 576 $ waydroid prop set persist.waydroid.height 1024
然後重啟 waydroid-container.service
。
故障排除
如果您遇到了問題,可參見官方的問題跟蹤:Waydroid 問題跟蹤
一般建議
Waydroid 正在快速發展中,因此如果您遇到問題,這裡有一系列值得嘗試的步驟:
- 確保 Waydroid 軟體包處於最新。
- 通過執行以下命令,確保已安裝最新的 Waydroid 映像:
# waydroid upgrade
- 重置 Waydroid:停止
waydroid-container.service
,執行# waydroid init -f
並重新啟動服務。 - 可能還需要做一下簡單的清理,執行以下命令:
# rm -rf /var/lib/waydroid /home/.waydroid
$ rm -rf ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid
- 提示:如果您是在 2021-09 後安裝,那麼您不必移除
/home/.waydroid/
。
不兼容 ARM 應用
使用 casualsnek 的腳本安裝翻譯層。
為提高翻譯性能,推薦在 AMD CPU 上使用 libndk,在英特爾 CPU 上使用 libhoudini。然而部分應用僅支持一種翻譯層,因此當某個遊戲不工作或性能極差時,您可能需要把兩個翻譯層都試一遍。
安裝 libndk arm 翻譯層
# python3 main.py install libndk
安裝 libhoudini arm 翻譯層
# python3 main.py install libhoudini
旋轉的應用程式無法使用
參見 [1]。
按 F11 可將當前應用切換到窗口模式。
無法啟動剪貼板管理服務
安裝 python-pyclipAUR 及其依賴(為 X11 安裝 xclip包,為 Wayland 安裝 wl-clipboard包)。
無法使用物理鍵盤
按左 Alt 鍵。
dnsmasq: failed to open pidfile /run/waydroid-lxc/dnsmasq.pid: Permission denied
沒有設置 apparmor 規則,前往 /etc/apparmor.d/usr.sbin.dnsmasq 並在末尾添加
#/etc/apparmor.d/usr.sbin.dnsmasq @{run}/waydroid-lxc/ r, @{run}/waydroid-lxc/* rw,
Waydroid shell 中的命令輸出無法訪問或命令未找到
在基於 Arch 的發行版上,使用 lxc-attach 時可能會出現一個 "bug",可能會導致 waydroid shell
內的命令出現此問題,如 adbd
或 settings
。
一個可能的解決方案是用
# lxc-attach -P /var/lib/waydroid/lxc/ -n waydroid --clear-env
替代 # waydroid shell
。
WARNING: Service manager /dev/binder has died
參見 https://github.com/waydroid/waydroid/issues/136 。
請注意 Waydroid 不在 Liquorix 內核上工作,因為其使用的某些調度器不兼容 PSI。
多 GPU 系統上圖形損壞
目前 Waydroid 需要與其窗口混成器運行在同一 GPU 上。有兩種方法修復,一種是編輯 /var/lib/waydroid/lxc/waydroid/config_nodes
,選擇合適的 GPU,另一種是讓窗口混成器切換 GPU。
無網絡連接
根據 waydroid/issue/509,Waydroid 與 docker 存在 nftable 衝突。
欲修復,請關閉 LXC_USE_NFT
:
/usr/lib/waydroid/data/scripts/waydroid-net.sh
LXC_USE_NFT="false"
或執行以下命令:
# systemctl stop docker # systemctl restart iptables # ip link delete docker0 # systemctl restart waydroid-container
該設備未通過 Play Protect 認證
參閱:https://docs.waydro.id/faq/google-play-certification 若您收到該錯誤,請進入 waydroid shell 並檢索 Android ID:
# waydroid shell # ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"
之後將 ID 輸入這個網站:https://www.google.com/android/uncertified 稍等幾分鐘後重啟 Waydroid。
無法輸入中文
默認的安卓系統不包括中文輸入法。在容器內部安裝一個中文輸入法即可。
Waydroid 掛起
可能是由於音頻伺服器死機,請參閱 Issue 576 和 Issue 829 以獲取詳細信息。
一種方法是運行:
# sysctl -w kernel.pid_max=65535
要使其持久化,請在 /etc/sysctl.d/
創建一個 .conf
文件,並向其添加 kernel.pid_max=65535
。
/etc/sysctl.d/99-sysctl.conf
kernel.pid_max=65535