AWS Codebuild を用いた Android OS のビルドの検討

AWS CodebuildでAndroid OSのビルドを試す機会がありましたので、ナレッジを紹介します。本記事を読むことで下記が分かります。ご参考にしていただければ幸いです。

  • Codebuildにおける、ビルド環境のメモリとストレージの拡張方法
    ⇒ただし、Android OSのビルドに関しては、本記事のリソース拡張の方法では失敗することが判明
  • ビルド仕様のファイル(buildspec.yaml) 内で、以前のコマンドに依存するコマンドを実行する方法
本記事では細かい操作方法は記載しておりません。上記2点のみを記載しています。細かい操作方法は、公式手順をご確認いただければと思います。

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:

ビルド環境のコンピューティングモードおよびタイプ - AWS CodeBuild
CodeBuild では、CodeBuild がビルドの実行に使用するコンピューティングとランタイム環境イメージを指定できます。 コンピューティング とは、CodeBuild によって管理および保守されるコンピューティングエンジン (CPU...
ビルド環境のコンピューティングモードおよびタイプ - AWS CodeBuild
CodeBuild では、CodeBuild がビルドの実行に使用するコンピューティングとランタイム環境イメージを指定できます。 コンピューティング とは、CodeBuild によって管理および保守されるコンピューティングエンジン (CPU...

 

ビルド要件との比較

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をマウントさせることで、ダウンロード時間をスキップするため
2つ目のポチに関して..
Codebuildを開始すると新規のEC2が起動します。Androidの公式手順に従い、 ソースツリーのダウンロードから初めてしまうとダウンロードの時間(約2~3時間)を要してしまいます。CodebuildのタイムアウトはMAX8時間と制限があります。そのため、事前にEFSにソースツリーをダウンロードし、それをCodebuildから利用することで、時間短縮を図ります。

EFSのマウント方法は公式手順をご確認ください。

 

メモリの不足:SWAPの設定で対処

ビルド仕様のファイル(buildspec.yaml)にて、SWAPの設定を追加します。ここでは16GBを追加しています。

version: 0.2
 
phases:
  pre_build:
    commands:
      – sudo fallocate -l 16G /swapfile
      – sudo chmod 600 /swapfile
      – sudo mkswap /swapfile
      – sudo swapon /swapfile
(略)
 

補足: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”と怒られ、ビルドが失敗することになります。

version: 0.2
phases:
  (略)
  build:
    commands:
      – . build/envsetup.sh
      – lunch “product_name-build_variant”
      – m

 

正しくは、commandsフェーズで– |と指定し、YAMLのリテラルブロック構文を使用する必要があります。

version: 0.2
phases:
  (略)
  build:
    commands:
      – |
         . build/envsetup.sh
         lunch “product_name-build_variant”
         m

 

公式のドキュメントを見たところ、ビルド仕様バージョン 0.1 では以前のコマンド (ディレクトリの変更や環境変数の設定など) の状態に依存する単一のコマンドを実行することはできないとのこと。

ビルド環境のシェルとコマンド - AWS CodeBuild
ビルドのライフサイクル中にビルド環境で実行するための AWS CodeBuild の一連のコマンドを提供します (たとえば、ビルドの依存関係のインストール、ソースコードのテストおよびコンパイルなど)。これらのコマンドを指定する方法はいくつか...

今回は、上記の通りビルド仕様バージョン 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 CodeBuild で AWS Lambda によるコンピューティングのサポートを開始

ただし、AWS Lambdaのメモリが最大10GBであり、Android OSのビルド要件である16GB(推奨64GB)を満たしていません。

ビルド環境のコンピューティングモードおよびタイプ - AWS CodeBuild
CodeBuild では、CodeBuild がビルドの実行に使用するコンピューティングとランタイム環境イメージを指定できます。 コンピューティング とは、CodeBuild によって管理および保守されるコンピューティングエンジン (CPU...

そのため、高額であることを承知した上でCodebuildのEC2のオーバースペックのものを利用するか、Codebuildを使わず、要件を満たすEC2を利用してビルドする方法が望ましいと考えます。

タイトルとURLをコピーしました