28 January 2025

Ubuntu22.04でAndroidコンテナWaydroidを使う

LinuxのAndroidコンテナWaydroidをインストールしたときのメモ

Waydroidのインストール

公式Web(https://waydro.id/)の Docs -> How to Install -> Ubuntu/Debian and derivatives に掲載されたコマンドをそのまま実行する

Ubuntu Shell (Terminal)
# Waydroidセットアップシェルスクリプトをダウンロードするために使う
sudo apt install curl

# Waydroidコンテナでローカルroot証明書を使うために必要
sudo apt install ca-certificates

# Waydroidセットアップスクリプトをダウンロードし、実行する
# (wget コマンドで代用しても良い)
curl -s https://repo.waydro.id | sudo bash

# Waydroidをインストール
sudo apt install waydroid

Serviceが起動しているか確認

Ubuntu Shell (Terminal)
$ systemctl status waydroid-container.service 
● waydroid-container.service - Waydroid Container
     Loaded: loaded (/lib/systemd/system/waydroid-container.service; enabled; v>
     Active: active (running) since Tue 2025-01-28 18:25:04 JST; 22min ago
   Main PID: 594 (waydroid)
      Tasks: 2 (limit: 38121)
     Memory: 19.6M
        CPU: 168ms
     CGroup: /system.slice/waydroid-container.service
             └─594 /usr/bin/python3 /usr/bin/waydroid -w container start

Warning: some journal files were not opened due to insufficient permissions.

ディスプレイサーバをWaylandに切り替える

Ubuntu 22.04では、デスクトップログオン時にWaylandとXOrgが選択できるが、Waylandで起動する。

Waylandが使われているかどうかは次のコマンドで確認できる。

Ubuntu Shell (Terminal)
$ echo $XDG_SESSION_TYPE 
wayland

Androidイメージのインストール(初回セットアップ)

Ubuntu Shell (Terminal)
$ sudo waydroid init

Android Typeの選択肢が初期設定は「VANILLA」となっているが、Google Play Storeを利用する場合は「GAPPS」を選択する。

GAPPSを選択した場合は、次の2つのシステムイメージがダウンロードされて展開される。

lineage-18.1-20250125-GAPPS-waydroid_x86_64-system.zip (877 MBytes)
lineage-18.1-20250125-MAINLINE-waydroid_x86_64-vendor.zip (187 MBytes)

ディスク上に展開されたファイルのサイズは 4.7 GBytesと巨大だ。

Ubuntu Shell (Terminal)
$ sudo du -h -c -s /var/lib/waydroid/
4.7G	/var/lib/waydroid/
4.7G	合計

Play プロテクト認定(Google Play Certification)を得る

公式Web(https://waydro.id/)の Docs -> Our Documentation -> Google Play Certification に掲載された手順を実行する。

まず、Waydroidを起動する。UbuntuのスタートメニューからWaydroidをクリックしても、Ubuntuシェルターミナルから次のコマンドを実行しても良い。

Ubuntu Shell (Terminal)
$ waydroid show-full-ui

Waydroidがフルスクリーンで起動し、Google Play Certificationが得られていない旨が(画面上部に)通知として出力される。

その状態のままで... (Waydroidのウインドウを閉じずに)

新たなUbuntuシェルターミナルを起動して、 「Google サービス フレームワーク Android ID」を表示させる。

Ubuntu Shell (Terminal)
$ sudo waydroid shell
:/ # 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\";"

android_id|1234567890123456789

:/ # exit
$

表示された「Google サービス フレームワーク Android ID」を、Googleデバイス登録画面に入力し登録を行う。

Android IDを表示させたUbuntuシェルも、全画面で表示中のWaydroid画面も終了し、

登録後、数分たってから再度Waydroidを起動すると、デバイス登録が完了している。

ARM対応

x64-ARMトランスレート レイヤーのlibhoudiniを導入すると、ARM用アプリが利用できるようになる。

手法は「Waydroid を実用するために行なった加工などのまとめ」を参考にした。

Chromeosのセットアップイメージからlibhoudiniを抽出

Ubuntu Shell (Terminal)
# 抽出ツールをダウンロードする
$ git clone https://github.com/BlissRoms-x86/android_vendor_google_chromeos-x86.git

# 抽出ツールを実行する
$ cd android_vendor_google_chromeos-x86/
$ bash ./extract-files.sh
This script requires 'sudo' to mount the partitions in the ChromeOS recovery image. Continue? (Y/n) 
Checking ChromeOS image...
chromeos_13816.82.0_hatch_recovery_stable-channel_mp-v6.bin.zip: オープンまたは読み込みに失敗しました
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1554M  100 1554M    0     0  4319k      0  0:06:08  0:06:08 --:--:-- 4555k
chromeos_13816.82.0_hatch_recovery_stable-channel_mp-v6.bin.zip: OK
 -> Extracting recovery image
 -> Mounting partitions
[sudo] vm のパスワード: 
 -> Deleting old files
 -> Copying files
Done

Waydroidシステムイメージの再ダウンロード

Ubuntu Shell (Terminal)
$ sudo waydroid init -s GAPPS -f
[22:54:14] Downloading https://sourceforge.net/projects/waydroid/files/images/system/lineage/waydroid_x86_64/lineage-18.1-20250125-GAPPS-waydroid_x86_64-system.zip/download
[Downloading]  877.4 MB/877.44 MB     260.65 kbps(approx.)[23:07:18] Validating system image
[23:07:21] Extracting to /var/lib/waydroid/images

$ ll /var/lib/waydroid/images/
合計 2459172
drwxr-xr-x 2 root root       4096 2025-01-28 11:45:27 ./
drwxr-xr-x 9 root root       4096 2025-01-29 23:07:35 ../
-rw-r--r-- 1 root root 1958281216 2025-01-29 23:07:33 system.img
-rw-r--r-- 1 root root  559882240 2025-01-28 11:45:30 vendor.img

システムイメージの空き領域を増やし、libhoudiniをコピーする

Ubuntu Shell (Terminal)

# システムイメージのサイズを1.9Gから2.3Gに増やす
$ sudo e2fsck -f /var/lib/waydroid/images/system.img
$ sudo resize2fs /var/lib/waydroid/images/system.img 2300M
resize2fs 1.46.5 (30-Dec-2021)
Resizing the filesystem on /var/lib/waydroid/images/system.img to 588800 (4k) blocks.
The filesystem on /var/lib/waydroid/images/system.img is now 588800 (4k) blocks long.

# システムイメージをマウントする
$ mkdir /tmp/waydroid
$ sudo mount -o rw /var/lib/waydroid/images/system.img /tmp/waydroid

# libhoudiniをコピー
$ sudo cp -r ./proprietary/houdini/* /tmp/waydroid/

システムイメージのbuild.propを書き換える

/tmp/waydroid/system/build.prop
# 変更する
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

# 追加する
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

システムイメージをアンマウントし、Waydroidを起動する

Ubuntu Shell (Terminal)
$ umount /tmp/waydroid
$ waydroid show-full-ui

前のセクションまでに行ったPlay プロテクト認定などを含む「ユーザ設定やデータ」は、システムイメージの上書き再インストールでは「初期化されない」ので安心してほしい。

カスタマイズ

表示サイズの設定

デフォルトでは全画面表示となるため、これを画面の一部に縮小・変更する方法。

Waydroidが起動している状態で、Waydroid Prop Optionsで設定する。

Ubuntu Shell (Terminal)
$ waydroid prop set persist.waydroid.width 800
$ waydroid prop set persist.waydroid.height 1024
# waydroid-container.service を再起動する
$ systemctl restart waydroid-container.service

デフォルト値(全画面)に戻すには

Ubuntu Shell (Terminal)
$ waydroid prop set persist.waydroid.width ""
$ waydroid prop set persist.waydroid.height ""
$ systemctl restart waydroid-container.service

adbで接続する

20250129-ipaddr.jpg
WaydroidのIPアドレスを表示する

WaydroidのIPアドレスが192.168.240.112の場合、公式Web「Using ADB with Waydroid」にかかれているようにPort=5555に接続し、次のようにadb shell を実行することができる。

Ubuntu Shell (Terminal)
$ adb connect 192.168.240.112:5555
connected to 192.168.240.112:5555

$ adb shell
waydroid:/ $ uname -a
Linux waydroid 6.8.0-51-generic #52~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Dec  9 15:00:52 UTC 2 x86_64

waydroid:/ $ exit
$ adb disconnect
disconnected everything

また、Ubuntu側に用意したapkをインストールする場合は次のように行う。

Ubuntu Shell (Terminal)
$ adb connect 192.168.240.112:5555
connected to 192.168.240.112:5555

$ adb install MiXplorer_v6.65.1_B24053022-arm64.apk 
Performing Streamed Install
Success

$ adb disconnect
disconnected everything

Waydroidのユーザ ディスク領域にホスト側から直接アクセスする

root権限で.local/share/waydroid/data/media/0にアクセスする。

Ubuntu Shell (Terminal)
$ sudo ls -la .local/share/waydroid/data/media/0
合計 56
drwxrwx--- 14  1023  1023 4096  1月 30 12:23 .
drwxrwx---  3  1023  1023 4096  1月 30 12:20 ..
drwx------  2 10144 10144 4096  1月 28 12:08 Alarms
drwxrws--x  5  1023  1023 4096  1月 28 12:07 Android
drwx------  2 10144 10144 4096  1月 28 12:08 Audiobooks
drwx------  2 10144 10144 4096  1月 28 12:08 DCIM
drwx------  2 10144 10144 4096  1月 28 12:08 Documents
drwx------  2 10144 10144 4096  1月 28 12:08 Download
drwx------  3 10144 10144 4096  1月 28 12:08 Movies
drwx------  3 10144 10144 4096  1月 28 12:08 Music
drwx------  2 10144 10144 4096  1月 28 12:08 Notifications
drwx------  3 10144 10144 4096  1月 28 12:08 Pictures
drwx------  2 10144 10144 4096  1月 28 12:08 Podcasts
drwx------  2 10144 10144 4096  1月 28 12:08 Ringtones

また、公式Web「Setting up a shared folder」によれば、ホスト側のディレクトリをWaydroid側にマウントすることもできる。