WSLでAndroidをビルドする話

タイトル通り、Windows Subsystem for Linux (WSL) で Android OS をビルドします。

tl;dr

2018年3月の時点ではWSLでAndroidをビルドするのはやめておけとしか言いようがない。Windowsマシンしか無いならVMを立てたほうが速い。

やってみてしまった人の末路

Ubuntu のインストール

適当にMicrosoft Storeを開いて ubuntu とか検索するとなんかWSLの特設ページ行きのバナーが出るので、そこから入れるのが安心だと思います。

あとは指示に従ってユーザを生やしたりパスワードを設定したりしてください。

必要なパッケージの取得

LineageOS 15.1 のビルド方法 | dev:mordiford を参照のこと。

付録

めんどい人向け。

curl -sL https://raw.githubusercontent.com/lindwurm/Scripts/master/setupAndroidBuildEnv.sh | bash -
  • git config --global user.name "android" および git config --global user.email "android" が含まれるので、WSL環境を普通に使うつもりがあるなら面倒臭がらないほうが良い。

ソースコードの取得

AICPの場合。

mkdir aicp && cd aicp
repo init -u https://github.com/AICP/platform_manifest.git -b o8.1
8/12更新: 以下は現在では不要(クリックして展開)
mkdir -p .repo/local_manifests && nano .repo/local_manifests/wsl.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <!-- for wsl -->
  <remove-project name="platform/prebuilts/misc" />
  <project name="Uldiniad/android_prebuilts_misc" path="prebuilts/misc" />

  <remove-project name="LineageOS/android_prebuilts_build-tools" />
  <project name="Uldiniad/android_prebuilts_build-tools" path="prebuilts/build-tools" />

  <remove-project name="AICP/build" />
  <project path="build/make" name="mordiford/build" groups="pdk" remote="github" revision="o8.1_wsl" >
    <copyfile src="core/root.mk" dest="Makefile" />
    <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
    <linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
    <linkfile src="core" dest="build/core" />
    <linkfile src="envsetup.sh" dest="build/envsetup.sh" />
    <linkfile src="target" dest="build/target" />
    <linkfile src="tools" dest="build/tools" />
  </project>

</manifest>

あとdeviceの分もお忘れなく。

repo sync -j16 -c -f --force-sync --no-clone-bundle

注意

上ではもう mordiford/build にパッチ当ててあるのでそっちに入れ替えているけど、LineageOSやその派生には https://review.lineageos.org/#/c/208102/ を当てる必要があります。LineageOSなら repopick 208102 で当たるし、派生は右上の [Download▼] からパッチを入手して当てるとよいです。

2018/07/28くらいに一連のパッチがmergeされたのでLinuxでの手順と差異がなくなりました。

ビルド

. build/envsetup.sh
breakfast <device> && mka bacon WITH_DEXPREOPT=false

結果

すごい!WSL上でビルドが通る!!というのもそうだけど、寝てる間に走らせといたら 9時間かかった

i7-2700K / 16GB(DDR3) / 500GB SSD みたいなよくある一昔前の構成とはいえ、それでもだいたい直接Ubuntuぶち込んでビルドするときの2-3倍近くはかかる感じ。

どうしてそんなに遅くなるのかについてとか、実際WSLがどういう用途なら適してるのか、みたいな細かい話はsatさんの WSL vs VM for 開発作業 がその通りだなあという感じなので読んでみると良いと思います。

ネイティブ環境やVM上のLinux環境には敵わないとはいえ、WSLでも一応ビルドが可能になったというのは大変意義深いですね、という話でした。

参考資料