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は、ビルドした月日)
これを、実機にフラッシュすれば、セルフビルドシステムスマホのできあがりです。