這篇是針對Linux的Android容器「Waydroid」所寫的一篇綜合性文章。Waydroid使用的Android系統是基於LineageOS建置的,並與Linux宿主機共用核心。Ivon將會討論一些操作Android常常會遇到的問題。
請先在Linux系統安裝Waydroid:Ubuntu安裝Waydroid
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
Wyadroid啟動後會自動開啟ADB偵錯,用以下指令進入Android ADB shell,內建Root權限
sudo waydroid shell
如何開啟開發人員選項?開啟Android系統設定 → 關於手機 → 版本號碼,點五下。之後Android系統設定 → 系統就會出現開發人員選項。
將Waydroid語言改成中文#
在Android的界面開啟Settings → System → Languages,加入中文,並將滑桿拉到最上面。
Android的時間應該會在調整語言之後,自動依照時區和網路時間同步。
解決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
Google Play商店裝置註冊#
Waydroid基於LineageOS建置,雖然內建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
安裝ARM轉譯器#
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轉譯器。
開啟多視窗懸浮模式#
用以下指令設定為true,讓Waydroid開啟多視窗模式,允許在同一個畫面執行多個APP。
waydroid prop set persist.waydroid.multi_windows true
sudo systemctl restart waydroid-container
建議在Android開發人員選項開啟「允許自由形式視窗」。
之後Linux應用程式選單的Waydroid全螢幕按鈕就會消失,無法再使用Android桌面,只剩下APP圖示。
APP開啟後,會變得好像Linux的原生應用程式一般,能夠自由調整視窗大小。按F11暫時進入全螢幕。
有些APP可能依然會以全螢幕啟動,需要按F11進入視窗模式。
個人覺得Android 11的視窗管理不完善,有些APP縮放後會壞掉,或者根本無法縮放。覺得出問題的話就把這功能關掉:
waydroid prop set persist.waydroid.multi_windows false
sudo systemctl restart waydroid-container
另外Android也有內建「自由形式」視窗功能,這會讓APP只在Waydroid的視窗內自由縮放。
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的目錄"
APP模擬Wifi連線#
部份APP會要求開啟Wifi才能下載,不然會以為你只有行動數據,那麼就如它所願,開啟fake wifi。
安裝Package Manager,用於查看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
APP模擬觸控點擊#
安裝Package Manager,用於查看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
強制旋轉APP螢幕方向#
安裝Rotation Control這類APP,即可強制調整Waydroid螢幕方向。
Waydroid可能無法調整成直向螢幕解析度,除非你使用可以旋轉螢幕的Linux平板。要直向使用APP,建議:搭配Scrcpy操作Waydroid
調整APP音量#
開啟Android系統設定 → 音訊,調整音量。
實體鍵無法控制Android容器內的音量,所以得另外安裝調整音量的APP。放在Android桌面當作小工具,或者是用Sound Quick Settings,新增一個音量調整按鈕到Android通知欄。
Linux宿主機的音量控制面板可以單獨將Waydroid的輸出靜音,譬如pavucontrol
。
另外,Waydroid可以存取Linux的麥克風,Android APP應該能夠正常錄製音效。麥克風音量同樣能夠從pavucontrol控制面板調整。
APP截圖#
Android的多工畫面有單個APP的截圖按紐。
沒有快捷鍵能夠觸發Android的截圖,所以就用Linux端的截圖軟體吧。
或者,安裝Screenshot Tile,Android的通知欄就會多出一個原生截圖按鈕。
多開APP#
Waydroid設計上沒辦法開啟多個實例。
但是你可以透過Shelter的工作設定檔功能,在一個Android系統雙開APP。
不想要Waydroid APP圖示出現在Linux桌面#
Waydroid的Android APP圖示位於~/.local/share/applications/waydroid.*
寫個指令稿於Waydroid關閉後刪除之。
在X11桌面啟動Waydroid#
如果不方便使用Wayland工作階段,就用巢狀Wayland工作階段解決。
參見:在Linux X11桌面用Weston啟動Waydroid,不依賴Wayland協定桌面
Nvidia顯示卡以軟體渲染強制啟動Waydroid#
撰文當下Nvidia閉源驅動版本575,Waydroid只支援Intel與AMD的顯示卡,不支援Nvidia。如果硬要在Nvidia顯示卡跑的話就只能改用軟體渲染啟動Waydroid。此模式下無效能可言,無法玩遊戲。
- 初始化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