Waydroidでコンテナ型Android環境を使う

Posted by 雅楽斎 on Sunday, December 17, 2023

TOC

コンテナ型Android環境の一番手に躍り出たWaydroid

一番手というのは個人の感想です。弊blogではかねてからPC上でAndroidを共存させることに折りを見て挑戦しており、Linux上でAndroid環境を動かすAnboxやAndroidを動かすChromiumOSのフォークであるFYDEOSを取り上げてきました。

Androidの互換ソフトウェアAnboxをUbuntu 20.04で試す(楽になってた)

【Telegramアカウント必須】Androidアプリが動くFydeOSを触ってみたいからVMware Playerで動かしてみた記録(VirtualBoxでの失敗記録も)

これらを書いた当時はどちらも発展途上感があり、その当時としてのAndroid環境にある程度追従できている感触はありました。(FYDEOSは現在もアップデートされています)

ところが、時が流れるとAndroidはバージョンが上がり、Anboxは開発が終了し、Androidの環境としては次々リリースされる新バージョンへの移行に伴いアプリは古いバージョンのサポートを順次終了していきます。かつてのAndroid環境をそのまま使い続けることは難しい状況が発生します。

Waydroidの利点と欠点

Waydroidは執筆時点で活動が活発で、LXCコンテナで動かすAndroid環境で、Anboxに近い使い勝手で以下の利点があります。

  • Android用のVMにRAM・HDD/SSDを準備する必要がなく、ホストと共有できるので無駄がない
  • VMと違ってマシン全体のエミュレーションをしない分は動作が軽くなることが期待できる
  • 執筆時点の動作確認では音声は流れるし動画も再生できる(HWアクセラレーションが効いているかどうかは不明)
  • ウィンドウの拡大・縮小ができる(BlueStacksのようにアスペクト比を維持しての拡大・縮小ではない)

また、欠点もたくさんあります。

  • Wayland上でしか動かない
  • コンテナ型なのに同時実行できる環境が一つしかなく、複数のAndroidイメージを切り替えて使うのが非常にしんどいのでテストには向かない
  • 動作が不安定(よくわからないタイミングで止まる)
  • Google Playを入れないとアプリ整備の面で結構厳しい(本記事はGoogle Playを入れる前提で進めます)
  • Google Playの認証が数分では終わらない
  • Waydroid自体はCPUのエミュレーションをしないため、amd64上で実行する場合はARM用のAndroidアプリは実行できない(ARMのPC上でWaydroidを使う場合はこの欠点は存在しません。x86でlibhoudiniによるARMエミュレーションを使うことでARM用のAndroidアプリを実行することはできますが、試せていません)
  • Blink系のブラウザで枠しか表示されない(後述)
  • テキスト入力がしんどい(後述)

対応CPU命令による対応Androidアーキテクチャ

Waylandはx86系とARM系のLinuxで動きますが、対応するCPU命令によって実行できるAndroidアーキテクチャが決まります。これはAndroidの仕様です。

Android ABI | Android NDK | Android Developers

  • x86
    • x86(IA-32)
    • MMX
    • SSE/2/3
    • SSSE3
  • x86_64
    • x86-64
    • MMX
    • SSE/2/3
    • SSSE3
    • SSE4.1、4.2
    • POPCNT

SSSE3はCore 2 Duoで追加されたのでCore Duo以前のCPUではWaydroidは実行できず、SSE4.2はCore iで追加されたため、x86_64のAndroidイメージを利用できるCPUは第1世代Core i以降となります。(POPCNTはSSE4.2に含まれる模様)

ARMの場合は今の所AArch64は全てarm64-v8aです。

今回は第7世代CoreのUbuntu 23.10 GNOME amd64で確認しています。

UbuntuでのWaylandについて

私が日常的に使っているUbuntuでのWayland状況についてざっくりまとめます。

  • Ubuntu Desktop
    • 17.10でデフォルトに、18.04でXOrgにデフォルトが戻る
    • 21.04で再びデフォルトに
  • Ubuntu MATE
    • MATEがWaylandをデフォルトディスプレイサーバーとして使用不可(Roadmap | MATEwiki)

ということで、今の所Ubuntu MATEはWaylandでデスクトップ環境を起動することはできません。代替策としてWaylandコンポジタであるWestonを実行して、その上でWaylandを使うこともできるのですが、Wayland対応プログラムは画面をWestonに飛ばすようになってしまって使い勝手がすこぶる悪いので諦めました。

現在のデスクトップ環境がWaylandかどうか確認

$ echo $XDG_SESSION_TYPE

XOrgの場合はX11、Waylandの場合はWaylandと表示されます。

Waylandの起動

パッケージのインストール

本稿の執筆時点で対応できるUbuntu/Debianのバージョンは

  • mantic (23.10)
  • focal (20.04)
  • jammy (22.04)
  • kinetic (22.10)
  • lunar (23.04)
  • bookworm (12)
  • bullseye (11)
  • trixie (13)
  • sid

です。今回は23.10にインストールする方向でmanticを指定します。一旦環境変数DISTROにインストールするディストロのバージョンを格納しています。

# apt-get install curl ca-certificates
# export DISTRO="mantic"
# curl --proto '=https' --tlsv1.2 -Sf https://repo.waydro.id/waydroid.gpg --output /usr/share/keyrings/waydroid.gpg && \
echo "deb [signed-by=/usr/share/keyrings/waydroid.gpg] https://repo.waydro.id/ $DISTRO main" > ~/waydroid.list && \
mv ~/waydroid.list /etc/apt/sources.list.d/waydroid.list && \
apt-get update
# apt-get install waydroid

パッケージのインストール時に

ERROR: WayDroid is not initialized, run "waydroid init"
Created symlink /etc/systemd/system/multi-user.target.wants/waydroid-container.service → /lib/systemd/system/waydroid-container.service.

と出力されますが問題ありません。そのまま初回起動をするとイメージがGoogle Playなしになるので、よく確認することを推奨します。

使うイメージについて(重要)

Waydroidはsystem.imgvendor.imgが必要ですが、それぞれ種類があります。特にsystem.imgはGoogle Playを使うかどうかで変わるので重要です。

system.img

VANILLAとGAPPSがあり、VANILLAはLineageOSそのまま、GAPPSはGoogle Play統合版です。

普段Androidを使っている人はGoogleアカウントを流用して使うこともできますが私個人は中華端末用の個人情報を何も入れていないGoogleアカウントで使う前提でGAPPSを選びました。但し、GAPPSは認証を終わらせるまでずーっとデバイスが認証されていないエラーメッセージが出続けるので、それはそれで面倒です。

やることが結構あるので、最初は作った環境を捨てる前提でVANILLAのままで使うのも手です。

vendor.img

MAINLINEとHALIUMがありますが、HALIUM自体がよくわからないのでMAINLINEで良いと思います。

手動ダウンロードのすすめ

ダウンロードするイメージを決めたところで、waydoid initコマンドの実行でダウンロードできますが、これでダウンロードすると700MBのファイルをダウンロードして、なおかつエラーになると最初からやり直しになるので、個人的には手動でダウンロードしてコマンド実行時に引数でイメージを指定する方法をおすすめします。

ダウンロードするファイル

ダウンロードする2つのイメージファイルは

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

からvendorとsystemそれぞれアーキテクチャを選び、該当するファイルをダウンロードします。執筆時点の最新のファイルを選ぶのが良いと思います。毎週新しいイメージが公開されます。

x86_64でGAPPSならsystem.imgは

https://sourceforge.net/projects/waydroid/files/images/system/lineage/waydroid_x86_64/lineage-18.1-20231216-GAPPS-waydroid_x86_64-system.zip

vendor.imgは

https://sourceforge.net/projects/waydroid/files/images/vendor/waydroid_x86_64/lineage-18.1-20231216-MAINLINE-waydroid_x86_64-vendor.zip

をダウンロードし、/etc/waydroid-extra/imagesを作成してzipを解凍して格納します。この操作はrootで行う必要があります。waydoroid init -f-fを指定することで/etc/waydroid-extra/imagesを参照するようになります。

# mkdir -p /etc/waydroid-extra/images
# mv system.img vendor.img /etc/waydroid-extra/images/
# waydroid init -f

他方、手動ダウンロードをしない場合は引数なしのwaydroid initでイメージのダウンロードを含めた初期処理が行われます。

この場合の終了時のディレクトリ構成は以下の通りです。

/var/lib/waydroid
├── cache_http
├── host-permissions
├── images
│   ├── system.img
│   └── vendor.img
├── lxc
│   └── waydroid
│       ├── config
│       ├── config_nodes
│       ├── config_session
│       └── waydroid.seccomp
├── overlay
│   └── vendor
├── overlay_rw
│   ├── system
│   └── vendor
├── rootfs
├── waydroid.cfg
├── waydroid.log
└── waydroid_base.prop

初回起動

Waydroidの起動は一般ユーザーで行います。スタートメニューにWaydroidが登録されるので、これをクリックして実行するのが面倒がなくて良いでしょう。画面ではAndroidアプリが展開されてしまっていますが、最初はWaydroidアイコンしかありません。

画面全体にLineageOSのブートアニメーションが表示され、初期設定が行われます。

Play Storeのアイコンが配置された状態ですが、Google Playにはつながっていないため上に通知され続けます。

面倒なので、とにかく抜けたいところです。ちなみに、設定から現在の状況を確認できます。Android11です。テーマをダークにすると各アプリに反映されるので、この先はダークテーマの画像となります。

画面全体を専有されてもメリットが特にないので、各Androidアプリをそれぞれのウィンドウモードで起動するためにLXCコンテナが起動している状態で以下のコマンドを実行します。

$ waydroid prop set persist.waydroid.multi_windows true

rootユーザー(またはsudo経由)でLXCコンテナを再起動します。

# systemctl restart waydroid-container

以降はメニューに登録されているアイコンのクリックやwaydroid app launchでのアプリ起動時にウィンドウモードで起動するようになります。

Google Playの登録

Waydroidの持っているAndroidのIDのような物をGoogleに登録して、WaydroidでGoogle Playを使えるようにします。

root権限でwaydroid shellを実行して、シェルの中でコマンドを実行します。

# 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|3959095632023xxxxxx

android_id|の右に表示された数字列をGoogleのサイトで登録します。Googleアカウントが必要です。

Register

「Google Services Framework Android ID」に数字列を入力し、CAPTCHAを突破してRegisterボタンを押すとGoogle側に登録されるので、反映するのを待ちますが、これがすぐには反映されないので別の作業をしましょう(私はチェックするのが面倒なので翌日続きをやりました)

Google側の登録が反映されるとGoogle Playのアプリ起動でGoogleアカウントログインの画面が表示されます。

Googleアカウントでログインすると紐付けられている電話番号にSMSが届くので入力します。

ログインするとGoogle Playからアプリをダウンロードできるようになります。

外部Androidアプリのインストール

Google Playからアプリをインストールするのが一番手っ取り早いのですが、Google Playなしでも環境を整えられないと片手落ち感があるので、最低限のことはできるようにします。

また、Waydroidはx86_64で実行する場合はARMのアプリは使えないので、多少Google Playとは使えるアプリが異なることも外部Androidアプリを使う理由でもあります。

Waydroidでのapkファイルのインストールは

$ waydroid app install apkファイル名

でできます。

F-Droid

https://f-droid.org/

まずはサードパーティーアプリストアとしてオープンソースのものだけが収録されるF-Droidをインストールします。

https://f-droid.org/F-Droid.apk をダウンロードして

$ waydroid app install F-Droid.apk

の様にインストールします。

Material Files

https://f-droid.org/en/packages/me.zhanghai.android.files/

オープンソースのファイルマネージャはかなり少ないですが、

  • FTPクライアント
  • FTPサーバー
  • メンテナンスが続いている

という特徴があるので、最近インストールして使っています。(正直なところ、機能は有料のものより少ないです)

Fcitx5 for Android + Anthy Plugin

https://f-droid.org/en/packages/org.fcitx.fcitx5.android/

https://f-droid.org/en/packages/org.fcitx.fcitx5.android.plugin.anthy/

Waydroidの場合はキーボードによる入力が前提と考えられるので、漢字変換を含めてAndroid上の日本語入力アプリとは違う使い勝手になるものです。

で、Fcitx5をAndroidに移植したアプリがあります。これ単体では英語、中国語の入力ができますが、ベトナム語、日本語、韓国語、シンハラ語はプラグインを追加することで入力可能になり、日本語の場合はAnthy Pluginを使うことで入力可能になります。

但し、Waydroid上でのテキスト入力自体がちょっと苦しいところがあります(後述)

Cromite(現状Waydroidでは使い物にならない)

GitHub - uazo/cromite: Cromite a Bromite fork with ad blocking and privacy enhancements; take back your browser!

ブラウザもオープンソースのものは少ないのが現状です。BlinkとGecko系列のAndroid用ブラウザがまとまっているサイトがあります。

https://divestos.org/pages/browsers

ただ、この中でARM用しかなかったり、メンテが途絶えているものを除くと現状ではCromiteが一番良いのではないかと思います。CromiteはF-Droidからはダウンロードできないので、Githubのリリースページからダウンロードしてインストールします。

https://github.com/uazo/cromite/releases

但し、Blinkのブラウザは結局のところ抜けてしまうのでWaydroidでは使い物にならないのが現状です。ブラウジングはWaydroidの中でやらず、Linux上でやるのが良いでしょう(後述)

ホストとWaydroidの間でのファイルのやりとり

Waydroidとホストの間でファイルをやり取りする方法はWaydroidのサイトに記載がありますが、やってみたところownerが合わずに使えなかったので、Material Filesを使ってFTPでやり取りするのが確実という結論になりました。ファイル自体は~/.local/share/waydroid/dataにあります。

Waydroid→外部(FTPサーバー)

Material FilesのFTPクライアント機能を使用します。

Material Filesを起動したら左上の≡から「Add storage…」「FTP server」をタップしてFTPサーバーを追加します。

諸々入力し終わると登録したFTPサーバーにアクセスできるようになります。

ホスト→Waydroid

Material Filesの≡から下の方にある「FTP sever」で諸々を設定すると、ホストからFilezillaなどでアクセスできるようになります。

Blinkレンダリングブラウザの動作について

Cromiteの項に書きましたが、執筆時点のWaydroidはBlinkレンダリングエンジンのブラウザが実質使い物になりません(BraveとCromiteで確認しました)

具体的には、画面上に表示されるタブの一覧とレンダリング部分が透けて表示されます。

但し、レンダリング部分は表示が真っ黒なだけでタブ一覧画面を出すと縮小して表示されるため、Waydroidの描画の仕方がSkiaとあってないんじゃないかなという感触を受けます。バグとして上がっているので対応を待ちたいところです。

[BUG] Chromium based browsers black screen issue · Issue #1151 · waydroid/waydroid · GitHub

テキスト入力の苦行

Waydroidのアプリ上で文字入力をすると、画面下全体にキーボードが表示され、アプリ内の描画も何故か上にずれるので非常にやりにくいです。画面下にキーボードが表示されるのは良いにしても、Waydroidの描画が上にずれてはみ出して見づらくなるのは意味がよくわからないのでなんとかならないかなぁと思っています(Fcitx5の挙動の可能性はあります)

ということで、色々難点はあるのは間違いないですが難点が解決されれば使い勝手も向上するので、いい方向に向かっていってほしいところです。

スポンサーリンク


comments powered by Disqus