メインコンテンツへスキップ

Waydroid使用テクニック:ネットワークなし、タッチ無反応、Playストア登録、ARMトランスレーター導入を解決

·
カテゴリー 情報技術 仮想化とコンテナ技術
タグ 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アプリのアイコンが表示されるはずです。GNOMEでは一般的なLinuxアプリと混在し、KDE PlasmaではWaydroid専用フォルダが表示されます。

「Waydroid」アイコンをクリックすると、waydroid show-full-uiコマンドを実行したのと同じ効果になります。このときAndroidホーム画面がポップアップし、通知欄にアクセスでき、すべての操作はこのウィンドウ内に限定されます。一度に実行できるアプリは1つだけで、タブレットを使っているような感じです。

他のアプリアイコンをクリックした場合(Androidデスクトップのアイコンではなく、Linuxデスクトップのアイコンから起動)、アプリは独立ウィンドウとして起動し、Linuxデスクトップのタスクバーに個別表示されます。ウィンドウサイズは固定です。それでも一度に実行できるアプリは1つだけで、同時実行はできません。アプリウィンドウを切り替えると、もう一方のアプリは一時停止します。たとえばゲームアプリの画面はフリーズし、Youtubeは再生を停止します。これらのアプリは通知欄を使えず、戻るキーをクリックするとアプリウィンドウは自動的に閉じますが、完全には停止しません。

「マルチウィンドウモード」を有効にした場合(起動方法は下記)、Linuxデスクトップ上のWaydroidアイコンは消えます。そしてLinuxデスクトップからアプリを起動するとウィンドウサイズを調整でき、同時実行もでき、アプリを切り替えても一時停止しません。閉じるボタンまたは戻るキーをクリックするとアプリウィンドウは閉じますが、完全には停止しません。

WaydroidはAndroidとLinuxのクリップボードを同期しますが、Androidアプリ内でLinuxの入力メソッドを使って文字入力することはできません。別途Gboardをインストールする必要があります。

2. Waydroidの操作コマンド
#

Waydroid実行時のAndroidシステムデータは~/.local/share/waydroid/data/にあり、システムイメージは/var/lib/waydroid、アプリアイコンは~/.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

Waydroid起動後はADBデバッグが自動で有効化され、LinuxホストからADBを起動してペアリングできます。IPアドレスはAndroidシステム設定 → 端末情報で確認できます。

adb connect Waydroid的IP:5555

adb devices

開発者向けオプションを有効にするには?Androidシステム設定 → 端末情報 → ビルド番号を開き、5回タップします。その後、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トランスレーターをインストールしてアプリのクラッシュを解決
#

ARMアーキテクチャのPCはこの手順を飛ばせます。

多くのPCはx86アーキテクチャであり、多くのスマホゲームはARMアーキテクチャのAPKしか提供していないため、ARM命令をx86命令へ変換するソフトウェアが必要です。

アプリがARMアーキテクチャしかないことをどう確認する?デフォルトでARMトランスレーターがない場合、Google Playに特定アプリが表示されないことがあります。またはAPKインストール後、Package Managerでそのアプリに/lib/x86_64のライブラリが含まれるか確認します。ARMだけなら起動時にクラッシュします。ARMトランスレーターのインストールが必要です。

現在のARMトランスレーターには、Intelが開発した「libhoudini」とGoogleが開発した「libndk」があり、どちらもプロプライエタリソフトウェアです。Arch Wikiの情報によれば、libhoudiniはIntel CPU向け、libndkはAMD CPU向けで、プロセッサ性能に合わせた最適化があります。あるアプリは片方で動き、もう片方では動かない場合もあるため、いろいろ試す必要があります。2つの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トランスレーターが特定アプリで問題を起こす場合は、WaydroidのGithub issueへ報告し、コミュニティ製patchが使えるか確認してみてください。たとえば《ブルーアーカイブ》ゲーム向けには、ログインクラッシュ問題を修正するこのスクリプトをプレイヤーが作成しています。

  3. Waydroidシステム更新後、ARMトランスレーターの再インストールが必要になる場合があります。

7. マルチウィンドウモードを有効化
#

マルチウィンドウモード (multi window mode) は縦向きで使う必要があるアプリに役立ち、複数アプリを同時実行できるようにもします。

  1. 以下のコマンドでtrueに設定し、Waydroidのマルチウィンドウモードを有効にして、同じ画面で複数アプリを実行できるようにします。
waydroid prop set persist.waydroid.multi_windows true

sudo systemctl restart waydroid-container
  1. Android開発者向けオプションで「自由形式ウィンドウを許可」を有効にすることをおすすめします。

  2. その後、LinuxアプリケーションメニューのWaydroidアイコンは消えます(waydroid show-full-uiコマンドでAndroidホーム画面を開くことはできます)。残るのはアプリアイコンだけです。

  3. アプリを開くと、Linuxのネイティブアプリのようになり、ウィンドウサイズを自由に調整できます。

  4. 一部のアプリは依然として全画面で起動することがあります。その場合はF11でウィンドウモードに切り替え、もう一度F11で全画面に戻ります。

  5. アプリが全画面モードに入ると他のアプリは一時停止し、2つ以上のアプリを同時実行できなくなります。できるだけウィンドウ化を維持してください。

  6. マルチウィンドウモードではAndroidのマルチタスク画面を使えないため、アプリの実行を完全に停止するにはAndroid Settings → アプリを開き、強制停止するしかありません。

個人的にはAndroid 13のウィンドウ管理は不完全だと思います。一部のアプリはリサイズ後に壊れたり、そもそもリサイズできなかったりします。問題があると感じたら、この機能をオフにしてください:

waydroid prop set persist.waydroid.multi_windows false

sudo systemctl restart waydroid-container

また、Androidには「自由形式」ウィンドウ機能も内蔵されており、マルチタスク画面から起動します。これはアプリをWaydroidのウィンドウ内でだけ自由にリサイズできるようにします。

8. アプリを多重起動し、複数アプリを同時実行
#

Waydroidの設計上、複数インスタンス (instances) は開けないため、同じアプリで2つのアカウントに同時ログインするような多重起動はできません。ただしShelterの仕事用プロファイル機能を使えば、1つのAndroidシステム内でアプリを複製できます。

Waydroidの設計では、APKインストール後に各AndroidアプリのアイコンがLinuxデスクトップのアプリケーション一覧に表示されます。ここをクリックして起動すれば複数アプリを実行できます。ただし「同時に」2つ以上のアプリを実行するには、「マルチウィンドウモード」を有効にする必要があります。

マルチウィンドウモードで、アプリがウィンドウ化を拒み、全画面にこだわる場合はどうする?デスクトップ環境の仮想デスクトップを活用しましょう。GNOME、KDE Plasma、Hyprland、COSMICにはいずれも仮想デスクトップ (virtual desktop、またはworkspace) 機能があります。アプリ起動時に現在の仮想デスクトップ全体を占有するなら、次の仮想デスクトップへ切り替えて別のアプリを起動すればよいです。各ワークスペースでそれぞれのアプリを実行できます。

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的目錄" 

またはSFTPを使います。LinuxホストにAvahiサービスがインストールされていれば、IPの代わりにhostname.localで接続できます。こうすればIPがどう変わっても接続できます。

つまり、Android側にMaterial Filesをインストールすれば、hostname.localを入力してLinuxホストのSSHサーバーへログインし、ファイルを閲覧できます。

10. アプリにWifi接続をシミュレート
#

(注:この機能はAndroid 13以降ではすでに無効になっています)

一部のアプリはダウンロードのためにWifiを有効にすることを要求し、そうでないとモバイルデータのみだと思い込みます。それなら望みどおりfake wifiを有効にします。

waydroid app listコマンドでアプリのパッケージ名を確認します。

以下の構文で設定します:

waydroid prop set persist.waydroid.fake_wifi "套件名稱"

たとえばMihon漫画リーダーで疑似Wifiを有効にし、そのアプリ設定で非Wifiダウンロードを許可してからコンテナを再起動します:

waydroid prop set persist.waydroid.fake_wifi "app.mihon"

sudo systemctl restart waydroid-container

11. アプリにタッチクリックをシミュレート
#

waydroid app listコマンドでアプリのパッケージ名を確認します。

一部のアプリはマウスクリックを認識できず、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

疑似タッチを有効にしてもアプリをクリックできない場合は、他の方案を検討してください。たとえば:搭配Scrcpy操作Waydroid

また、PCキーボードでタッチ操作をシミュレートしたい場合は、Waydroid Helperをインストールしてください。

12. アプリ画面方向を強制回転
#

Rotation Controlのようなアプリをインストールすると、Waydroidの画面方向を強制調整できます。

Waydroidは、画面を回転できるLinuxタブレットを使わない限り、縦向き画面解像度へ調整できないかもしれません。

アプリを縦向きで使いたい場合は、「マルチウィンドウモード」を有効にするか、こちらをおすすめします:搭配Scrcpy操作Waydroid

13. アプリ音量を調整
#

Androidシステム設定 → 音声を開いて音量を調整します。

物理キーではAndroidコンテナ内の音量を操作できないため、音量調整アプリを別途インストールする必要があります。Androidデスクトップにウィジェットとして置くか、Sound Quick Settingsを使ってAndroid通知欄に音量調整ボタンを追加します。

Linuxデスクトップの音量コントロールパネルでは、pavucontrolのようにWaydroidの出力だけを個別にミュートできます。

また、WaydroidはLinuxのマイクにアクセスでき、Androidアプリは正常に音声を録音できるはずです。マイク音量も同様にpavucontrolコントロールパネルから調整できます。

複数アプリを実行していて特定アプリだけをミュートしたい場合は、ShizuToolsのMixedAudio機能を使うことをおすすめします。

14. アプリのスクリーンショット
#

Androidのマルチタスク画面には単一アプリのスクリーンショットボタンがあります。

Linux側にはAndroidハードウェアキーのスクリーンショットを発火するショートカットがないので、Linux側のスクリーンショットソフトを使いましょう。

またはScreenshot Tileをインストールすると、Android通知欄にネイティブのスクリーンショットボタンが追加されます。

15. アプリがRootやエミュレーターを検出してクラッシュするのを防ぐ
#

アプリがインストールを拒否したりクラッシュしたりする原因は、ARMトランスレーションではなく、アプリがデバイスを安全でないと判断していることがあります。

WaydroidのPlay Integrity APIレベルは最も基本的なものすら通過できないため、一部のアプリは実行を拒否します。

さらにDRMが必要なアプリも再生できません。

この解決方法は比較的複雑で、MagiskをインストールしてRootを隠すか、機種を偽装するかになります。参照:Waydroid躲避Root偵測 & 安裝Magisk與LSPosed

16. LinuxデスクトップのWaydroidアプリアイコンを隠す
#

GNOMEデスクトップのユーザーにはこの悩みがあります。AndroidアプリとLinuxプログラムのアイコンが混在して混乱します。

WaydroidのAndroidアプリアイコンは~/.local/share/applications/waydroid.*にあり、AndroidアプリをLinuxのDesktop Entryとして表示しています。

ならば、定期的にコマンドを実行し、それらをデスクトップに表示しないよう設定すればよいです(参考)。

sed -si '/Actions=app_settings/a NoDisplay=true' ~/.local/share/applications/waydroid.*.desktop

17. X11デスクトップでWaydroidを起動
#

Waylandセッションを使いにくい場合は、Westonネストされた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がメインGPUの場合でもIntel GPUで強制レンダリングできます。ただし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

19. Waydroidシステムバージョンのアップグレードまたはダウングレード
#

Custom Imageメカニズムを使ってAndroidシステムバージョンをアップグレードまたはダウングレードできます。

  1. SourceForgeから過去バージョンのsystemとvendorイメージをダウンロードします

  2. イメージを展開し、指定位置へ移動します

sudo mkdir -p /etc/waydroid-extra/images

sudo unzip lineage-*-system.zip -d /etc/waydroid-extra/images

sudo unzip lineage-*-vendor.zip -d /etc/waydroid-extra/images

rm lineage-*-system.zip lineage-*-vendor.zip
  1. Waydroidを再初期化:
sudo waydroid init -f
  1. 再起動します。Waydroidを起動し、システム設定 → 端末情報でバージョン変更が成功したか確認します。

參考資料
#

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。