Note to Self by notekunst

ただの備忘録です

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) のインストール

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 領域が使用されていました。

以上で、ビルド環境が構築されました。