快轉到主要內容

Waydroid使用技巧:解決沒網路、觸控沒反應、註冊Play商店、安裝ARM轉譯器

· 民國114年乙巳年
·
切換繁體/簡體
分類   資訊科技 虛擬機與容器技術
標籤   Waydroid Linux Android
目錄

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商店的。

  1. 進入Android的shell
sudo waydroid shell
  1. 執行以下指令,會迸出一長串代碼,即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\";"
  1. Google裝置註冊,填入該代碼

  2. 等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舊的再安裝新的轉譯器。

  1. 取得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
  1. 執行指令稿,用空白鍵選取libhoudini或者libndk,然後Enter安裝,安裝ARM轉譯器。ARM轉譯器嚴格對應Android版本,不可以跨版本混用。
sudo venv/bin/python3 main.py
  1. 重啟Waydroid
sudo systemctl restart waydroid-container
  1. 有時候Google Play可能還是不會顯示x86架構以外的應用程式,為此您需要到ApkMirror找ARM架構的APK來裝,看能否正常開啟。

  2. 如果ARM轉譯器執行特定APP有問題,嘗試到Waydroid的Github issue回報,看看有沒有社群製作的patch能用。例如針對《蔚藍檔案》遊戲,有玩家製作了這個指令稿修復登入崩潰的問題。

  3. 更新Waydroid系統之後可能需要重裝ARM轉譯器。

7. 開啟多視窗模式
#

多視窗模式 (multi window mode) 對需要直向使用的APP很有幫助,也能讓多個APP同時執行。

  1. 用以下指令設定為true,讓Waydroid開啟多視窗模式,允許在同一個畫面執行多個APP。
waydroid prop set persist.waydroid.multi_windows true

sudo systemctl restart waydroid-container
  1. 建議在Android開發人員選項開啟「允許自由形式視窗」。

  2. 之後Linux應用程式選單的Waydroid圖示就會消失(仍可透過waydroid show-full-ui指令開啟Android主畫面),只剩下APP圖示。

  3. APP開啟後,會變得好像Linux的原生應用程式一般,能夠自由調整視窗大小。

  4. 有些APP可能依然會以全螢幕啟動,需要按F11切換視窗模式,再按一次F11進入全螢幕。

  5. 若有APP進入全螢幕模式,則其他APP會暫停,就無法同時執行二個以上APP了,最好維持視窗化。

  6. 因為在多視窗模式下無法使用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的配置有效。

  1. 初始化Waydroid
sudo waydroid init -s GAPPS -f
  1. 編輯設定檔
sudo vim /var/lib/waydroid/waydroid.cfg
  1. 填入以下內容,啟用SwiftShader
[properties]
ro.hardware.gralloc=default
ro.hardware.egl=swiftshader
  1. 套用變更
waydroid upgrade --offline
  1. 重新啟動Waydroid
sudo systemctl restart waydroid-container

參考資料
#

相關文章

樹莓派同時裝Linux與Android APP ~ Waydroid安裝教學
分類   資訊科技 虛擬機與容器技術
標籤   Raspberry Pi Waydroid Android Linux
Fedora跑Android APP ~ 安裝Waydroid容器,解決SELinux問題
分類   資訊科技 虛擬機與容器技術
標籤   Waydroid Fedora Android
Linux跑Android APP,Ubuntu安裝Waydroid教學
分類   資訊科技 虛擬機與容器技術 Linux玩遊戲
標籤   Waydroid Ubuntu Android

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。