跳至內容
出自 Arch Linux 中文维基

本文或本章節的語言、語法或風格需要改進。參考:幫助:風格

原因:需要改進文章風格。(在Talk:Waydroid討論)

Waydroid 是一種基於容器的、能在常規的 Linux 系統上啟動完整 Android 系統的方法。

準備工作

CPU 要求

CPU 要求取決於 CPU 架構。更多信息可參閱此表格

可以使用 cat /proc/cpuinfo 檢查是否具備所需的 CPU 指令集。

GPU 要求

Waydroid 目前最適合在 Intel GPU 上使用(可開箱即用)。

已支持所有 AMD GPU;如果 Waydroid 不工作,您可能需要構建一個新的 Waydroid 映像(在 Radeon 680M 上正常工作),或者嘗試以下有關 NVIDIA 的說明。

NVIDIA GPU 目前不被支持。有兩種解決方法:

  1. 可能的話,切換到集成顯卡
  2. 使用軟體渲染(參見#軟體渲染

Wayland 會話管理器

Waydroid 只在 Wayland 會話管理器中工作,因此請確保您處於 Wayland 會話中。

請注意,即使處於 X11 會話中,許多 Wayland 會話管理器也支持嵌套會話,因此可以在 X11 會話中運行 Waydroid(最簡單的例子是 cage)。

內核模塊

需要運行包含 binder 模塊的內核,linuxlinux-ltslinux-zenlinux-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 套接字 (CONFIG_NF_CT_NETLINK=y)。
  • PSI (CONFIG_PSI=y)。
  • Loop block 設備 (CONFIG_BLK_DEV_LOOP=m):loop 模塊必須在 Waydroid 啟動前被加載。

當設置編譯選項時,有兩個選項:binderbinderfs。下面提供了有關這兩者的說明。

使用 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 構建內核時,可以按照以下步驟更新配置:

  1. 執行 makepkg --nobuild,將會下載原始碼、驗證並解壓原始碼包,然後執行 prepare() 函數。
  2. 編輯位於內核根目錄下的 .config 文件 (注意文件名裡的點)。
  3. prepare() 函數尾部的命令很可能被用於從配置文件信息重新生成 Makefile (可能是 make olddefconfig) 。將這條命令移動到 build() 函數裡,或者單獨執行。
  4. 執行 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 將自動處理此問題。

安裝

安裝 waydroidAUR 軟體包。

可以選擇通過 AUR 安裝 waydroid-imageAURwaydroid-image-gappsAUR 來提供所需的 Android 映像。然而,讓 Waydroid 自己下載映像是更推薦的做法。

提示:中國用戶可能會下載映像極為緩慢,可以通過添加 archlinuxcn 倉庫之中國大陸鏡像後安裝 waydroid-imageCNRepo,這可以顯著提高下載速度。

在初始化 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
注意:$package_name 是 list 命令所示的 packageName(包名)屬性,並非 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
注意:Waydroid 可能默認使用 nftables 作為流量轉發工具,如果沒有開啟該服務,記得把 /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
注意:正常情況下,Waydroid 創建的接口應該自動位於 firewalld 區域 trusted 內。如果不是這樣,請調整上述命令,或將 waydroid0 移動到 trusted。為了使重新啟動時能保留更改,可能還需要執行以下命令:
# firewall-cmd --runtime-to-permanent

提示和技巧

在桌面環境中整合窗口

Waydroid 默認全屏運行,若您想讓 Waydroid 上的應用與您的桌面環境實現窗口整合(即應用擁有獨立的窗口而不影響其他 Linux 應用窗口),請先啟動 Waydroid 會話:

$ waydroid session start

然後設定所需屬性:

$ waydroid prop set persist.waydroid.multi_windows true

重啟會話:

$ waydroid session stop
$ waydroid session start

現在應用可以在其獨立的窗口中運行了。另請參閱Waydroid 官方文檔

軟體渲染

確保您已經執行:

# waydroid init

(參閱#安裝章節以獲取更多信息)

接下來,向 waydroid.cfg 添加以下內容:

/var/lib/waydroid/waydroid.cfg
[properties]
ro.hardware.gralloc=default
ro.hardware.egl=swiftshader

然後執行以下命令以應用配置:

waydroid upgrade --offline

最後,重啟 waydroid-container.service

調整視圖尺寸

用以下命令將 Waydroid 窗口尺寸調整到您喜歡的大小:

$ waydroid prop set persist.waydroid.width 576
$ waydroid prop set persist.waydroid.height 1024

然後重啟 waydroid-container.service

故障排除

如果您遇到了問題,可參見官方的問題跟蹤:Waydroid 問題跟蹤

一般建議

Waydroid 正在快速發展中,因此如果您遇到問題,這裡有一系列值得嘗試的步驟:

  1. 確保 Waydroid 軟體包處於最新。
  2. 通過執行以下命令,確保已安裝最新的 Waydroid 映像:
    # waydroid upgrade
  3. 重置 Waydroid:停止 waydroid-container.service,執行
    # waydroid init -f
    並重新啟動服務。
  4. 可能還需要做一下簡單的清理,執行以下命令:
    # 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 內的命令出現此問題,如 adbdsettings

一個可能的解決方案是用

# lxc-attach -P /var/lib/waydroid/lxc/ -n waydroid --clear-env

替代 # waydroid shell

WARNING: Service manager /dev/binder has died

參見 Issue 136

啟用 PSI,在內核參數中添加 psi=1

請注意 Waydroid 不在 Liquorix 內核上工作,因為其使用的某些調度器不兼容 PSI。

多 GPU 系統上圖形損壞

目前 Waydroid 需要與其窗口混成器運行在同一 GPU 上。有兩種方法修復,一種是編輯 /var/lib/waydroid/lxc/waydroid/config_nodes,選擇合適的 GPU,另一種是讓窗口混成器切換 GPU。

無網絡連接

這篇文章的某些內容需要擴充。

原因:本小節需要更深入解釋為什麼有衝突。 (在 Talk:Waydroid 中討論)

根據 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 認證

參閱官方文檔。 若您收到該錯誤,請進入 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 576Issue 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

應用程式需要未 root 的設備

根據 Issue 1060,添加以下內容可以通過 root 檢測:

/var/lib/waydroid/waydroid.cfg
[properties]
ro.product.brand=google
ro.product.manufacturer=Google
ro.system.build.product=redfin
ro.product.name=redfin
ro.product.device=redfin
ro.product.model=Pixel 5
ro.system.build.flavor=redfin-user
ro.build.fingerprint=google/redfin/redfin:11/RQ3A.211001.001/eng.electr.20230318.111310:user/release-keys
ro.system.build.description=redfin-user 11 RQ3A.211001.001 eng.electr.20230318.111310 release-keys
ro.bootimage.build.fingerprint=google/redfin/redfin:11/RQ3A.211001.001/eng.electr.20230318.111310:user/release-keys
ro.build.display.id=google/redfin/redfin:11/RQ3A.211001.001/eng.electr.20230318.111310:user/release-keys
ro.build.tags=release-keys
ro.build.description=redfin-user 11 RQ3A.211001.001 eng.electr.20230318.111310 release-keys
ro.vendor.build.fingerprint=google/redfin/redfin:11/RQ3A.211001.001/eng.electr.20230318.111310:user/release-keys
ro.vendor.build.id=RQ3A.211001.001
ro.vendor.build.tags=release-keys
ro.vendor.build.type=user
ro.odm.build.tags=release-keys

然後使用以下命令以應用配置:

waydroid upgrade --offline

另請參閱