今回はLineageOSのビルドを行ったので、その手順を備忘録として記事にしておきます。
結論から言うと、WSL上でビルドするのはおすすめしません。
素直にLinuxをインストールしてビルドすることをおすすめします。
用意するもの
- 64-bit Windows(300 GB以上のストレージ空きスペース、32 GB以上のRAM)
- WSL2上のUbuntu(WSL1から2への変換は備考の「WSL1をWSL2に変換する」を参照)
- LineageOSを既に実行している対象端末(ブートローダーアンロックおよびRoot化済み)
- ある程度の前提知識
手順
前置き
基本的には、LineageOSの公式ページの「Build for yourself」のページを見ながらにコマンドを実行していくことになりますが、手順通りにやってもそう簡単にうまくいくはずがなく、様々なエラーが発生します。
今回はXperia 5 IIを対象端末としてビルドを行いましたが、他の端末でも同じようにビルドできると思います。
実際の工程
ビルド作業の全工程において、基本的にはルート状態で行うことをおすすめします。
そのため今回記載するコマンドはsudo
を省いたものを記載しています。
platform-toolsのインストール
WindowsにADBとFastbootをインストールする手順は、長くなるのと、いくらでもネット上に記事があるため、ここでは割愛します。
WSLにADBとFastbootをインストールします。
Googleからplatform-tools-latest-linux.zipをダウンロードします。
WSL内で以下のコマンドを実行して、platform-toolsをインストールします。
unzip platform-tools-latest-linux.zip -d ~
platform-toolsのパスを通します。
~/.profile
等に以下の文を追記してください。(zsh等を使っている場合は.zshrcなど、ご利用の環境に合わせてください。)
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
source
コマンドを使用して、設定を反映させます。(source ~/.profile
など)
必要なパッケージのインストール
今回はUbuntuなのでaptを使用して必要なパッケージをインストールします。
apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
Python3の登録
pythonコマンドがpython3として登録されていることを確認してください。
登録されていない場合はln -s /usr/bin/python3 /usr/bin/python
を実行してシンボリックリンクを作成するか、python-is-python3
をインストールします。
ディレクトリを作成する
mkdir -p ~/bin
mkdir -p ~/android/lineage
repoコマンドのインストール
以下のコマンドでrepoコマンドをダウンロードして実行権限を付与します。
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
~/binのパスを通す
先ほどと同じように、~/.profile
等に以下の文を追記してください。
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
gitの設定
以下のコマンドを実行して、gitの設定を行います。
メールアドレスと名前は何でも良いです。
git config --global user.email "メールアドレス"
git config --global user.name "名前"
ビルドの高速化
ccache
を使用してビルドを高速化します。
以下の文を~/.bashrc
等に追記して、source
コマンドで設定を反映させます。
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccacheで使用するキャッシュの上限サイズを設定します。
ccache -M 50G
リポジトリの初期化
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs
LineageOSのソースコードのダウンロード
LineageOSのソースコードをダウンロードします。
かなりの時間がかかるので、別の作業をしていると良いと思います。(私の環境では2時間程度かかりました。)
repo sync
デバイス固有の構成をダウンロード
デバイス名の取得は、備考の「デバイス名の取得」を参照してください。
cd ~/android/lineage
source build/envsetup.sh
breakfast <デバイス名>
今回はXperia 5 IIを対象端末としてbreakfast
を実行したところ以下のようなエラーが発生したため、先に下記の「端末からBLOBを抽出」を行いました。
device/sony/pdx206/device.mk:58: error: vendor/sony/pdx206/pdx206-vendor.mk does not exist..
一部の端末では先に行う必要があるようです。
端末からBLOBを抽出
端末とPCをUSBで接続します。
端末の「開発者向けオプション」で「USBデバッグ」と「ルート状態でのデバッグ」を有効にしておいてください。
WSLで実行する場合、このADBの接続というのがちょっとした難所になっています。
備考の「WSLでのADB接続」を参照してください。
~/android/lineage/device/<ベンダー名>/<デバイス名>
に移動して、以下を実行します。
./extract-files.sh
環境によっては結構待つかもしれません。
ビルド
以下のコマンドを実行します。
croot
brunch <デバイス名>
かなりの時間がかかります。私の環境では4時間位かかりました。
ビルドに失敗したら
さまざまな理由でビルドに失敗する可能性があります。
代表例としては、メモリ不足、ストレージ不足、アクセス権限の不足、ファイルが存在しない等があります。
エラーメッセージを読み、対処してください。
私の環境で起こった、いくつかのエラー例と対処をまとめておきます。
エラー例
- メモリ不足
- 備考の「スワップ領域の割り当て」を参照
- build/make/core/dex_preopt_config.mk:159: error: fopen failed.
chmod -R 777 out/
で権限を与えて対処(もっと少ない権限でも行けるはず)- ./extract-files.shでファイルがすべて抽出されていないことによるエラー
ビルドに成功したら
以下のコマンドでディレクトリを移動し、ビルドしたファイルを確認できます。
cd $OUT
お疲れさまでした。
備考
WSL1をWSL2に変換する
まず、コマンドプロンプト上でwsl --list --verbose
を実行します。
wsl --list --verbose
出力例
NAME STATE VERSION
* Ubuntu-20.04 Running 1
ここで、「VERSION」が1の場合はWSL1、2の場合はWSL2です。
wsl --set-version <NAME> 2
を実行します<NAME>
の部分は先ほど表示されたNAMEの部分です。
wsl --set-version Ubuntu-20.04 2
出力例
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
変換には数分かかると表示されますが、実際には結構待つことになると思います。
デバイス名の取得
LineageOS公式サイトの Devicesのページから、対象端末のコードを取得します。
自分の端末を選択して端末の詳細画面に移動すると、画像の位置に記載があります。
WSLでのADB接続
前提
Windows側でADBを接続するのは簡単ですが、WSLでADBを接続するのは少し癖があります。
前提条件として、Android端末側の「開発者向けオプション」で「USBデバッグ」を有効にしておいてください。
端末が表示されるか確認
まず、Windowsのコマンドプロンプト側で端末が認識されることを確認します。
コマンドadb devices
出力例
List of devices attached
<端末のシリアル番号> device
ここで、WSL側でadb devices
を実行しても、端末が認識されません。
ネットワーク経由でADBを実行
adb tcpip
を使用してネットワーク経由でADBを実行します。
Android端末とWindowsが同じネットワークに接続されていることを確認してください。
以下のコマンドを実行します。
コマンドadb tcpip 5555
出力例
restarting in TCP mode port: 5555
WSL側でADB接続します。(端末のIPアドレスの確認方法は割愛します)
adb connect <Android端末のIPアドレス>:5555
これでADB接続ができるようになります。
スワップ領域の割り当て
メモリがどうしても足りない際にスワップファイルにより領域を拡張させることができます。
SSD上での使用はSSDの寿命を縮める原因となるため、あまりおすすめしません。
ここに記載するコマンドはRootで実行してください。
fallocate -l 16G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
以下のコマンドを実行して、正常にスワップ領域が割り当てられていることを確認してください。
swapon -s
まとめ
全体的な作業量は大したことはないのですが、待ち時間が非常に多く、待ったうえでビルド失敗ということも多々あります。
とても精神力を消耗する作業でした。
ここまでお読みいただきありがとうございました。