mythfinder

🐎

Linux / Waydroid でAndroid 11を動かし、ウマ娘をプレイする

(2023/01/04 更新)Waydroid公式のイメージがLineageOS 18 / Android 11系に更新されたため、以下の内容のうち1. イメージ作成については不要となった。

できること

Linuxでウマ娘
Linuxでウマ娘

背景

知られている通り、AndroidカーネルはほぼLinuxそのものである。これを逆手に取り、LinuxカーネルでAndroidを動かそうと試みた賢い人々がおり、結果として以下のような形に結実した。

GitHub - waydroid/waydroid: Waydroid uses a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. Waydroid uses a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. - waydroid/waydroid github.com
GitHub - waydroid/waydroid: Waydroid uses a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu.

これまでも単なるAndroidエミュレータなら無数にあったが、Waydroidはエミュレーションという手法を慎重に避ける。代わりにlxcで立てたコンテナ内でAndroidを動かすアプローチを取っており、これに伴って以下のメリットがある。

さて、単にWaydroidを動作させるだけなら公式の手順を踏めばよいが、ここでは公式イメージ(LineageOS 17 / Android 10)ではなく開発版イメージ(LineageOS 18 / Android 11)を導入する手順を書く。なぜならウマ娘の動作にはAndroid 11のイメージが必要だから(後述)。

手順

実験環境

keyval
OSArch Linux
CPUIntel Core i7-11700K
RAM32GB
GPUAMD RX6600XT
Kernel5.19.6-zen1-1-zen
Waydroidv1.3.0

通常のAOSPのビルド環境、およびWaydroid本体(イメージを除く)の導入は済んでいるものとする。

要求環境

1. イメージ作成

親切なことにビルド手順についても公式ドキュメントが整備されているが、2022年9月時点ではLineageOS 17 / Android 10向けとなっているため、該当部分を修正している。

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

通常のAndroid(AOSP)のビルド環境に加えて、meson, simg2img等が必要になる。

# Arch Linux
sudo pacman -S --needed meson android-tools

# Ubuntu (20.04-)
sudo apt install meson android-sdk-libsparse-utils

(このほかにも依存関係があるかもしれないので、ビルドがコケたら適宜インストールする)

初期化・マニフェスト取得

mkdir lineage && cd lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-18.1 --depth 1
repo sync build/make
wget -O - https://raw.githubusercontent.com/waydroid/android_vendor_waydroid/lineage-18.1/manifest_scripts/generate-manifest.sh | bash

ソースの同期

オプションで並列実行を指定しているが、それでも信じられないほど時間がかかる。途中で失敗した場合は再実行する。

repo sync -c --no-tags -j$(nproc)

ビルド設定

lunchの引数は使っている CPU アーキテクチャに合わせる。

. ./build/envsetup.sh
lunch lineage_waydroid_x86_64-userdebug

ビルド実行

メモリが不足する場合コア数を調整する。

make systemimage -j$(nproc)
make vendorimage -j$(nproc)

イメージ形式の変換

simg2img out/target/product/waydroid_x86_64/system.img /your/target/path/system.img
simg2img out/target/product/waydroid_x86_64/vendor.img /your/target/path/vendor.img

できたイメージを適切な場所(たいていは/usr/share/waydroid-extra/images以下?)に移す。

コンテナ設定

# /etc/gbinder.d/anbox.conf

[General]
ApiLevel = 30

新しいバージョンではAndroid内部の変数を読んでくれるようなので不要かもしれない。

初期化

ここでいったん Waydroid 環境を初期化しておく。

sudo systemctl start waydroid-container.service
sudo waydroid init

2. GAPPS / ARM対応

どちらかというと以下が本題である。

ここまでの作業でx86_64のAndroidイメージが起動できるようになったが、まだプレイストアは使えない。さらに、ウマ娘はじめたいていの娯楽アプリはARM向けにしか作られていないため、このままでは動作しない。そこでOpenGAPPSとlibhoudiniを導入する。ざっくりいうと:

導入にあたっては以下のスクリプトが助けになる。

GitHub - casualsnek/waydroid_script: Python Script to add OpenGapps, Magisk, libhoudini translation library and libndk translation library to waydroid ! Python Script to add OpenGapps, Magisk, libhoudini translation library and libndk translation library to waydroid ! - casualsnek/waydroid_script github.com
GitHub - casualsnek/waydroid_script: Python Script to  add OpenGapps, Magisk, libhoudini translation library and libndk translation library to waydroid !

ここからは踏み込んだ説明は避けるが、READMEを参考に

  1. OpenGAPPSを導入
  2. libhoudiniを導入
  3. Android IDを取得し、Google のページで登録

する手続きで、Play StoreとARM向けアプリが動作するようになる。うまくいった結果が冒頭の画像である。

なお、冒頭の画像のうち、ターミナルの右半分はGPUの使用状況、画面最上部のバーの桃色部分はCPU使用率をそれぞれ示している。CPU使用率はごく低く、GPUもハードウェアアクセラレーションが効いているのが確認できる。

結論

本当にすごい時代になった。が、ウマ娘をプレイしていないので個人的な利益はとくにない。

補遺

ここまで書くと万能のようだが、動かないアプリも一定数ある。たとえばClash Royale、プリコネ RDなどは手元で動作しなかった。

原因として考えられること: