AWS CodebuildでAndroid OSのビルドを試す機会がありましたので、ナレッジを紹介します。本記事を読むことで下記が分かります。ご参考にしていただければ幸いです。
- Codebuildにおける、ビルド環境のメモリとストレージの拡張方法
⇒ただし、Android OSのビルドに関しては、本記事のリソース拡張の方法では失敗することが判明 - ビルド仕様のファイル(buildspec.yaml) 内で、以前のコマンドに依存するコマンドを実行する方法
Android OSとは
Android OSは、モバイルデバイス向けのオープンソースのOSであり、Googleが主導するプロジェクトです。ソースは下記からダウンロードできます。
ちなみにオープンソースにした理由としては、特定のプレーヤーが独占して他の誰かのイノベーションを阻害することがないように、誰もがメリットを享受できるようにとの理念があるそうです。
Android OSのビルド要件
下記の通りです。
- 64 ビット環境のUbuntu Long Term Support(LTS) ※
- ストレージ400GB以上
- 16 GB 以上の使用可能な RAM(64 GB を推奨)
※Googleでは、Ubuntuで開発とテストが行われているので、ビルドにはUbuntuを使うのが無難。
Codebuildのスペック
2024/1現在、東京リージョンのCodebuildで用意されているUbuntu、環境タイプ値:LINUX_CONTAINERのタイプとその費用は下記の通りです。
コンピューティングタイプ | 環境タイプ値 | メモリ | vCPU | ディスク容量 | 費用/1分あたり※ |
---|---|---|---|---|---|
Linux Small | LINUX_CONTAINER |
3 GB | 2 | 64 GB | 0.005USD (0.75円) |
Linux Medium | LINUX_CONTAINER |
7 GB | 4 | 128 GB | 0.01USD (1.5円) |
Linux Large | LINUX_CONTAINER |
15 GB | 8 | 128 GB | 0.02USD (3円) |
Linux 2xlarge | LINUX_CONTAINER |
145 GB | 72 | 824 GB (SSD) | 0.25USD (37.5円) |
※1USD=150円換算
参照URL:
ビルド要件との比較
Android OSのビルド要件と、Codebuildが用意するコンピューティングマシンの比較は下記の通りです。
項目 | 要件 | Linux Large | Linux 2xlarge |
---|---|---|---|
メモリ | 16GB | 15GB | 145GB |
ストレージ | 400GB以上 | 128GB | 824GB |
コア数 | ー | 8コア | 72コア |
費用単価(分) | ー | 3円 | 37.5円 |
ビルド時間/回 | ー | ? | ? |
ビルド費用/回 | ー | ? | ? |
公式によるとメモリが64GBの場合、72コアでビルド40分、6コアで3時間を要しています。
要件を満たすコンピューティングタイプはLinux 2xlargeのみですが、単価が次点のLinux Large の10倍以上あります。ビルド時間が1/10になってくれればよいのですが、実際に試してみないとわかりません。
今回は費用面の理由によりLinux Largeを選択し、要件を満たしていない点に関しては、後述のリソース拡張方法で乗り切ることにしました。
Codebuildプロジェクトの作成
ストレージの不足:Amazon EFS のマウントで対処
不足するストレージについては、Codebuildに Amazon EFS をマウントさせることで対処します。ここでEFSをマウントする理由は2つあります。
- 前述の通り、ビルド要件から不足しているストレージ分を補うため
- Android ソースツリーを事前にダウンロードしたEFSをマウントさせることで、ダウンロード時間をスキップするため
EFSのマウント方法は公式手順をご確認ください。
メモリの不足:SWAPの設定で対処
ビルド仕様のファイル(buildspec.yaml)にて、SWAPの設定を追加します。ここでは16GBを追加しています。
補足:buildspec.yamlで、以前のコマンドに依存するコマンドを実行する方法
buildspec.yamlの記載に際し、一つ補足があります。
Android OSのビルドに際し、公式手順では、ダウンロードしたソースツリーにある環境設定のスクリプトを実行することで、ビルドに必要な lunchやmコマンドを実行できるようになります。
$ . build/envsetup.sh #後続のlunchやmコマンドが実行できるようになる $ lunch product_name-build_variant #ビルドターゲットproduct_name-build_variantを指定 $ m #ビルド開始
公式手順:Android のビルド | Android オープンソース プロジェクト | Android Open Source Project
下記のようにbuildspec.yamlを記載すると、lunchやmコマンド実行時に”command not found”と怒られ、ビルドが失敗することになります。
正しくは、commandsフェーズで– |と指定し、YAMLのリテラルブロック構文を使用する必要があります。
公式のドキュメントを見たところ、ビルド仕様バージョン 0.1 では以前のコマンド (ディレクトリの変更や環境変数の設定など) の状態に依存する単一のコマンドを実行することはできないとのこと。
今回は、上記の通りビルド仕様バージョン 0.2を指定しましたが、以前のコマンドに依存するlunchやmコマンドは実行できず、ビルドが失敗しましたので、上記YAML構文を利用して回避しました。
結果
Codebuild上で、上記のようにリソースを拡張したコンピューティングタイプでは、ビルドが一向に進まずに失敗する形となりました。SWAPを設定しない場合は、メモリ不足で失敗するまでは途中までビルドは順調に進みました。
SWAPの利用によりビルドが進まなかったと考えていますが、原因究明中となります.. ひとまず高額ですがビルド要件を満たすコンピューティングタイプ “Linux 2xlarge”を素直に選んだほうがよさそうです。実際に試したかったのですが、費用的観点から別の機会で考えています。
項目 | 要件 | Linux Large | Linux 2xlarge |
---|---|---|---|
メモリ | 16GB | 15GB | 145GB |
ストレージ | 400GB以上 | 128GB | 824GB |
コア数 | ー | 8コア | 72コア |
費用単価(分) | ー | 3円 | 37.5円 |
ビルド時間/回 | ー | 8時間(タイムアウトでビルド終了) | ? |
ビルド費用/回 | ー | 1,440円 | ? |
終わりに
Android OSのビルドに際し、Codebuildで利用できるコンピューティングタイプのメモリについて、15 GBの上位が145 GBと開きがあり、ちょうど良いスペックのものがありませんでした。
加えて、2023年11月にCodebuildで AWS Lambdaによるサポート開始が発表されました。AWS Lambda はほぼ瞬時に起動するため、より高速なビルドが可能とうたっています。
ただし、AWS Lambdaのメモリが最大10GBであり、Android OSのビルド要件である16GB(推奨64GB)を満たしていません。
そのため、高額であることを承知した上でCodebuildのEC2のオーバースペックのものを利用するか、Codebuildを使わず、要件を満たすEC2を利用してビルドする方法が望ましいと考えます。