Incredibuild Linuxを使ってAOSPをビルドしてみた

2022.03.16

分散ビルドシステムであるIncredibuildは、Windows向けの開発環境の他にLinux向け開発環境にも対応しています。ですので、Linux上に構築されたソフトウェア開発環境のビルドできます。

ということで、今回はIncredibuild Linux & Incredibuild Cloudを使ってAOSP(Android OpenSource Project)をビルドしてみます。

AOSPとは

AOSPとはAndroid OpenSource Projectの略です。Androidはオープンソースとして公開されており、スマートフォンのみならず、さまざまな家電などに組み込んで利用することが可能です。市販の家電はもちろん自作の機器に組み込む事も可能です。

AOSPは、ソースコード、ライブラリのボリュームは180GBほどあります。なお、AOSPで配布されているソースコードはあくまでユーザランドであり、Linuxカーネルはハードウェアに合わせて用意する必要があります。

開発環境

Incredibuildを利用するにあたり、今回は以下の構成でビルドしています。

Incredibuildでは、Initiator、Coordinator、Helperは以下のインスタンスを利用してビルドしています。今回はソースコードは、Andorid11 r48を利用しています。

Initiator Agent

- OS: Ubuntu 20.04 LTS
- InstanceType: c5.4xlarge
- HDD 500GB

Coordinator

- OS: Ubuntu 20.04 LTS
- InstanceType: t3.small
- HDD 16GB

- SELinuxは無効化する
- 解放するポート番号
    * TCP ポート 2088、2089、9952、9953、8080

Helper

- OS: Ubuntu 20.04 LTS
- InstanceType: c5.4xlarge
- HDD 50GB

AOSPのビルド環境を構築する

今回はUbuntu 20.04LTSを利用しているので次のように構築を進めていきます。基本的には始める | Android オープンソース プロジェクト | Android Open Source Projectの内容をUbuntu 20.04向けに修正しています。

先のInitiatorのEC2インスタンスでビルドできる環境を構築します。では、ビルドに必要なソフトウェアをインストールします。

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

続いて、repo(ソースコードを管理するソフトウェア)をインストールします。PATH設定もお忘れ無く。

$ export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
$ curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
$ gpg --recv-key 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
$ curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo
$ export $PATH=$HOME/bin:$PATH

Pythonの設定をします。

$ sudo ln -s /usr/bin/python3 /usr/bin/python

ソースコードを取得します。今回は、android-11.0.0_r48のソースコードの取得をします。並列でダウンロードするため-j8オプションをつけています。

$ mkdir -p ~/aosp && cd ~/aosp
$ repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48
$ repo sync -j8

初回のダウンロードでは1時間以上かかることもあるので、気長に待ちます。ダウンロードが終わったらAOSPのビルド環境を設定するため次のスクリプトを実行します。

$ source build/envsetup.sh

次に、ビルド対象を選択します。今回はARMを対象とした開発版をビルドします。

$ lunch aosp_arm-eng

そしてビルドを行います。mコマンドのみですべてのビルドが行われます。ビルド完了できることを確認します。

m droid

Incredibuild Linux版をセットアップ

AOSPはIncredibuild側でサポートしているので、Incredibuildでビルドするように設定を進めていきます。

Incredibuildのセットアップ方法はWindows版と異なりますので設定方法を解説します。

Coordinatorをインストール

最初にCoodinatorを設定します。公式ページを参考に構築をすすめます。

Coordinator向けには以下のようにインストールします。incredibuild_3.12.0-239.ubinはIncredibuild社より受け取ったバイナリファイル名に読み替えてください。 -CオプションでCoordinatorをインストールする指定をします。-Aオプションででデータ等を保存するフォルダを指定します。

$ sudo ./incredibuild_3.12.0-239.ubin -i -C -A /home/ubuntu/incredibuild_data

Initiatorへインストール

Initiator向けには以下のようにインストールします。-SオプションでInitiatorのインストールする指定をします。-OオプションでCoordinatorのインスタンスに振られたローカルIPアドレスを指定します。-Aオプションでデータ等を保存するフォルダを指定します。

$ sudo ./incredibuild_3.12.0-239.ubin -i -S -O 172.31.32.33 -A /home/ubuntu/incredibuild_data

インストールが終わるとCoordinatorが起動するので、以下のURLからCoordinatorの管理画面を開きます。CoordinatorはWindowsではアプリケーションでしたがLinux版はブラウザでアクセスします。

http://<CoordinatorのIPアドレス>:8080/incredibuild/

ライセンス登録

Coordinatorに対するライセンス登録はWindows版と異なります。先のCoordinatorの管理画面からCoordinator Settingsのボタンを押下、Licenseを開き、Generate Key Fileを押下すると、pkファイルがダウンロードされます。

このpkファイルをIncredibuild社へ送付します。すると、ライセンスファイルが送られてきます。そのライセンスファイルは、Update the License fileの項目でファイル選択してLoad Fileします。すると、License Detailsにライセンス設定が表示されます。ライセンスが正常に登録できると、次のスクリーンショットのようにライセンス情報が表示されます。

Incredibuild Cloudを設定する

バージョン3.11より Incredibuild Linux版もWindows版と同様にIncredibuild Cloudに対応しています。

では設定を行います。Incredibuild Coordinatorを開き、"Add Cloud Cores"というボタンが追加されているか確認します。もし表示されていない場合は、以下のシェルスクリプトを実行してください。

$ /opt/incredibuild/managment/enable_cloud.sh

"Add Cloud Cores"ボタンを押すと、Incredibuild Cloudの設定画面が表示されます。Incredibuild Cloudの設定方法はWindowsの場合と同じです。未設定の場合は、Incredibuild Cloudの公式ドキュメントゲーム開発環境をAWSで!IncrediBuild Cloudを使用してUnreal Engine 4の分散ビルドをやってみた | DevelopersIO を参考に設定してください。

設定がすべて完了すると、HelperのEC2インスタンスが自動的に構築されます。AWSコンソールより構築されていることを確認してください。HelperのEC2インスタンスはCoordinatorの管理画面にすべて表示されます。

次にHelperに割り当てるコアの数を指定します。Actionの欄にあるボタンを押し、Subscribeを選択し、Helperに割り当てるコアの数を指定します。

-1を指定することで、EC2インスタンスのコア数に合わせて自動で割り当てられます。

それらすべての設定が完了すると、次のような画面となります。

Initiatorの設定をする

次にInitiatorの設定を行います。まず、以下のURLにアクセスします。

http://<InitiatorのIPアドレス>:8080/incredibuild/

そして、Agent SettingsのボタンからGeneralタブを開きます。

設定自体はデフォルトのままで問題ありません。必要に応じて変更してください。

Incredibuildに対応したビルドコマンドを用意する

ここまででIncredibuild Linux版を使ったビルド環境の構築は終了しました。次にIncredibuildを使ってAOSPをビルドするための設定を進めていきます。

まずAOSPをビルドするための設定ファイルを用意します。Incredibuild Linux版でビルドするには、プロジェクトにあらかじめib_profile.xmlファイルを配置した上で、ib_buildコマンドをあわせて実行してビルドします。ib_profile.xmlファイルはプロセス名を指定して「ローカルでビルドする」「Helperに分散ビルドを依頼する」といった細かな指定を行うためのファイルです。Incredibuildは、AOSPQt creatorのビルドをサポートしています。

ここではIncredibuildで用意されているib_profile.xmlファイルを使います。ib_profile.xmlファイルをAOSPのソースコードがあるフォルダにコピーします。

$ cp /opt/incredibuild/data/custom_profiles/android/9-12/ib_profile.xml ~/aosp

次にビルドのシェルスクリプトを用意します。m_droid.shファイルとして次の内容で用意します。

#!/bin/bash
source build/envsetup.sh
lunch aosp_arm-eng
m droid

ビルドを実行します。ビルドする際には、ib_consoleコマンドを併用します。-jオプションで実行するジョブ数を指定します。

$ ib_console ./m_droid.sh -j 200

ビルドの様子をみる

ビルドしている様子をみることができます。まずInitiatorの画面をブラウザで開きます。

http://<InitiatorのIPアドレス>:8080/incredibuild/

Build Historyから左端のAction > Open > New Windowsを選択してみます。

すると、InitiatorやHelperなどに分散してビルドしている様子をみることができます。