Running Waydroid on Linux X11 desktop using nested Weston seesion.
Waydroid可以讓我們在Linux系統跑Android APP,但不幸的是,這個技術需要用到Wayland協定的桌面。如何確認自己的桌面是Wayland還是X11?使用指令echo $XDG_SESSION_TYPE
檢視。
有種種原因你可能無法使用Wayland:
- 有些Linux發行版對Wayland支援度不佳,譬如Linux Mint 24.04、Ubuntu 24.04、Debian 12,仍在使用X11協定(X.org)的桌面。
- 你使用的桌面不是GNOME、KDE Plasma,而是XFCE、LXQT、Cinammon、i3wm這類的,而他們對Wayland支援度不佳
- 你認為Wayland沒有X11穩定,無法放棄X11。
非Wayland協定的桌面,會連啟動都不能啟動Waydroid。這個時候我們有一個辦法解決這個問題,那就是啟動巢狀(nested)的Wayland工作階段,在X11桌面開一個小型Wayland合成器的視窗,專門用來跑Waydroid就行啦!以X11當作後端來顯示Wayland合成器,連GPU加速也吃得到喔!
示意圖:Waydroid執行於KDE Plasma X11工作階段,你看到中間那個xeyes了吧。不需要進入KDE Plasma Wayland工作階段也可以操作Waydroid裡面的APP。
本篇文章Ivon將討論如何在X11協定的桌面啟動Waydroid,並設定一鍵啟動法。
1. 可用的巢狀Wayland合成器方案#
巢狀Wayland合成器的方案有「Weston」和「Cage」。
Cage似乎比Weston難以操作,它沒辦法用指定的視窗大小啟動。因為Waydroid目前不能動態變更解析度,假若一開始啟動的視窗解析度較小,視窗放大後Waydroid畫面不會跟著放大,反之則會被切半。
我有注意到這個專案:SteamOS-Waydroid-Installer的作者採用了Cage來啟動Waydroid,並且能夠全螢幕。不過這樣做的先決條件是合成器必須支援wlroots標準,才能用wlr-randr控制全螢幕解析度。SteamOS 3.0的Big Picture Mode是跑在X11,搭配一個迷你Wayland工作階段Gamescope進入遊戲的。它這個操作僅適用Steam Gamescope,不能用在GNOME Mutter和KDE Plasma Kwin。
所以就用Weston吧,當你啟動Weston之後會進入一個獨立的Wayland桌面,只要在裡面的終端機啟動Waydroid,它就會認為自己跑在Wayland環境。
此外Weston具有定義啟動時視窗大小,以及自動啟動特定應用程式的能力。將二者組合在一起,再手動新增Desktop Entry,就能做到點個按鈕一鍵啟動Weston + Waydroid的操作。
2. 初始化Waydroid#
即使沒法顯示Waydroid畫面,也可以事先把它裝好再來操作。
參見Ubuntu安裝Waydroid。只要下載好系統映像檔就夠了,先不要進入Android畫面。
3. 手動啟動Weston + Waydroid#
- 安裝Weston套件
sudo apt install weston
- 輸入指令啟動Weston
weston
此時會跳出一個Weston視窗,把它最大化
在Weston的視窗裡面,點選畫面左上角,開啟Weston終端機。
輸入指令啟動Waydroid。這樣應該就會顯示Android桌面了。
waydroid show-full-ui
下面我們將把這個過程自動化。
4. 一鍵啟動Weston + Waydroid#
就在Ivon想分享手動設定Weston + Waydroid的啟動程序的時候,發現Github已經有人寫好自動指令稿能直接用了。
1999AZZAR設計的use-waydroid-on-x11指令稿會自動安裝好Waydroid,修改Weston設定檔,以及新增Dekstop Entry。
- 執行以下指令安裝:
curl -sSL https://raw.githubusercontent.com/1999AZZAR/use-waydroid-on-x11/master/install.sh | sudo bash
這個指令稿是專為APT套件管理器的發行版寫的,可能無法適用其他Linux發行版。你需要參考作者的Github指示手動安裝對應的設定檔。
這個作者似乎漏了一個東西,Weston預設啟動的時候不會以最大化視窗開啟,這會導致Waydroid的畫面被切掉。因此需要編輯Weston設定檔:
vim ~/.config/weston.ini
- 加入以下內容,設定Weson解析度為1920x1080(依照具體顯示器數值而定)讓視窗能夠自動最大化。
[output]
name=X1
mode=1920x1080
如此一來,點選應用程式列表的Weston Session圖示,就會自動啟動Weston視窗並開啟Waydroid了。
依照指令稿作者設計的邏輯,在你關閉Weston視窗之後,Waydroid也會跟著「關機」。這點務必注意。
我注意到有時候重新調整Weston視窗大小會導致Waydroid崩潰?這時請用以下指令強制重新啟動Waydroid:
sudo systemctl restart waydroid-container
5. 無法解決的問題#
因為Waydroid是針對Wayland開發的,透過Weston在X11桌面間接執行Waydroid會造成一些問題:
- 無法在Linux與Android之間共享剪貼簿,即使安裝wl-clipboard、xclip、pyclip也無效。
- 不可點選桌面的Waydroid圖示啟動APP,只能在Weston裡面使用。
- 不能將Android APP視窗化,並列懸浮操作。