Waydroid - Arch Linux 中文维基

跳至內容

# Waydroid

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Waydroid，最近一次同步於 2026-05-05，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- 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包）。

### 內核模塊

這一章節正在考慮移除。

原因: Waydroid 不再需要特定的內核模塊，因此也不需要 rust_binder 來使 Waydroid 正常工作。 (在 Talk:Waydroid 討論)

需要運行包含 `rust_binder` 模塊的內核，linux包、linux-lts包、linux-zen包 和 linux-lilyCNRepo均包含該模塊。若您使用不同的內核，則可能需要重新編譯或通過 DKMS 安裝 。

#### DKMS 模塊

若當前內核未提供 `rust_binder` 時，則需要使用 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 啟動前被加載。

當設置編譯選項時，有兩個選項：binder 和 binderfs。下面提供了有關這兩者的說明。

##### 使用 binder

本文或本節內容已經過時。

原因： 現在，由於舊模塊存在一些問題，Google 提供了一個基於 Rust 的 Android Binder 模塊，並默認啟用該模塊的內核選項。以下指定的選項會構建舊的基於 C 的模塊，但並未指定禁用 Rust 模塊。本節需要說明 Rust 模塊的存在，並闡明是否受支持。 (在Talk:Waydroid討論)

模塊既可以被編譯到內核中 (`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 將自動處理此問題。

## 安裝

安裝 waydroid包 軟體包。

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

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

在初始化 Waydroid 之後，如果映像不可用，將會自動下載最新的 Android 映像（可能會耗時很久；你也可以自行下載之後將文件放到 `/etc/waydroid-extra/images/`[1]）。

    # 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`。

### USB 控制器

要啟用與 USB 控制器（如遊戲手柄）的連接，在 Waydroid 會話運行時執行以下命令：

    $ waydroid prop set persist.waydroid.udev true

    $ waydroid prop set persist.waydroid.uevent true

之後，重啟 Waydroid 會話。

## 故障排除

如果您遇到了問題，可參見官方的問題跟蹤：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 的 waydroid-script-gitAUR 或 waydroid-helperAUR 安裝翻譯層。

為提高翻譯性能，推薦在 AMD CPU 上使用 libndk，在英特爾 CPU 上使用 libhoudini。然而部分應用僅支持一種翻譯層，因此當某個遊戲不工作或性能極差時，您可能需要把兩個翻譯層都試一遍。

安裝 libndk arm 翻譯層

    # waydroid-extras install libndk

安裝 libhoudini arm 翻譯層

    # waydroid-extras install libhoudini

### 旋轉的應用程式無法使用

參見 [2]。

按 F11 可將當前應用切換到窗口模式。

### 無法啟動剪貼板管理服務

安裝 python-pyclip包 及其依賴（為 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

參見 Issue 136。

啟用 PSI，在內核參數中添加 `psi=1`。

若啟用 PSI 未能修復改錯誤，則很有可能是因為禁用了 ia32 模擬。請嘗試執行以下命令以啟用 ia32 vdso：

    # echo 1 > /proc/sys/abi/vsyscall32

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

### 多 GPU 系統上圖形損壞

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

可以使用一個腳本來快速選擇 GPU。

### 無網絡連接

#### Docker/iptables 轉發問題

使用 Docker 時， `iptables` 默認被配置為 `FORWARD DROP` ( 查閱 https://github.com/docker/for-linux/issues/103 以獲取更多信息 ) ，根據 Waydroid 官方文檔( https://docs.waydro.id/debugging/networking-issues )的描述，需要將其更改為 `FORWARD ACCEPT` 。

要修復系統中其他 LXC 容器（如 Waydroid ）的網絡連接，可以通過在你的 `/etc/docker/daemon.json` 中添加以下屬性來禁用此行為（根據 https://github.com/docker/for-linux/issues/103#issuecomment-3680138560 ）:

    /etc/docker/daemon.json

    {
        "ip-forward-no-drop": true
    }

記得重啟 `iptables.service` 和 `docker.service`。

#### Waydroid 需要 IPv6 來工作

確保系統中啟用了 IPv6 ，即使你並不使用它，否則 Waydroid 將無法連接網絡。https://bbs.archlinux.org/viewtopic.php?id=301559

### 該設備未通過 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 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

### 應用程式需要未 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

### 在 ZFS 文件系統上 Waydroid 卡在「手機正在啟動」和開機動畫

確保 ZFS 數據集 `${HOME}/.local/share/waydroid` 的 `acltype` 屬性設置為了 `posixacl` 。可以通過 `zfs set acltype=posixacl myZpool/targetDataset` 設置該項來讓Waydroid在ZFS上工作. Linux 上該項的默認值 `acltype=off` 會導致此問題。

## 另請參閱

- Waydroid GitHub 倉庫
- Waydroid 文檔 (English)
- Waydroid Matrix 用戶組
- Waydroid Telegram 用戶組

分類：​

- 沙箱
- 虛擬化
- Android
- 使用「模板:風格」標記的頁面或章節
- 使用「模板:Remove」標記的章節
- 使用「模板:過時」標記的頁面或章節

Waydroid
新增話題