Waydroid

出自 Arch Linux 中文维基

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

原因:需要改進文章風格。(在Talk: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 目前不被支持。有兩種解決方法:

  • 可能的話,切換到集成顯卡
  • 使用軟件渲染
    • 確保已經執行 waydroid init (參見#安裝部分)
    • 編輯 /var/lib/waydroid/waydroid_base.prop 並設置:
      ro.hardware.gralloc=default
      ro.hardware.egl=swiftshader
    • 重啟 waydroid-container.service

Wayland 會話管理器[編輯 | 編輯原始碼]

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

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

內核模塊[編輯 | 編輯原始碼]

需要運行包含 binder (如果您的內核版本低於 5.18,則還需要 ashmem) 模塊的內核。Arch Linux 默認內核 (linux) 並未提供這些模塊,因此需要安裝提供這些模塊的內核。

為使用不同的內核,可能需要重新配置引導加載程序。請參見您的引導加載程序對應的 Wiki 頁面,了解如何使用新內核啟動。引導到另一個內核(或新版本內核)是少數必須重啟 Linux 系統的情況之一。在啟動 Waydroid 之前,需要引導到包含這些模塊的內核。

注意:waydroidAUR 1.2.1 開始不再需要 ashmem,可使用 memfd 替代,請參見此問題。這是因為從 5.18 版本開始,ashmem 已經在 Linux 主線中被 memfd 完全替代(參見此次提交)。

有多種方式可以獲取兼容的內核:

使用 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)。參見內核#編譯

當設置編譯選項時,有兩個選項: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 自己下載映像是更推薦的做法。

在初始化 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
注意: 正常情況下,Waydroid 創建的接口應該自動位於 firewalld 區域 trusted 內。如果不是這樣,請調整上述命令,或將 waydroid0 移動到 trusted。為了使重新啟動時能保留更改,可能還需要執行以下命令:
# firewall-cmd --runtime-to-permanent
注意: 請確保在運行 waydroid-container.service 前沒有啟用TUN Proxy,避免導致錯誤的網絡設置;在啟動後可以啟用。

故障排除[編輯 | 編輯原始碼]

如果您遇到了問題,可參見官方的問題跟蹤: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

旋轉的應用程序無法使用[編輯 | 編輯原始碼]

參見 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 內的命令出現此問題,如 adbdsettings

一個可能的解決方案是用

# 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

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

另請參閱[編輯 | 編輯原始碼]