Some Waydroid tips for Linux desktop users.
這篇是針對Linux的Android容器「Waydroid」所寫的一篇綜合性文章。Waydroid使用的Android系統是基於LineageOS建置的,並與Linux宿主機共用核心。Ivon將會討論一些操作Android常常會遇到的問題。
請先在Linux系統安裝Waydroid:Ubuntu安裝Waydroid
1. Waydroid的操作邏輯#
安裝好Waydroid之後,你應該會在Linux桌面的應用程式列表看到Waydroid與各個Android APP的圖示。GNOME會跟一般Linux應用程式混在一起,KDE Plasma則是會專門顯示一個Waydroid的資料夾。
如果點選「Waydroid」圖示,效果等同執行waydroid show-full-ui
指令,此時會彈出Android主畫面,能夠存取通知欄,所有的操作都限制在這視窗內。一次只能執行一個APP,就好像在使用平板一樣。
若是點選其他APP圖示(從Linux桌面的圖示啟動,而不是點Android桌面的圖示),則APP會以獨立視窗啟動,分別顯示在Linux桌面的工作列,視窗大小固定。依然一次只能執行一個APP,無法同時執行。切換APP視窗,則另外一個APP會暫停,例如遊戲APP的畫面會凍結,Youtube會停止播放。這些APP無法使用通知欄,且點選返回鍵的話,APP視窗就會自動關閉,但不會完全停止執行。
如果啟用「多視窗模式」的話(啟動方法見下),則Linux桌面的Waydroid圖示會消失,然後從Linux桌面啟動APP就可以調整視窗大小,且能夠同時執行,不會因為切換APP而暫停。當你點選打叉或者返回鍵,APP視窗會關閉,但不會完全停止執行。
Waydroid會同步Android與Linux的剪貼簿,但是你不能在Android APP使用Linux的輸入法打字,需要另外安裝Gboard。
2. Waydroid的操作指令#
Waydroid執行時的Android系統資料放在~/.local/share/waydroid/data/
,系統映像檔位於/var/lib/waydroid
,APP圖示位於~/.local/share/applications/
啟動Waydroid容器服務
sudo systemctl start waydroid-container
停止Waydroid容器服務
sudo systemctl stop waydroid-container
如何更新Android系統?用此指令停止容器,並下載最新映像檔:
# 簡短寫法,下載最新版的映像檔
sudo waydroid upgrade
# 更完整的寫法,從官方更新頻道,下載最新版內建GAPPS的映像檔
sudo waydroid init -c https://ota.waydro.id/system -v https://ota.waydro.id/vendor -s GAPPS -f
用指令開啟Waydroid主畫面
waydroid show-full-ui
查看系統錯誤訊息
waydroid log
sudo waydroid logcat
Waydroid可以用指令安裝APK
waydroid app install <APK檔案路徑>.apk
用以下指令進入Android shell,內建Root權限,能夠執行Android Shell指令。
sudo waydroid shell
Wyadroid啟動後會自動開啟ADB偵錯,可以從Linux宿主機啟動ADB與其配對。IP位址可以在Androi系統設定 → 關於手機找到。
adb connect Waydroid的IP:5555
adb devices
如何開啟開發人員選項?開啟Android系統設定 → 關於手機 → 版本號碼,點五下。之後Android系統設定 → 系統就會出現開發人員選項。
3. 將Waydroid語言改成中文#
在Android的界面開啟Settings → System → Languages,加入中文,並將滑桿拉到最上面。
Android的時間應該會在調整語言之後,自動依照時區和網路時間同步。
4. 解決Waydroid沒有網路#
請嘗試開放防火牆通訊埠,依照發行版不同防火牆也不同,可能有Firewalld、UFW、iptables等等。
Ubuntu的UFW指令:
sudo ufw allow 53
sudo ufw allow 67
sudo ufw default allow FORWARD
sudo ufw reload
Fedora的Firewalld指令:
sudo firewall-cmd --zone=trusted --add-interface=waydroid0 --permanent
再重新啟動Waydroid:
sudo systemctl restart waydroid-container
如果還是不行,可能是Waydroid跟Docker網路衝突。我們沒有必要關閉Docker,只要修改Waydroid網路設定檔:
sudo vim /usr/lib/waydroid/data/scripts/waydroid-net.sh
關閉LXC_USE_NFT:
LXC_USE_NFT="false"
再重新啟動Waydroid應該就可以了。
sudo systemctl restart waydroid-container
5. Google Play商店裝置註冊#
Waydroid基於LineageOS建置,你應該在安裝Waydroid的時候就下載了內建GMS服務的映像檔。但是第三方ROM不向Google註冊裝置的話,是無法存取Google Play商店的。
- 進入Android的shell
sudo waydroid shell
- 執行以下指令,會迸出一長串代碼,即GMS的裝置ID。如果沒有輸出,請確認Waydroid是否有正常連上網路。
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\";"
到Google裝置註冊,填入該代碼
等30分鐘後,重新啟動Waydroid,就可以使用Play商店了。
sudo systemctl restart waydroid-container
6. 安裝ARM轉譯器解決APP閃退問題#
ARM架構的電腦可以跳過此步驟。
鑑於大多數電腦都是x86架構,而許多手遊只提供ARM架構的APK,因此需要一個將ARM指令翻譯成x86的指令的軟體。
如何確認APP只有ARM架構?預設沒有ARM轉譯器的情況下,Google Play可能不會顯示特定APP。或者在安裝APK後,透過Package Manager查看這個APP是否含有/lib/x86_64
的函式庫,如果只有ARM,那麼開起來會閃退。需要安裝ARM轉譯器。
目前ARM轉譯器有Intel研發的「libhoudini」和Google研發的「libndk」,都是專有軟體。根據Arch Wiki資料,libhoudini適合Intel CPU使用,而libndk適合AMD CPU使用,有針對處理器性能優化。可能有的APP可以在其中一個運作,另一個卻不行,需要多方測試。請注意不要同時安裝兩個ARM轉譯器。要安裝另外一個的時候,你應該執行下述的指令稿,選取Remove舊的再安裝新的轉譯器。
- 取得casualsnek製作的指令稿,安裝依賴套件。
sudo apt install lzip
cd ~
git clone https://github.com/casualsnek/waydroid_script
cd waydroid_script
python3 -m venv venv
venv/bin/pip install -r requirements.txt
cd ~/waydroid_script
- 執行指令稿,用空白鍵選取
libhoudini
或者libndk
,然後Enter安裝,安裝ARM轉譯器。ARM轉譯器嚴格對應Android版本,不可以跨版本混用。
sudo venv/bin/python3 main.py
- 重啟Waydroid
sudo systemctl restart waydroid-container
有時候Google Play可能還是不會顯示x86架構以外的應用程式,為此您需要到ApkMirror找ARM架構的APK來裝,看能否正常開啟。
如果ARM轉譯器執行特定APP有問題,嘗試到Waydroid的Github issue回報,看看有沒有社群製作的patch能用。例如針對《蔚藍檔案》遊戲,有玩家製作了這個指令稿修復登入崩潰的問題。
更新Waydroid系統之後可能需要重裝ARM轉譯器。
7. 開啟多視窗模式#
多視窗模式 (multi window mode) 對需要直向使用的APP很有幫助,也能讓多個APP同時執行。
- 用以下指令設定為true,讓Waydroid開啟多視窗模式,允許在同一個畫面執行多個APP。
waydroid prop set persist.waydroid.multi_windows true
sudo systemctl restart waydroid-container
建議在Android開發人員選項開啟「允許自由形式視窗」。
之後Linux應用程式選單的Waydroid圖示就會消失(仍可透過
waydroid show-full-ui
指令開啟Android主畫面),只剩下APP圖示。APP開啟後,會變得好像Linux的原生應用程式一般,能夠自由調整視窗大小。
有些APP可能依然會以全螢幕啟動,需要按F11切換視窗模式,再按一次F11進入全螢幕。
若有APP進入全螢幕模式,則其他APP會暫停,就無法同時執行二個以上APP了,最好維持視窗化。
因為在多視窗模式下無法使用Android的多工界面,所以要完全中止APP執行,只能開啟Android Settings → 應用程式,強制停止APP。
個人覺得Android 11的視窗管理不完善,有些APP縮放後會壞掉,或者根本無法縮放。覺得出問題的話就把這功能關掉:
waydroid prop set persist.waydroid.multi_windows false
sudo systemctl restart waydroid-container
另外,Android也有內建「自由形式」視窗功能,從多工畫面啟動,這會讓APP只在Waydroid的視窗內自由縮放。
8. 多開APP,同時執行多個APP#
Waydroid設計上沒辦法開啟多個實例 (instances) ,所以不能一個APP同時登入二個帳號達成多開。但是你可以透過Shelter的工作設定檔功能,在一個Android系統雙開APP。
依照Waydroid設計,APK安裝之後會在Linux桌面的應用程式列表顯示各個Android APP的圖示,點這裡啟動就能夠執行多個APP。但是得開啟「多視窗模式」,才能「同時」執行二個以上APP。
如果多視窗模式下,有APP不願意視窗化,堅持全螢幕該怎麼辦?善用桌面環境的虛擬桌面。GNOME、KDE Plasma、Hyprland、COSMIC都有虛擬桌面 (virtual desktop,或稱workspace) 的功能,如果APP啟動會佔滿目前虛擬桌面的整個畫面,要使用另一個APP就是切換到下一個虛擬桌面再啟動。每個工作區就能分別執行各自的APP。
9. Linux與Waydroid共享目錄#
Waydroid啟動後的資料位於~/.local/share/waydroid/data/media/0/
目錄。這裡是Android的內部儲存空間,需要Root權限才能存取。
如果使用KDE Dolphin檔案管理器6.0以上版本進入,可以申請Root權限強制讀取Android的檔案。
或者,使用掛載一般權限目錄的方式來存取檔案。為了不影響其他檔案,我建議在兩邊新增一個專門用於共享的資料夾WaydroidShared
。使用mount指令,將Linux的~/WaydroidShared
掛載到Waydroid裡面的WaydroidShared
資料夾:
sudo mount --bind ~/WaydroidShared ~/.local/share/waydroid/data/media/0/WaydroidShared
sudo chmod -R 777 ~/.local/share/waydroid/data/media/0/WaydroidShared
您也可以用ADB指令無線傳輸檔案。Waydroid的IP到Android系統設定 → 關於查看。
adb connect Waydroid的IP:5555
adb push "本機目錄" "Android的目錄"
10. APP模擬Wifi連線#
部份APP會要求開啟Wifi才能下載,不然會以為你只有行動數據,那麼就如它所願,開啟fake wifi。
使用waydroid app list
指令,查看APP的套件名稱。
使用以下語法設定:
waydroid prop set persist.waydroid.fake_wifi "套件名稱"
例如給Mihon漫畫閱讀器開啟模擬Wifi,並在該APP設定開啟允許非Wifi下載,然後重新啟動容器:
waydroid prop set persist.waydroid.fake_wifi "app.mihon"
sudo systemctl restart waydroid-container
11. APP模擬觸控點擊#
使用waydroid app list
指令,用於查看APP的套件名稱。
有些APP認不到滑鼠點擊,需要啟用fake touch:
waydroid prop set persist.waydroid.fake_touch "套件名稱"
例如給Fate/Go遊戲開啟模擬觸控,然後重新啟動容器:
waydroid prop set persist.waydroid.fake_touch "com.aniplex.fategrandorder"
sudo systemctl restart waydroid-container
如果APP開啟模擬觸控之後還是無法點選,請考慮使用其他方案,譬如:搭配Scrcpy操作Waydroid
12. 強制旋轉APP螢幕方向#
安裝Rotation Control這類APP,即可強制調整Waydroid螢幕方向。
Waydroid可能無法調整成直向螢幕解析度,除非你使用可以旋轉螢幕的Linux平板。
要直向使用APP,建議啟用「多視窗模式」,或者:搭配Scrcpy操作Waydroid
13. 調整APP音量#
開啟Android系統設定 → 音訊,調整音量。
實體鍵無法控制Android容器內的音量,所以得另外安裝調整音量的APP。放在Android桌面當作小工具,或者是用Sound Quick Settings,新增一個音量調整按鈕到Android通知欄。
Linux桌面的音量控制面板可以單獨將Waydroid的輸出靜音,譬如pavucontrol
。
另外,Waydroid可以存取Linux的麥克風,Android APP應該能夠正常錄製音效。麥克風音量同樣能夠從pavucontrol控制面板調整。
若有多個APP在執行,要單獨將特定APP靜音的話,建議使用ShizuTools的MixedAudio功能。
14. APP截圖#
Android的多工畫面有單個APP的截圖按紐。
Linux端沒有快捷鍵能夠觸發Android硬體鍵的截圖,所以就用Linux端的截圖軟體吧。
或者,安裝Screenshot Tile,Android的通知欄就會多出一個原生截圖按鈕。
15. 防止APP偵測到Root或模擬器導致閃退#
有時候APP不給安裝或閃退,不是因為ARM轉譯的問題,而是APP認為你的裝置不安全。
Waydroid的Play Integrity API等級連最基本的都無法通過,因此部份APP會拒絕執行。
此外需要DRM的APP也會無法播放。
這種解法就比較複雜,看是要安裝Magisk來隱藏Root,亦或是偽裝機型。參見:Waydroid躲避Root偵測 & 安裝Magisk與LSPosed
16. 不想要Waydroid APP圖示出現在Linux桌面#
Waydroid的Android APP圖示位於~/.local/share/applications/waydroid.*
寫個指令稿於Waydroid關閉後刪除之。
17. 在X11桌面啟動Waydroid#
如果不方便使用Wayland工作階段,就用巢狀Wayland工作階段解決。
參見:在Linux X11桌面用Weston啟動Waydroid,不依賴Wayland協定桌面
18. Nvidia顯示卡以軟體渲染強制啟動Waydroid#
撰文當下Nvidia閉源驅動版本575,Waydroid只支援Intel與AMD的顯示卡,不支援Nvidia。如果硬要在Nvidia顯示卡跑的話就只能改用軟體渲染啟動Waydroid。此模式下無效能可言,無法玩遊戲。
註解:有人做了一個waydroid-choose-gpu.sh指令稿能夠選取Waydroid使用的GPU,似乎能解決Nvidia + Intel配置的顯示卡問題,在Nvidia作為主顯示卡的情況下強制使用Intel顯示卡渲染,但因為Waydroid需要桌面合成器協助,執行時使用的GPU必須跟桌面合成器是同一個,因此這個指令稿似乎只在Intel + AMD的配置有效。
- 初始化Waydroid
sudo waydroid init -s GAPPS -f
- 編輯設定檔
sudo vim /var/lib/waydroid/waydroid.cfg
- 填入以下內容,啟用SwiftShader
[properties]
ro.hardware.gralloc=default
ro.hardware.egl=swiftshader
- 套用變更
waydroid upgrade --offline
- 重新啟動Waydroid
sudo systemctl restart waydroid-container