2019年2月11日月曜日

EC2上でカスタムROMのビルド(Pixel3 XL/crosshatch)

さて crosshatch(Pixel 3 XL) に Factory Image を焼くことができたので、今度はAOSPのソースをビルドしてROMを作りたいと思います。
JCROMの経験でビルド中はメモリもCPUもディスクアクセスもめっちゃ必要なことがわかっているので今回はクラウドでビルドてみます。
Google Compute Engine、、も考えたのですが、慣れている AWS EC2 を使うことにしました。
今回もやっぱり備忘メモです。(2回試行した両方の情報を残しておきます)


EC2インスタンスの作成


AOSPの Requirements によると 250GB + 150GB = 400GB 必要とのことで、EBSに 400GB 置きっぱなしになることを考えて少しでも安いリージョンを使いたいと思います。今回はオレゴン(us-west-2)にしました。汎用SSD(gp2) 0.10USD/1GB/月 なので、400GBで $40、1$=¥110 だと 4,400円くらいになると思います(間違ってたら教えてください…!)。
ただ実際にはAOSPのビルドをしただけでは 200GBくらいしか使わなかったので、2回目の試行時は 250GiB のEBSを使うようにしています。足りなくなったら後で大きくすればいいので。

インスタンス作成に用いるマシンイメージ(AMI)は
Ubuntu Server 18.04 LTS (HVM), SSD Volume Type(x86) でも
Ubuntu Server 16.04 LTS (HVM), SSD Volume Type(x86) でも大丈夫です。
インスタンスタイプはビルド時は高火力でドカンと行きたいのですが、最初のビルド環境の準備のときは少しでも節約するためにとりあえず t3.micro にしておきます(t3.nano だとさすがに貧弱すぎて repo sync がメモリ不足でエラーします)。
ストレージは先述の通り汎用SSD(gp2) 250GiB としました。


ビルド環境構築


基本的に Establishing a Build Environment の通りです。

最初に OpenJDK のインストールをして
sudo apt-get update
sudo apt-get install openjdk-8-jdk
必要なパッケージをごっそりインストールします。
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

ただしこれだけでは使える Pythonが入らないので別途インストールする必要があります。awscli も入れたいので pip ごとインストールすることにしました。
sudo apt-get install python-pip
pip install awscli

AWS CLI は後で使うときのために設定しておきます。
aws configure
⇒ AWS Access Key、AWS Secret Access Key、リージョン(オレゴンは us-west-2)、出力フォーマット(なんでもいいので text)を入力

一度再起動しておきます。


ソースのダウンロードと準備


Downloading the SourcePreparing to Build に沿って準備していきます。
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
sha256sum ~/bin/repo
SHA-256チェックサムが source.android.com に書かれているものと同じことを確認して
chmod a+x ~/bin/repo
Ubuntu 18.04 の場合は ssh しなおすか .profile を読み込み直せば ~/bin にパスが通ると思います(16.04 はディレクトリの有無に関わらずパスが通されてた気がする)。

適当な作業用ディレクトリ(ここでは ~/source )を作って
mkdir source ; cd source

ダウンロードの準備(Source code tags and builds から Pixel 3 XL用の PQ2A.190205.001 としてタグ付けされた android-9.0.0_r31を選択しました)
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r31

ソースをダウンロードします(環境によると思いますが1時間半〜2時間くらいかかります)。
t3.micro でも Cannot allocate memory することがあるので、そのときは単純にもう一度(エラーが出なくなるまで何度でも)実行します。最初からもっと大きいインスタンスを使うという富豪的解決もよいでしょう。
repo sync

Obtain proprietary binaries の手順も進めておきます。
今回は Pixel 3 XL に PQ2A.190205.001 を焼くのでここにあるふたつの Link から
google_devices-crosshatch-pq2a.190205.001-2f5f6be6.tgz と
qcom-crosshatch-pq2a.190205.001-d12b88fb.tgz を
wget して sha256sum でハッシュを確認、問題なければ tar xzf で展開します。
展開してできた extract-*.sh を source ディレクトリの中で実行してライセンスを承諾すると
vendor/google_devices/crosshatch/ と
vendor/qcom/crosshatch/ が展開されます。


ビルド


一度 EC2インスタンスを停止して、インスタンスタイプを m5a.2xlarge(vCPU 8、メモリ 32GiB)(オレゴンで 0.344USD/時間)まで引き上げて起動(開始)しなおします。
m5a.12xlarge まで上げればEBS帯域も大きくなってコスパがよくなるのかなとも思いつつ、、
230円/時間は感覚的に高く思えて m5a.2xlarge(40円弱/時間)で妥協ってます。

環境セットアップをして、
. build/envsetup.sh

crosshatch用 aosp_crosshatch の userdebug(デバッグ用環境)をビルドするターゲットとして設定して、
lunch aosp_crosshatch-userdebug

いざ8スレッドでビルドを回します。
make -j8

m5a.2xlarge でビルド完了までに3時間40分かかりました。

#### build completed successfully (03:41:30 (hh:mm:ss)) ####


イメージの回収と端末への書き込み


ビルドが無事成功したら ~/source/out/target/product/crosshatch/ にROMイメージが出力されます。
これを scp でローカルマシンに回収すればよいのですが、ファイルのダウンロードに時間がかかるので、S3を経由することにしました。

少しでも近いところのほうが速そうなので東京リージョンにバケットを作ります。オレゴンの EC2 から東京の S3 にファイルを送るのに 0.02USD/GB かかりますが、そのかわり爆速です。
(AOSP素の状態なら2GBのROMイメージで、S3転送5円とかなので、この速さのためなら払っていいかなって思える…EC2動かしておくより安いし)

*.img のほかに android-info.txt も必要なのでまとめて S3 に送ります。
cd ~/source/out/target/product/crosshatch
aws s3 sync . s3://bucketname/ --exclude "*" --include "*.img" --exclude "*/*" --include android-info.txt

S3に送ったファイルは S3 Management Console からダウンロードすることもできますが、手元のパソコンでも AWS CLI を動かすとカンタンです。後で fastboot flashall するときに必要になるので ANDROID_PRODUCT_OUT も用意しておきます。
setenv ANDROID_PRODUCT_OUT /path/to/temporary
aws s3 sync s3://bucketname/ $ANDROID_PRODUCT_OUT
(bashの場合は export ANDROID_PRODUCT_OUT=/path/to/temporary になると思います。いずれの場合も事前に aws configure で AWS CLI の設定をしておく必要があります)

先述の通り ANDROID_PRODUCT_OUT変数を用意してあれば fastboot で一発で書き込めます。端末の準備等は前回の記事を参照してください。
fastboot flashall -w

ちなみに fastboot flashall が書き込むイメージの一覧はこのあたりにあります。


AOSP Pieの素焼き


忘れないように


ビルドが終わってS3へのイメージ転送が終わったらなるはやで EC2 を停止しましょう。
m5a.2xlarge を停止し忘れて丸一日放置すると1,000円の無駄遣いになっちゃいます。
気になるようなら S3 に置いたROMイメージも消しちゃってよいかも。


続きは国試(2/17)が終わってから!覚えてたら!てゆーかやる気が残ってたら。

0 件のコメント:

コメントを投稿