🤖

WSL2でAOSPをビルドしてAndroid エミュレータを動かす

2022/03/16に公開

ひょんなことからAndroid Open Source Project(AOSP)をビルドしてみる機会があったのですが、ビルド要件に合うLinuxマシンをすぐに用意できませんでした。この記事はありもので試行錯誤してAOSPをビルドしてエミュレータを動かすまでやってみたログです。

結論から言うと、所持していたWindows 11マシンのWSL2でエミュレータを動かすことができました。エミュレータ自体もWindowsではなくLinux上で動かしたのですが、想像以上に動作がサクサクしていて実用に耐えそうだったので記事にしてみました。AOSPのビルドとWSL2の実用性を確かめた謎記事になっています。

AOSPのビルド要件

ビルド要件ですが、ハードウェアとしてはハイスペックなマシンが求められます。

  • ディスク容量: コードのチェックアウト用に250GB以上、ビルド用に追加で150GB
  • メモリ: 16GB以上(64GB以上を推奨)

2021 年 6 月現在、Google 内部では 64 GB の RAM を搭載した 72 コアのマシンを使用しています。この構成でフルビルドにかかる時間は約 40 分です(増分ビルドの場合は、変更されたファイル数にもよりますが、ほぼ数分で完了します)。一方、RAM 容量が同じ 6 コアマシンでは、この作業に 3 時間かかります。

とあるので、AOSPの巨大さが伺えます。OSは Ubuntu LTSが推奨されていますが、適当なLinuxがあればなんとかなりそうです。

筆者は普段Macを使用しているのですが、ゲーム用途でWindowsマシンも所持していたので、それでビルドを試してみました。筆者のマシンは以下です。

  • OS: Windows 11 Proビルド22000.556
  • CPU: Ryzen 5 5600X(6コア、12スレッド)
  • RAM: 64GB
  • SSD: 1TB

CPUにグラフィック機能がないので、一応グラボを搭載してますが、ビルドには関係ないと思っています。物理マシンとして上記を用意しましたが、WSL2でビルドしているので、スペックは上限だと考えてください(実際に割り当てたリソースはもっと小さいです)。

WSL2でUbuntuをセットアップ

WSL 自体のインストールは割愛します。公式のドキュメントあたりを参考にしてください。

Ubuntuのインストール

Windows Terminalで以下のコマンドを打てばインストールできます。

wsl --install -d Ubuntu-18.04

LTSとしては20.04もあるのですが、ビルド環境の構築に書いてあるのが18.04だったので合わせました。多分あまり変わらないと思います。

WSL VMへのリソース割り当て設定

インストールしただけだと、ディスクやメモリなどのリソースをフルで使うことができません。デフォルトではWSL2の仮想ハードディスクは最大256GBに制限されています。ドキュメント(WSL 2 仮想ハード ディスクのサイズを拡張する)に従って仮想ハードディスクを拡張する必要があります。筆者は500GBをWSLに割り当てました。メモリは筆者の環境では32GBが割り当てられていたので、このまま進めてみることにしました。

WSL の詳細設定のドキュメントにはWSL2 VMへのメモリの割り当てに関して、

Windows の合計メモリの 50% または 8 GB のどちらか少ない方。20175 より前のビルドでは、Windows の合計メモリの 80%

と記述があるのですが、筆者の場合50%が割り当てられていました。変更する場合はwslconfigという設定ファイルで設定します。

ビルドに必要なパッケージをインストール

ビルド要件に従い必要なパッケージをインストール

sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Repoをインストール

AOSPのソースコードをクローンしてくるにはRepoが必要です。ASOPのソースコードは膨大な数のGitリポジトリで構成されています。Repoは複数のGitリポジトリを扱いやすくしたGitコマンドのラッパーのようなものです。

インストールはドキュメント通りに試したのですが、うまくいかなかったので、下記コマンドでインストールしました(GPGキーが取得できないようなエラーが出ていたので、WSL環境の問題かもしれません)。

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

KVMの設定

上記のRepoまで設定すれば、ビルドまでは完了できます。ビルド後にエミュレータを動かすために、KVMの設定が必要でした。エミュレータはGUIアプリなのにUbuntu上で動かせるのか疑問に思うかもしれませんが、Windows 11ではWSL2でLinuxのGUIアプリを動かせるようになっています。

Linux用WindowsサブシステムでLinux GUIアプリを実行する

KVMはLinuxでAndroidエミュレータのハードウェアアクセラレーションを効かせるために必要です。ドキュメントに従って、UbuntuにKVMを設定すればいいのですが、筆者の記憶が正しければ Ubuntu をインストールした段階ですでにKVMが有効かされている状態でした。ただ、rootユーザーでしか有効化されてなかったので、実行ユーザーでも使えるようにしました。

実行ユーザーでKVMが使えないとエミュレータ実行時にエラーがでます。そのエラーに従ってkvmグループを作成して、実行ユーザーをグループに追加しておきます。

sudo groupadd -r kvm
sudo gpasswd -a $USER kvm

グループを追加したら/dev/kvmのグループをrootからkvmにすればいいのですが、このままだと再起動するとrootに戻ってしまいます。そこでブート時にパーミッションを変えられるように/etc/wsl.confを編集します。/etc/wsl.confはなかったら作ります。

# /etc/wsl.conf
[boot]
command = /bin/bash -c 'chown root:kvm /dev/kvm && chmod 660 /dev/kvm'

こちらは以下のissueを参考にしました。
https://github.com/microsoft/WSL/issues/7149

AOSPのビルド

Repoでソースコードのチェックアウト

ディレクトリ作成

mkdir aosp
cd aosp

repoの中でgitが動くので、gitの設定をしておく

git config --global user.name Your Name
git config --global user.email you@example.com

リポジトリをチェックアウト

ANDROID_BRANCH="android-11.0.0_r48"
REPO_MANIFEST="https://android.googlesource.com/platform/manifest"
repo init -u $REPO_MANIFEST -b $ANDROID_BRANCH
repo sync -c -j8 # -jnでスレッド数を指定する

上記コマンドではAOSPのリビジョンとしてandroid-11.0.0_r48を指定しています。リビジョンには、manifestのブランチやタグが指定できると思いますが、もってきたリビジョンがビルドできるかどうかは試してみないとわかりません。筆者はドキュメント(ソースコード タグとビルド)を参考にリビジョンを決めました。指定したリビジョンは記事を書いた段階でAndroid 11の最新リビジョンでした。

初回のrepo syncは100GBオーダーのリポジトリを持ってくるのでとても時間がかかります。ソースコードをもってきた後でも、repo initrepo syncで別のリビジョンに切り替えることができます。

ビルド

以下のコマンドでビルドできます。

# 環境の初期化
. build/envsetup.sh

# ビルドターゲットの指定
lunch aosp_x86_64-eng

# ビルド
m -j12

build/envsetup.shを実行することで、後続のlunchコマンドが使えるようになります。lunchコマンドでaosp_x86_64-engのようにターゲットを指定しています。指定できるターゲットはlunchコマンドを引数なしで実行すると確認することができます。ターゲットの命名については、ドキュメントで確認することができます。例えば、aosp_car_x86_64-userdebug のように指定すると車載OS向けのAndroid Automotive OSもビルドできます。

最後のmコマンドでビルドが走ります。mコマンドはaospディレクトリのトップレベルでmakeを実行します(aospディレクトリ内のどこにいてもトップレベルで実行されます)。-jnでスレッド数を指定できます。筆者の環境では、m -j12で150分程度かかりました。Google内部の構成ではフルビルドで40分程度とのことなので、力の差を見せつけられましたね。ハードウェアの構成がものを言うので、自作PCのベンチマークとしてAOSPビルドをするのは面白いんじゃないかと思いました。

エミュレータ実行

ビルドが正常に完了すると、以下のコマンドでエミュレータを実行することができます。

emulator

ビルドターゲットaosp_x86-64-engのエミュレータ
ビルドターゲット aosp_x86-64-eng のエミュレータ
ビルドターゲットaosp_x86-64-engのエミュレータ

ビルドターゲットaosp_car_x86_64-userdebugのエミュレータ
ビルドターゲット aosp_car_x86_64-userdebug のエミュレータ
ビルドターゲットaosp_car_x86_64-userdebugのエミュレータ

WSL2上ですがLinuxのGUIアプリが普通に起動していて感動します。エミュレータ起動時に以下のように、Nested Virtualizationで動かすのはおすすめしないとのメッセージがでますが、簡単に操作してみた感じでは問題なさそうです。

Nested Virtualization

エミュレータの実行環境がKVM on WSL VMという形になっており、VMがネストしているために上記メッセージが表示されていると思います。

さいごに

WindowsマシンでAOSPをビルドして、エミュレータを動かすところまでできました。ただ、実際のAOSP開発をWindowsマシンでやっていけるかどうかはまだわかりません。とりあえず、WSL2およびWindowsがすごく進化していることにとても驚いています。

今後やってみたいこと

  • PCの構成を変えてとにかく速くビルドしたい(Googleに勝ちたい)
  • AOSPのカスタムターゲットを作ってカスタムROMを作ってみたい
  • WSL2上でのAOSP開発が実用に耐えうるか調査したい

Discussion