Waydroid
Waydroid 是一種基於容器的、能在常規的 GNU/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 (最簡單的例子是 weston包) 。
內核模塊[編輯 | 編輯原始碼]
需要運行包含 binder (如果您的內核版本低於 5.18,則還需要 ashmem) 模塊的內核。Arch Linux 默認內核 (linux包) 並未提供這些模塊,因此需要安裝提供這些模塊的內核。
為使用不同的內核,可能需要重新配置引導加載程序。請參見您的引導加載程序對應的 Wiki 頁面,了解如何使用新內核啟動。引導到另一個內核(或新版本內核)是少數必須重啟 Linux 系統的情況之一。在啟動 Waydroid 之前,需要引導到包含這些模塊的內核。
有多種方式可以獲取兼容的內核:
使用 Linux-Zen[編輯 | 編輯原始碼]
linux-zen包 內核包含了必要的模塊。這可能是最方便的方法,您不需要花很長時間編譯內核,而且能定期接收到更新。
使用 linux-lily[編輯 | 編輯原始碼]
linux-lilyCNRepo 包含了 binder 模塊。這是一個較少更新的內核包,可以通過添加 archlinuxcn 倉庫來安裝。
DKMS 模塊[編輯 | 編輯原始碼]
可以安裝 anbox-modules-dkms-gitAUR,並使用以下命令加載內核模塊:
# modprobe ashmem_linux # modprobe binder_linux
或者如果您的內核版本是 5.18 或更新,安裝只提供 binder_linux 的 binder_linux-dkmsAUR 即可。
構建內核[編輯 | 編輯原始碼]
另外,可以用必要的選項重新編譯 linux包 內核——或者其他內核版本 (>=5.7)。參見內核#編譯。
當設置編譯選項時,有兩個選項: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 -f
接下來啟動/啟用 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 #Can be retrieved with `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
trusted
內。如果不是這樣,請調整上述命令,或將 waydroid0
移動到 trusted
。為了使重新啟動時能保留更改,可能還需要執行以下命令:# firewall-cmd --runtime-to-permanent
故障排除[編輯 | 編輯原始碼]
如果您遇到了問題,可參見官方的問題跟蹤: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
旋轉的應用程式無法使用[編輯 | 編輯原始碼]
參見 https://github.com/waydroid/waydroid/issues/70 。
按 F11 可將當前應用切換到窗口模式。
無法啟動剪貼板管理服務[編輯 | 編輯原始碼]
安裝 python-pyclipAUR。
物理鍵盤有時不工作[編輯 | 編輯原始碼]
按 左 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 。