Incredibuild Linuxを使ってAOSPをビルドしてみた
分散ビルドシステムである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は、AOSPとQt 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などに分散してビルドしている様子をみることができます。