Waydroid を実用するために行なった加工などのまとめ
追記: 2024-02-28
現行の waydroid v1.4.2 以降では read-only と read-write な overlays が実装されているため、下記のハックを行う必要がなくなりました。
下記のハックと同等の環境を揃えたい場合には、
を使うと便利です。
また Waydroid のシステムにファイルを追加・上書きしたい場合、/var/lib/waydroid/overlay{,_rw}
にファイルを追加することで実現できます。
これは何?
この Scrap は 2022-11-15 前後に行なっていた Waydroid の Disk Image の加工に対するメモ書きです。
この Scrap で取り扱っている内容はおおよそ次の通りです:
- Waydroid で widevine L3 を動かす
- Waydroid で USB Device を Android アプリに直接使わせる
- Waydroid で Google Play Store を動かす(未執筆)
またこの Scrap を作った動機ですが、Waydroid の LineageOS 18.1 の Disk image を加工していく上で何をどうしたか、と言うメモを残しておかないと後で絶対に作業内容を再現できなくなると思ったのが理由です。
ただこの Scrap では作業内容を思い出しながら書いているので、メモの順番が順不同であったり、段取りに抜けがある可能性も高いので、この記事を参考にする場合にはその辺りを各自補完してなんとかやってください。
またこの Scrap の内容は手順メモであるため、細かいところの詳細な説明を省いて記載しています。なので分からない事や質問したい事があればコメント経由で疑問を投げてもらえると助かります。
Waydroid の disk image 編集の流れ
基本的に Waydroid の Disk image を加工する際の手順は下記の様になります:
-
sudo systemctl stop waydroid-contianer
などで Waydroid container を止める - 編集領域を確保するために disk image を拡張する
- 手順については次を参照:Waydroid の LineageOS を加工するための容量拡張の手順
- 実際に Disk image を rw mount して編集する
- 最期に umout してから
sudo waydroid init -f
してから waydroid container を再起動
この辺り手順が違っているとWaydroid 環境が壊れたりもするので、そう言った意味で注意が必要です。
またこの Scrap に記載されている手順については各項目ごとに単独で変更を加え、その上で Wayroid が正常に起動するか確認しつつ作業をやった方が良いと思います。
Waydroid を NixOS で初期セットアップする
waydroid.nix
を用意してシステムに読み込ませる
1. 下記の様な { lib, pkgs, ... }: {
virtualisation = {
waydroid.enable = true;
lxd.enable = true;
};
environment.etc."gbinder.d/waydroid.conf".source = lib.mkForce
(pkgs.writeText "waydroid.conf" ''
[Protocol]
/dev/binder = aidl3
/dev/vndbinder = aidl3
/dev/hwbinder = hidl
[ServiceManager]
/dev/binder = aidl3
/dev/vndbinder = aidl3
/dev/hwbinder = hidl
[General]
ApiLevel = 30
'');
}
2. イメージファイルの加工を前提に linesage 18.1 のイメージファイルを DL する
辺りから入手できるので、system.img
と vendor.img
を用意してください。
そしてこれらのファイルを/usr/share/waydroid-extra/images/
に配置します。
nixos-rebuild switch
してから次のコマンドを実行してwaydroid が起動するか確認します。
3 . 次に $ sudo waydroid init -f
$ sudo systemctl waydroid-container
$ waydroid session start
4. ここまでで下準備は終わりです
次のステップへ行きましょう。
Waydroid を winevine L3 に対応させる
BlissRoms-x86/android_vendor_google_chromeos-x86
を git clone する
と言う Android for PC な Distro のリポジトリに Chrome OS の Disk Image から widevine L3 と libhoudini のバイナリを引っこ抜くスクリプトがあるので、まずはこれを git clone
します。
なお該当リポジトリはこれです:
extract-files.sh
を実行する
該当リポジトリの このファイルの実行でプロプライエタリバイナリを引っこ抜けます:
$ cd android_vendor_google_chromeos-x86
$ bash extract-files.sh
proprietary/widevine/vendor/etc/init/android.hardware.drm@1.3-service.widevine
を書き換える
このファイルに start vendor.move_data_sh
と言う行があるのですが、この行が実行しているサービスの実行ファイル(シェルスクリプト)は Waydroid 用の LineageOS 18.1 には存在しないため、この行を丸ごと消去します。
ちなみにこの行が入っていると widevine L3 のサービスが No such file or directory
と言うエラーを吐いて落ちるので、ここでの作業は必須です。
proprietary/widevine/vendor
以下を vendor.img
にコピーする
基本的には /usr/share/waydroid-extra/images/vendor.img
をマウントしてファイルをコピーするだけですが、ディスクイメージを加工するためには容量の追加が必要なので、これについては
を参考にディスクイメージを拡張してからやってください。でないと No space left on device
と言うエラーが出てコピーが失敗します
sudo waydroid init -f
をして waydroid container を再起動する
すべての作業が終わったら あとは上記コマンドを実行してから waydroid session start
すれば widevine L3 の実行が出来るはずです。
なお私は widevine L3 が有効かどうかの確認に下記のアプリを使いました:
Waydroid で Google Play Store を使う
簡単な方法
Waydroid の開発元が提供する LinesageOS 18.1 のイメージには Google Play Store が仕える flavour があるので、そっち使うのが一番簡単です。
$ sudo waydroid init -s GAPPS
面倒な方法
をから x86_64 の pico パッケージを DL してきて該当パッケージを unzip 、そしてさらに unzip したパッケージ内の archive ファイルをさらに unpack してファイルを system.img
に配置できるようにしてからコピペ、と言うのが一連の流れですが、結構面倒なので簡単な方法を使いましょう。
Waydroid の LineageOS を加工するための容量拡張の手順
e2fsck
と resize2fs
を使える環境を用意する
1. まず これは各 Linux Distro の package manager 経由で追加して下さい
2. 活動中の Waydroid container を止める
$ sudo systemctl stop waydroid-container
と言った辺りのコマンドで止めましょう。と言うか止めないと多分システムがおかしなことになると思います 。
e2fsck -y -f {system,vendor}.img
を実行する
2. 次に これをしないと次の resize2fs
が出来ないのでやっておきます
resize2fs {system,vendor}.img {file size}
で拡張する
3. 私の場合、これはこんな感じでやりました:
# resize2fs system.img 4G
# resize2fs vendor.img 400M
以上
ちなみにシステムイメージにファイルを追加して行くと No space left on device
が出る場合がありますが、これは resize2fs
で容量を拡張をして行けばなんとかなります。
Waydroid で USB Device を認識させる
vendor.img
をマウントする
まず だいたいこんな感じ:
$ mkdir -p tmp
$ sudo mount /usr/share/waydroid-extra/images/vendor.img tmp
{mountpoint}/vendor/etc/permissions/
にファイルを追加する
ファイル名は android.hardware.usb.host.xml
で中身としてはこんな感じです
<permissions><feature name="android.hardware.usb.host"/></permissions>
ueventd.rc
で input subsystem
を止める
Waydroid の この作業を行わないとキーボード入力が二重になる(Waydroid container と linux host が同時にキーボード入力を認識する)ため、system.img
内の /system/etc/ueventd.rc
を下記の様に変更します:
#subsystem input
# devname uevent_devpath
# dirname /dev/input
sudo waydroid init -f
してからの waydroid session start
あとは これで Waydroid container 内で USB Device をダイレクトに扱うことができます。
ただし Waydroid は LXC で動く実行環境であるため、Host の linux で認識できない USB Device はおそらく Waydroid でも動作させられないと思います(要出典)
Waydroid で USB Audio Player Pro を使う
※ Waydroid 環境を作り直したところ、UAPP の動作条件が分かったので書き直しています
USB Audio Player Pro とは?
これです:
ちなみに有料アプリなので各自買いましょう。
インストール条件
UAPP(USB Audio Player Pro)を Waydroid で動かすためには下記の条件が揃っている必要があります:
- Waydroid で Google Play Store が使用できる
- Waydroid が USB Host として動作できる
- Waydroid で widevine L3 が動作する(もしかすると必要無いかもしれない)
そしてこの条件を満すと UAPP がインストール可能になるので、そのまま Play Store 経由で UAPP をインストールしましょう。
UAPP で USB Audio Interface を使う際の注意
UAPP on Waydroid で USB Audio Interface を使う場合、USB Audio Interface は UAPP 起動時に どのソフトウェアからも利用されていない、と言う条件を満す必要があります。
これは現代の Linux Desktop で使われる PulseAudio や Pipewire に対しても同じことが言え、UAPP から USB Audio Interface を排他的に使わせるためには、これらのソフトウェアから利用したい USB Audio Interface を管理下から外す必要があります。
なお PulseAudio の場合、udev の rule に下記の様な設定を足すと PulseAudio から Audio Interface を管理下から除外することが出来ます:
ATTRS{idVendor}=="1235", ATTRS{idProduct}=="8205", ENV{PULSE_IGNORE}="1"
※ ちなみに Device ID 1235:8205 は Focusrite Scarlett Solo gen 2 の物です
また UAPP が USB Audio Interface を見失った場合、該当の USB Audio Interface は物理的に抜き差しして再認識させる必要があります。(ただこれについてはソフトウェア的な reattach でも大丈夫かもしれません。が、物理的抜き差しが手っ取り早いです)
ちなみに私はその物理的抜き差しが面倒 + αな理由でこれを yodobashi で買いました:
Waydroid で libhoudini を使う
libhoundini のファイルを抽出する
ファイル抽出の流れは Waydroid を winevine L3 に対応させる と同じで、 widevine L3 に対応させる過程で libhoudini のファイルも抽出されているので、まずこれを Waydroid の system.img
にコピーします:
$ cd android_vendor_google_chromeos-x86
$ cp -r proprietary/widevine/vendor/houdini/* /path/to/system.img/mountpoint/
system/etc/build.prop
を書き換える
次に ここが若干ややこしいんですが、最終的には下記の様な設定になる様に Waydroid で /system/etc/build.prop
と言うパスになるファイルを書き換えます:
# ABI support の追加(既存の項目の書き換え)
ro.product.cpu.abi=x86_64
ro.product.cpu.abilist=x86_64,x86,arm64-v8a,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=x86_64,arm64-v8a
# Houdini のために追加
ro.dalvik.vm.isa.arm=x86
ro.dalvik.vm.isa.arm64=x86_64
ro.enable.native.bridge.exec=1
ro.dalvik.vm.native.bridge=libhoudini.so
sudo waydroid init -f
して Waydroid contianer を立ち上げる
あとは ここまでの作業が上手く行っていれば Waydroid container 内で ARM 系アプリの実行が可能となります。
ちなみにこの項目の確認は、x86 系に対応していないアプリがインストール可能かどうかで判断してください。
Waydroid で音質を気持ち上げる
やり方
手前味噌とはなりますが、この magisk module の system/vendor/etc
以下 Waydroid の vendor.img
以下にブチ込みましょう
なんで音が良くなるか
これはオカルト……ではなく、単純に Android 本体が持つ Audio Effect の類いを外しているだけの設定になります。
実のところこの辺りの知恵は 5ch の Android を DAP 化するスレなどを参考にしていますが、やっている事としては下記の通りとなります:
- Android 本体の Audio Effect を外す
- Android 本体が対応する Samplerate の上限を上げる
- あとは Android の Volume curve を調整する(これはモバイル端末で爆音が出たので……)
googleplay
コマンドで Play Store から apk を DL する
TODO