Note to Self by notekunst

ただの備忘録です

F(x)tec Pro1 用の LineageOS のビルド

F(x)tec Pro1 用に LineageOS をビルドしてみました。Pro1 は lineage によって公式にサポートされています。Lineage の Pro1 の記事に従ってビルドを行うと、大きな問題は生じずに、ビルドは成功しました。
wiki.lineageos.org

本記事は、ビルドのための設定などのメモです。ご自身でビルドを行う場合には、本記事ではなく、Lineage の上記の一次情報を参照するといいです。

下準備

ビルド用のPC

Lineage の記事には、8GB以上のRAMと100GB の空きストレージ (ccache を有効にするならそれ以上) を備える 64-bit コンピュータが必要である、とあります。SSD を用いれば HDD よりもビルドの時間が大幅に短縮される、ともあります。

私が用いたPCは古いものであり、CPU は Core i3-3220、 RAM は 8GB、SSD の空き容量は 300GB 以上、OS は Ubuntu 20.04 です。

Pro1 用のビルドを始めた当初には、ソースコードの内容に関するエラーやビルド環境に関するエラーなど、いろいろなエラーが発生しました。しかし、リポジトリの更新が進むにつれて、ソースコードの内容に関するエラーは無くなりました。結局、エラーが解消するようにビルド環境を整えることによって、ビルドは成功しました。

PC のスペックが低いので、ビルド開始からエラーによる停止まで12時間以上かかる場合がありました。最初からエラー無くビルドが進行する場合、ビルドに1日以上かかりそうです。高スペック PC を用いれば、数時間でビルドできるようです。

RAMについて

ネットで調べると、システムのビルドのためには、RAM の容量が 16GBや32GB ほどあるとよいようです。そこで、RAM不足にならないように、swap を 32GB に増やしました。swap がファイル形式でしたので、以下のように容量を変更しました。

free -h    スワップのサイズを確認
swapon -s    swapがファイル(/swapfile)であることを確認
swapoff /swapfile    スワップを解除
rm /swapfile    スワップファイルを削除
fallocate -l 32G /swapfile    スワップ用に32GBの新ファイル (/swapfile) を作成
chmod go= /swapfile    新ファイルの余計な権限を削除
mkswap /swapfile    新ファイルをスワップファイルに変換
swapon /swapfile    スワップファイルを有効化
free -h    スワップのサイズを確認 

なお、ビルドの最中に、時々にメモリの使用状況をチェックしましたが、swap は使用されていませんでした。swap の拡張は不要だったかもしれません。

ストレージについて

ビルドが完了した状態で、du コマンドで主要なディレクトリのデータサイズを見てみました。ビルドしたデバイスは、Pro1 だけです。

du -s ~/android/lineage
78035784 (約78GB)
du -s ~/android/lineage/out
118869912 (約118GB)
du -s ~/.ccache
4743872 (約4.7GB)

ccache 分を除いても、合わせて 200GB ほど使用しています。200GB 以上の空き容量を準備するのが良さそうです。なお、出力データ用のディレクトリ (~/android/lineage/out) を別のドライブに割り当てたので、このディレクトリのデータサイズは、lineage ディレクトリのものとは別になっています。

adb と fastboot

android developer の以下のウェブページで公開されている SDK Platform-Tools は便利です。
https://developer.android.com/studio/releases/platform-tools?hl=ja
自分の OS に対応したパッケージをダウンロードして展開するだけで、なにかをインストールしたりせずに、コマンドライン ツールを利用できます。

他のツール

Lineage の記事によれば、以下のツールが必要です。

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

未インストールのツールを sudo apt install でインストールしました。

OpenJDK

Lineage の記事によれば、LineageOS 16.0-17.1 のビルドには OpenJDK 1.9 (included by default) が必要とあります。「included by default」という注意書きがありますが、この意味は私にはよくわかりませんでした(LineageOS 16.0-17.1 のソースコードjdk が含まれてるという意味でしょうか?)。私の PC には、すでに、openjdk-14-jdk がインストール済です。OpenJDK については、ビルドでエラーが生じたら、そのときに考えることにしました。ビルドを始めた当初には、Java 関連のエラーが発生しましたが、その後にリポジトリを更新するだけで、Java 関連のエラーは発生しなくなりました。

ビルド

Lineage の記事に従って、ビルドを進めます。

ディレクトリの作成

ビルドに必要なディレクトリを以下のように作成します。1つ目は、後述のコマンド repo をインストールするためのディレクトリです。2つ目は、ソースコードを展開するためのディレクトリです。

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の設定

repo が Android を同期するために身元確認を必要とするので、git の識別情報を設定します。普段に git を使用している人は、この作業は不要です。

git config --global user.email "you@example.com"   (you@example.comは、実際には自分のメールアドレス)
git config --global user.name "Your Name"   (Your Nameは、実際には自分の名前)

普段に git を使用していない場合、ダミーデータでも問題なさそうです。

LineageOS ソースリポジトリの初期化と、ソースコードのダウンロード

F(x)tec Pro1 に関しては、lineage-16.0 が公式にサポートされています。このブランチのリポジトリを初期化します。

cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0

次に、ソースコードをダウンロードします。

repo sync

通信回線にもよりますが、ダウンロードには長い時間がかかります。私の場合、2時間以上かかりました(2時間待っても終わらなかったので外出し、数時間後に戻ったら終わってました)。

なお、repo sync は、ソースコードの更新にも利用されます。Lineage の記事には、数日おきに repo sync を行うよい、とあります。実際に再び repo sync を行ってビルドすると、Android の新しいセキュリティパッチがビルド結果に反映されたりします。

装置固有のコードのダウンロード

ソースコードのダウンロードが完了したら、装置に固有なコード(カーネルなど)をダウンロードします。

cd ~/android/lineage
source build/envsetup.sh
breakfast pro1

ここで、"vendor/fxtec/pro1/pro1-vendor.mk" does not exist. というエラーが生じました。以下に説明する blob (バイナリデータ) を準備する処理によって、このエラーは解消しました。

装置独自の blob (バイナリデータ) の準備

blob の準備方法は、Lineage の以下の記事で説明されています。
https://wiki.lineageos.org/devices/pro1/build#extract-proprietary-blobs
この記事によれば、blob は、実機から抽出されます。ビルドしようとしているブランチの最新の LineageOS が走っている実機を用いるとよいようです。実機が手元にない場合、LineageOS の zip ファイル(インストールパッケージ)から blob を抽出可能です。手順は、Lineage の以下の記事で説明されています。
https://wiki.lineageos.org/extracting_blobs_from_zips.html
この記事の"Extracting proprietary blobs from payload-based OTAs"の手順に従って、Lineage の zip ファイルから blob を抽出できます。私は、Lineage 公式ページからダウンロード可能な zip ファイルから blob を取り出しました(https://download.lineageos.org/pro1)。

blob を抽出するためには、まず、zip の中身を展開するディレクトリを作成し、そこに移動します。

mkdir ~/android/system_dump/
cd ~/android/system_dump/

zip ファイルから payload.bin を抽出します。

unzip lineage-16.0-XXX.zip payload.bin   (lineage-16.0-XXX.zip は、実際にはzipファイルのファイル名)

Python のツール python-protobuf をインストールします。

sudo apt install python-protobuf

私の環境では python-protobuf ではなく python3-protobuf が既にインストールされていました。

なお、LineageOS のビルドには、Python2 が必要です。Ubuntu 20.04 では、Python3 が標準であり、Python2 はインストールされていません。Python2 と Python3 との混在を避けるために、私は、conda を用いて Python2 の環境を作成し、この環境下でビルドを進めました。また、この時なのか後のビルドの時なのか忘れましたが、「/usr/bin/pythonが無い」というエラーが生じたので、python2 へのシンボリックリンク /usr/bin/python を作成しました。

先程に抽出した payload.bin から種々の img ファイルを抽出します。

python ~/android/lineage/lineage/scripts/update-payload-extractor/extract.py payload.bin --output_dir ./
(私の場合、"python"の代わりに"python3"を用いました)

抽出した system.img と、もしあれば vendor.img と product.img とを、マウントします。私の場合、system.img と vendor.img とは見つかりましたが、product.img は、ありませんでした。

mkdir system/
sudo mount system.img system/
sudo mount vendor.img system/vendor/

ソースコードの pro1 用のディレクトリに移動して、blob 抽出コマンドを実行します。

cd ~/android/lineage/device/fxtec/pro1
./extract-files.sh ~/android/system_dump/

blob の抽出が終了したら、img ファイルをアンマウントし、データを削除します。

sudo umount -R ~/android/system_dump/system/
rm -rf ~/android/system_dump/

以上で、blob の抽出作業は終了です。
ディレクトリ "~/android/lineage" に戻って "breakfast pro1" を再び実行すると、今度はエラーは発生しませんでした。

ccacheの有効化

ccache を有効にすれば、2回目以降のビルドを高速化できます。私は、~/.profile に以下の設定を追加しました。

export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
export CCACHE_COMPRESS=1

また、キャッシュのサイズを 50GB に設定しました。

ccache -M 50G

このコマンドは、1回だけ実行すればよいようです。

ビルド開始

以上で準備は整いました。以下のコマンドを実行して、ビルドを開始します。

croot
brunch pro1 > brunch.log 2>&1 &

低スペック PC を用いる場合、初回のビルドは半日以上かかります。私は、ターミナルウィンドウを閉じてもビルドが止まらないように、ログを brunch.log に保存し、バックグラウンドでビルドを実行しました。croot の後、単に brunch pro1 でもビルドできます。

ビルド結果

ビルドに成功した場合、LineageOS のインストールパッケージファイルが生成されます。

~/android/lineage/out/target/product/pro1/lineage-16.0-2020XXXX-UNOFFICIAL-pro1.zip   (XXXXは、ビルドした月日)

これを、実機にフラッシュすれば、セルフビルドシステムスマホのできあがりです。