Waydroid
関連記事
Waydroid は、通常の Linux システム上で完全な Android システムを起動するコンテナベースな手法です。
目次
- 1 前提条件
- 2 インストール
- 3 使い方
- 4 ネットワーク
- 5 ヒントとテクニック
- 6 トラブルシューティング
- 6.1 一般的なヒント
- 6.2 ARM アプリと互換性がない
- 6.3 画面回転するとアプリが使えなくなる
- 6.4 クリップボードマネージャーサービスの起動に失敗する
- 6.5 物理キーボードが動作しない場合がある
- 6.6 dnsmasq: failed to open pidfile /run/waydroid-lxc/dnsmasq.pid: Permission denied
- 6.7 Waydroid シェル内のコマンド出力にアクセスできない、または見つからない
- 6.8 WARNING: Service manager /dev/binder has died
- 6.9 multi-GPU systemを使用すると表示がおかしくなる
- 7 参照
前提条件
CPU 要件
要件は CPU アーキテクチャによって異なります。詳しくは テーブルで確認することができます。
必要な CPU 命令があるかどうかは、cat /proc/cpuinfo
で確認することができます。
GPU 要件
Waydroid は現在 Intel GPU で最適に動作します。そのまますぐに使用できるはずです。
すべての AMD GPU はサポートされています。もし Waydroid が動作しない場合は、新しい Waydroid イメージ(イメージはRadeon 680M で動作します)をビルドするか、以下の NVIDIA の手順を試してみてください。
NVIDIA GPU は現在動作しませんが、2 つの回避策があります:
- 可能であれば統合グラフィックカードに切り替えます
- ソフトウェア レンダリングを使用します (#ソフトウェア レンダリング を参照)
Wayland セッションマネージャ
Waydroid は Wayland セッションマネージャーでのみ動作しますので、Wayland セッションであることを確認してください。
X11 を使用している場合でも、多くの Wayland セッション マネージャーはネストされたセッションをサポートしていることに注意してください (そのため、X11 セッション内で実行できます)。最も単純な例は cage です。
カーネル モジュール
まず、binder モジュールが付属しているカーネルを実行する必要があります。これらは Arch Linux のデフォルト カーネル (linux) の一部ではないため、これらのモジュールを同梱するカーネルをインストールする必要があります。
また、他のカーネルを使用するために、ブートローダーを設定する必要がある場合もあります。新しいカーネルでブートローダーを起動する方法については、wiki ページを参照してください。他のカーネル (のバージョン) での起動は、Linux システムの再起動が必要になる数少ないケースの 1 つです。 Waydroid を起動する前に、これらのモジュールを使用してカーネルを起動する必要があります。
互換性のあるカーネルを入手するには、複数の方法があります。
Linux-Zen を使用する
linux-zen カーネルには、必要なモジュールが含まれています。これは、カーネルをコンパイルする必要がなく (コンパイルには時間がかかります)、定期的に更新バージョンを受け取るため、最も快適な方法と言えます。
DKMS モジュール
binder_linux-dkmsAUR をインストールし、モジュール オプション devices=binder,hwbinder,vndbinder
を指定して カーネルモジュール binder_linux
をロードします (バグレポートを参照)。
$ sudo modprobe binder-linux device=binder,hwbinder,vndbinder
カーネル 5.18 以降での問題を回避するには、カーネルパラメータ ibt=off
を使用する必要もあります。 /dev/binderfs
マウント時のセグメンテーション違反 を参照してください。
カーネルをビルドする
あるいは、必要なオプションを指定して linux カーネル、または他のカーネル パッケージ (>=5.7) を再コンパイルすることもできます。 カーネル#コンパイル も参照してください。
最小限のカーネルをビルドするときは、次の要件に留意してください。
- IPv6 のサポート。カーネルに IPv6 ネットワークが組み込まれていない場合、Waydroid では IPv4 接続が行われません。
- Netlink ソケット (
CONFIG_NF_CT_NETLINK=y
)。 - PSI (
CONFIG_PSI=y
)。 - ループブロック・デバイス (
CONFIG_BLK_DEV_LOOP=m
) - Waydroid を起動する前に、loop
モジュールをロードする必要があります。
コンパイル オプションを設定する場合、以下の 2 つのオプションを使用できます。 binder と binderfs です。両方の手順を以下に示します。
binder を使用する
このモジュールは、カーネルにコンパイルすることも (y
)、モジュールにコンパイルすることも (m
)、まったくコンパイルしないこともできます (n
)。また、構成内のすべての組み合わせが可能であるわけではなく、一部のオプションには他のオプションが必要になります。
以下の構成オプションは、binder をモジュールとしてコンパイルしますが、最後のオプションは、binder モジュールがロードされるときに、/dev/
ディレクトリに 3 つのデバイスが作成されることを指定します。
CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=m CONFIG_ANDROID_BINDERFS=n CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
AUR からカーネルをビルドする場合、次の手順で構成を更新できます。
makepkg --nobuild
を実行します。これにより、ダウンロードされたソースが検証および展開され、prepare()
関数が実行されます。- カーネル ディレクトリの下部にある
.config
ファイル (ファイル名にドットを含む) を編集します。 prepare()
関数の最後にあるのは、おそらくコンフィグ (make olddefconfig
かもしれません) からの情報を使用して makefile を再生成するコマンドです。それをbuild()
関数に移動するか、自分で実行します。makepkg --noextract
を実行します。これは、makepkg --nobuild
が中断された場所から再開します。
bindingfs を使用する
binder カーネル モジュールは、複数のユーザーに問題を引き起こすことが知られています。これらの問題に対処するために、binderfs が作成されました。カーネルをコンパイルするときに、古い方法と新しい方法のどちらかを選択する必要があります。以下のオプションでは、代わりに bindingfs を使用します。
カーネル ソースには、構成オプションを設定するための簡単なスクリプトも付属しています。コンフィグを手動で編集する場合と同様に、依存関係のチェックは行われません。 .config
ファイルと同じディレクトリにある場合は、次のコマンドを実行できます:
$ scripts/config --enable CONFIG_ANDROID $ scripts/config --enable CONFIG_ANDROID_BINDER_IPC $ scripts/config --enable CONFIG_ANDROID_BINDERFS $ scripts/config --set-str CONFIG_ANDROID_BINDER_DEVICES ""
AUR からカーネルをビルドする場合、これらの行を PKGBUILD の適切な場所 (通常は prepare()
) に挿入するだけで十分です。
binder デバイスのセットアップ
Waydroid パッケージの最新バージョンがあることを確認してください。これは Waydroid が自動的に処理します。
インストール
必要に応じて、waydroid-imageAUR または waydroid-image-gappsAUR をインストールして、AUR を通じて必要な Android イメージを入手します。ただし、Waydroid 自体にイメージのダウンロードを処理させることをお勧めします。
Waydroid を初期化した後、最新の Android イメージがまだ利用できない場合は自動的にダウンロードされます。
# waydroid init
GAppsを利用して初期化するには:
# waydroid init -s GAPPS -f
次に、waydroid-container.service
を起動/有効化します。
これで Waydroid が動作するはずです。
使い方
waydroid-container.service
が 起動 していることを確認してから、次を実行します:
$ waydroid session start
Waydroid セッションがアクティブになりました。対話コマンドの例を次に示します:
GUI を起動します:
$ waydroid show-full-ui
シェルを起動します:
# waydroid shell
アプリケーションをインストールします:
$ waydroid app install $path_to_apk
アプリケーション一覧を取得します:
$ waydroid app list
アプリケーションを実行します:
$ waydroid app launch $package_name
ネットワーク
ネットワークはそのまま動作するはずですが、そうでない場合は、パケット転送 がカーネルで有効になっていることを確認し、Waydroid session start の実行 "前" にファイアウォールで次のルールを許可する必要があるかもしれません。
ufw を例として挙げます。
- DNS トラフィックを許可する必要があります:
# ufw allow 67
# ufw allow 53
- パケット転送を許可する必要があります:
# ufw default allow FORWARD
firewalld の場合は、次のコマンドを使用できます。
- DNS:
# firewall-cmd --zone=trusted --add-port=67/udp
# firewall-cmd --zone=trusted --add-port=53/udp
- パケット転送:
# firewall-cmd --zone=trusted --add-forward
- waydroid インターフェイスを信頼するプログラムに追加します:
# firewall-cmd --zone=trusted --add-interface=waydroid0
ヒントとテクニック
ソフトウェアレンダリング
以下をすでに実行していることを確認してください:
# waydroid init
(詳細については、#インストール セクションを参照してください)
次に、以下を追加します。
/var/lib/waydroid/waydroid_base.prop
ro.hardware.gralloc=default ro.hardware.egl=swiftshader
最後に、waydroid-container.service
を 再起動 します。
表示領域の寸法設定
waydroid ウィンドウのサイズを設定するには、次のコマンドを使用して好みに合わせてサイズに調整します。
$ waydroid prop set persist.waydroid.width 576 $ waydroid prop set persist.waydroid.height 1024
次に、waydroid-container.service
を 再起動 します。
トラブルシューティング
問題が発生した場合は、公式の Issue Tracker を参照してください: Waydroid issue tracker。
一般的なヒント
Waydroid は開発が速いため、問題が発生した場合に、最初に行うべき手順のリストを次に示します。
- Waydroid パッケージが最新であることを確認してください。
- 以下を実行して、最新の Waydroid イメージがあることを確認してください。
# waydroid upgrade
- Waydroid をリセットします。
waydroid-container.service
を 停止 し、# waydroid init -f
を実行して、サービスを再度 起動 します。 - ちょっとしたクリーンアップを行うこともできます。
# rm -rf /var/lib/waydroid /home/.waydroid
$ rm -rf ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid
を実行します。
ARM アプリと互換性がない
Casualsnek の スクリプト を使用して、変換レイヤーをインストールします。
変換レイヤーの最適化のため、AMD CPU では libndk を使用し、Intel CPU では libhoudini を使用することをお勧めします。ただし、アプリによっては、ある変換レイヤーでは機能し、別の翻訳レイヤーでは機能しないものもあります。したがって、ゲームが動作しない場合やパフォーマンスが低下する場合は、両方を試す必要がある場合があります。
libndk arm translation をインストール
# python3 main.py install libndk
libhoudini arm translation をインストール
# python3 main.py install libhoudini
画面回転するとアプリが使えなくなる
Issue 70 を参照してください。
「F11」をクリックして、現在のアプリをウィンドウ モードに切り替えます。
クリップボードマネージャーサービスの起動に失敗する
python-pyclipAUR とその依存関係をグラフィカル セッションにインストールします (X11 の場合は xclip、Wayland の場合は wl-clipboard)。
物理キーボードが動作しない場合がある
左の Alt
キーを押してください。
dnsmasq: failed to open pidfile /run/waydroid-lxc/dnsmasq.pid: Permission denied
AppArmor ルールが設定されていない可能性があります。次のルールを追加します。
/etc/apparmor.d/usr.sbin.dnsmasq
@{run}/waydroid-lxc/r, @{run}/waydroid-lxc/* rw,
Waydroid シェル内のコマンド出力にアクセスできない、または見つからない
Arch ベースのディストリビューションには、 lxc-attach の動作中に表示される恐れのあるバグ があり、これにより、adbd
または settings
のような waydroid shell
内のコマンドでこの問題が発生する可能性があります。
この問題を回避するには、waydroid shell
コマンドを次のように置き換えることが考えられます。
# lxc-attach -P /var/lib/waydroid/lxc/ -n waydroid --clear-env
WARNING: Service manager /dev/binder has died
Isuue 136 を参照してください。
PSI を有効にする必要があります。
psi=1
を カーネルコマンドライン に追加します。
Liquorix カーネル(Waydroid では動作しません)は、PSI と互換性のない特定のスケジューラーを使用するため、注意してください。
multi-GPU systemを使用すると表示がおかしくなる
現在、Waydroid はホスト コンポジターが実行されているのと同じ GPU 上で実行する必要があります。これを修正する 2 つの方法は、/var/lib/waydroid/lxc/waydroid/config_nodes
を編集して正しい GPU になるようにするか、コンポジターが実行される GPU を変更するかのいずれかです。