Open10

Waydroid を実用するために行なった加工などのまとめ

ピン留めされたアイテム

これは何?

https://waydro.id/

この 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 を拡張する
  • 実際に Disk image を rw mount して編集する
  • 最期に umout してから sudo waydroid init -f してから waydroid container を再起動

この辺り手順が違っているとWaydroid 環境が壊れたりもするので、そう言った意味で注意が必要です。

またこの Scrap に記載されている手順については各項目ごとに単独で変更を加え、その上で Wayroid が正常に起動するか確認しつつ作業をやった方が良いと思います。

Waydroid を NixOS で初期セットアップする

1. 下記の様な waydroid.nix を用意してシステムに読み込ませる

waydroid.nix
{ 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 する

https://sourceforge.net/projects/waydroid/files/images/

辺りから入手できるので、system.imgvendor.img を用意してください。

そしてこれらのファイルを/usr/share/waydroid-extra/images/ に配置します。

3 . 次に nixos-rebuild switch してから次のコマンドを実行してwaydroid が起動するか確認します。

$ sudo waydroid init -f
$ sudo systemctl waydroid-container
$ waydroid session start

4. ここまでで下準備は終わりです

次のステップへ行きましょう。

Waydroid を winevine L3 に対応させる

BlissRoms-x86/android_vendor_google_chromeos-x86 を git clone する

https://blissos.org/

と言う Android for PC な Distro のリポジトリに Chrome OS の Disk Image から widevine L3 と libhoudini のバイナリを引っこ抜くスクリプトがあるので、まずはこれを git clone します。

なお該当リポジトリはこれです:

https://github.com/BlissRoms-x86/android_vendor_google_chromeos-x86

該当リポジトリの 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 が有効かどうかの確認に下記のアプリを使いました:

https://play.google.com/store/apps/details?id=com.androidfung.drminfo&hl=ja&gl=US

Waydroid で Google Play Store を使う

簡単な方法

Waydroid の開発元が提供する LinesageOS 18.1 のイメージには Google Play Store が仕える flavour があるので、そっち使うのが一番簡単です。

$ sudo waydroid init -s GAPPS

面倒な方法

https://opengapps.org/

をから x86_64 の pico パッケージを DL してきて該当パッケージを unzip 、そしてさらに unzip したパッケージ内の archive ファイルをさらに unpack してファイルを system.img に配置できるようにしてからコピペ、と言うのが一連の流れですが、結構面倒なので簡単な方法を使いましょう。

Waydroid の LineageOS を加工するための容量拡張の手順

1. まず e2fsckresize2fs を使える環境を用意する

これは各 Linux Distro の package manager 経由で追加して下さい

2. 活動中の Waydroid container を止める

$ sudo systemctl stop waydroid-container

と言った辺りのコマンドで止めましょう。と言うか止めないと多分システムがおかしなことになると思います 。

2. 次に e2fsck -y -f {system,vendor}.img を実行する

これをしないと次の resize2fs が出来ないのでやっておきます

3. resize2fs {system,vendor}.img {file size} で拡張する

私の場合、これはこんな感じでやりました:

# 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 で中身としてはこんな感じです

etc/permissions/android.hardware.usb.host.xml
<permissions><feature name="android.hardware.usb.host"/></permissions>

Waydroid の ueventd.rcinput subsystem を止める

この作業を行わないとキーボード入力が二重になる(Waydroid container と linux host が同時にキーボード入力を認識する)ため、system.img 内の /system/etc/ueventd.rc を下記の様に変更します:

/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 とは?

これです:

https://play.google.com/store/apps/details?id=com.extreamsd.usbaudioplayerpro&hl=ja&gl=US

ちなみに有料アプリなので各自買いましょう。

インストール条件

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 を管理下から除外することが出来ます:

udev.rule
    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 で買いました:

https://www.yodobashi.com/product/100000001004144755/

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 と言うパスになるファイルを書き換えます:

/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 以下にブチ込みましょう

https://github.com/nyarla/magisk-lineage-audio-mod

なんで音が良くなるか

これはオカルト……ではなく、単純に Android 本体が持つ Audio Effect の類いを外しているだけの設定になります。

実のところこの辺りの知恵は 5ch の Android を DAP 化するスレなどを参考にしていますが、やっている事としては下記の通りとなります:

  • Android 本体の Audio Effect を外す
  • Android 本体が対応する Samplerate の上限を上げる
  • あとは Android の Volume curve を調整する(これはモバイル端末で爆音が出たので……)
ログインするとコメントできます