LineageOS 20.0をWSL上でビルドする

6/16/2023

Android OSS Windows

t f B! P L

今回は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

まとめ

全体的な作業量は大したことはないのですが、待ち時間が非常に多く、待ったうえでビルド失敗ということも多々あります。

とても精神力を消耗する作業でした。

ここまでお読みいただきありがとうございました。