Ubuntu 上での Android のビルド環境の構築
Ubuntu の 20.04 のパーティションを消去して 22.04 を新たにインストールしたので、ビルド環境を新たに構築し直しました。私は主に LineageOS をビルドする予定なので、LineageOS Wiki の以下の記事を参考にしました。
https://wiki.lineageos.org/devices/pro1/build
この記事は F(x)tec pro1 というモデルのためのものですが、ビルド環境は、モデル等には関係なく、いろいろな種類の Android をビルドできます。
以下、構築作業の記録です。
- SDK Platform Tools (adb, fastboot) のインストール
- USB (udev) の設定
- ビルドバッケージのインストール
- repo コマンドのインストール
- git の設定
- ccache の有効化
- swap 領域の拡張
SDK Platform Tools (adb, fastboot) のインストール
android.com の以下のウェブページから Linux 用の SDK Platform Tools をダウンロードします。
https://developer.android.com/studio/releases/platform-tools
ダウンロードした zip データを適当なディレクトリで展開して終了です。
.bashrc, .profile などでパスを通してもよいです。
USB (udev) の設定
PC から adb や fastboot でデバイスと通信するための設定を行います(ワイヤレスではなく、USB 有線を想定してます)。
android.com の以下の記事が参考になります。
https://developer.android.com/studio/run/device
まず、adb を使用するユーザが plugdev というグループに入っていることを確認します。
id コマンドを実行すれば、現行ユーザの uid, gid, groups が表示されます。
もし groups に plugdev が無い場合、ユーザを plugdev に追加します。
$ sudo usermod -aG plugdev $LOGNAME (現行ユーザが plugdev に追加されます)
グループ変更は、ログインのし直しによって、反映されます。
次に udev のルールを追加します。先の記事(https://developer.android.com/studio/run/device)にあるように、パッケージインストールが便利です。
$ sudo apt-get install android-sdk-platform-tools-common
これで、/lib/udev/rules.d/51-android.rules がインストールされます。このファイルには、様々なデバイスのルールが設定されています。
自分でルールを設定することも可能です。
/etc/udev/rules.d/51-android.rules にルールを追加します。
# F(x)tec pro1, Unihertz AtomL, jelly2 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev" # Unihertz AtomL, jelly2 SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"
この設定例で、F(x)tec pro1 と Unihertz AtomL, jelly2 を接続できました。
ATTR{idVendor} にはデバイスのベンダーID を設定します。デバイスを usb に接続し、PC 上で lsusb コマンドを実行すれば、ベンダーID を確認できます。
$ lsusb Bus 002 Device 040: ID 0e8d:2008 MediaTek Inc. ... (ID に続く4桁の番号(0e8d)がベンダーIDです)
recovery, fastboot などのデバイスの状態によって ID が変わる場合があります。
パーミッション(MODE)は、"0666" でなく "0660" でいいかもしれません。パッケージインストールの 51-android.rules では、"0660" となっています。
ルール設定が済んだら、デバイスの "USB debugging" を有効にして PC に接続してみます。PC 上で "adb devices" を実行し、デバイスが表示されたら OK です。
adb と fastboot については、android.com の以下の記事が参考になります。
https://source.android.com/devices/bootloader/fastbootd
ビルドバッケージのインストール
LineageOS Wiki の先の記事(https://wiki.lineageos.org/devices/pro1/build)を参考に、ビルドに必要なパッケージをインストールします。
$ sudo apt insatll bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
repo コマンドのインストール
android.com の以下の記事が参考になります。
https://source.android.com/setup/develop#installing-repo
私はパッケージを用いずに手動でインストールしました。
$ 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
LineageOS Wiki の先の記事にあるように、.bashrc, .profile などで ~/bin をパスに追加すると便利です。
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
git の設定
repo が Android を同期するために身元確認を必要とするので、git の識別情報を設定します。
$ git config --global user.email "you@example.com" (you@example.comは、実際には自分のメールアドレス) $ git config --global user.name "Your Name" (Your Nameは、実際には自分の名前)
ccache の有効化
ccache を有効にすれば、2回目以降のビルドを高速化できます。.bashrc, .profile などで設定します。
export USE_CCACHE=1 export CCACHE_EXEC=/usr/bin/ccache
キャッシュのサイズを 50GB に設定しました。
$ ccache -M 50G
ccache -s -v を実行すれば、キャッシュの状態を出力できます。
$ ccache -s -v Summary: Cache directory: /home/XXXXXXX/.cache/ccache ( XXXXXXXはユーザ名) Primary config: /home/XXXXXXX/.config/ccache/ccache.conf Secondary config: /etc/ccache.conf Stats updated: Tue Jul 26 13:45:58 2022 Hits: 8772 / 52046 (16.85 %) Direct: 754 / 52047 (1.45 %) Preprocessed: 8018 / 51292 (15.63 %) Misses: 43274 Direct: 51293 Preprocessed: 43274 Uncacheable: 19 Primary storage: Hits: 9526 / 104093 (9.15 %) Misses: 94567 Cache size (GB): 5.26 / 50.00 (10.51 %) Files: 94121 Uncacheable: Called for preprocessing: 18 Unsupported code directive: 1
私の場合、ビルドを開始すると、何故か /home/XXXXXXX/.cache/ccache という空ファイルが作成されてしまい、"ccache はディレクトリでない" というエラーが発生しました。空ファイル "/home/XXXXXXX/.cache/ccache" を手動で削除し、ディレクトリ "/home/XXXXXXX/.cache/ccache" を手動で作成したら、ビルドがうまく進行しました。
swap 領域の拡張
LineageOS GSI をビルドしようとしたところ、out/soong/.bootstrap/bin/soong_build out/soong/build.ninja の処理でプロセスが kill されました。16G RAM + 2G swap では足りないようです。そこで、swap 領域を拡張します。
$ free -h # スワップのサイズを確認 $ sudo swapon -s # swapがファイル(/swapfile)であることを確認 $ sudo swapoff /swapfile # スワップを解除 $ sudo rm /swapfile # スワップファイルを削除 $ sudo fallocate -l 16G /swapfile # スワップ用に16GBの新ファイル (/swapfile) を作成 $ sudo chmod go= /swapfile # 新ファイルの余計な権限を削除 $ sudo mkswap /swapfile # 新ファイルをスワップファイルに変換 $ sudo swapon /swapfile # スワップファイルを有効化 $ free -h # スワップのサイズを確認
LineageOS GSI を再びビルドしたところ、成功しました。out/soong/.bootstrap/bin/soong_build out/soong/build.ninja の処理で、7G ほど swap 領域が使用されていました。
以上で、ビルド環境が構築されました。