Nexus5用のLineageOS17.1をビルドすることに成功したので、その方法を紹介します。
参考にしたサイト
以下のサイトを見ながら試行錯誤して、ちゃんと動作するLineageOS17.1をビルドすることができました。
モバイル端末の情報サイトとして有名なxda developersの「Nexus5 LineageOS 17.1」のページです。
※Nexus5のLineageOS17.1のカスタムROMがほしいだけであれば、このページからダウンロードできます。
日本語でLineageOSのビルド方法を公開しているページです。とても参考になりました。
LineageOS公式のビルド方法が記載されたページです。このページの手順が公式のビルド方法です。
ビルドに使用した環境
私は、Contaboという格安VPS上で、LineageOSのビルド行いました。
使用したVPSのスペックは以下のとおりです。
プラン:VPS S SSD
-
- CPU:4コア
- メモリ:8GB
- ストレージ:200GB(SSD)
- OS:Ubuntu 18.0.4
- 価格:4.99ユーロ/月
ビルドパッケージのインストール
LineageOSをビルドするために必要なパッケージをインストールします。
sudo apt update && sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev python
※Ubuntu Serverのバージョンによって必要なパッケージが異なります。
詳細は、「Build for hammerhead Install the build packages(LineageOS Wiki))」を確認して下さい。
LineageOSのソースダウンロード
LineageOSのソースコードをダウンロードします。
ディレクトリを作成します。
mkdir -p ~/bin mkdir -p ~/android/lineage
ソースコードを取得するためのrepoコマンドをインストールします。
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
repoコマンドのディレクトリに権限を付与します。
chmod a+x ~/bin/repo
「$HOME/bin」をPATHに追加します。
「~/.profile」をviエディタで開きます。
vi ~/.profile
以下を、ファイルの最後に追加します。 ※もし、すでに同じ記述がある場合は追加は不要です。
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
以下を実行し、環境を更新します。
source ~/.profile
LineageOSソースリポジトリを初期化します。
cd ~/android/lineage repo init -u https://github.com/LineageOS/android.git -b lineage-17.1
以下のように入力します。
Your Name:android
Your Email:android
is this corrent [y/N]?:y
Enable color display in this user account (y/N)?:y
LineageOSのソースコードを取得します。
repo sync --force-sync
「repo sync has finished successfully.」と表示されるまで待ちます。
デバイス固有のコードを取得
各端末向けのLineageOSをビルドするためには、LineageOS本体のソースコード以外に、デバイス固有のコードが必要です。
デバイス固有のコードを取得するためのxmlファイル(manifest)を作成します。
mkdir -p .repo/local_manifests touch .repo/local_manifests/hammerhead.xml vi .repo/local_manifests/hammerhead.xml
viエディタで開いたファイルに、以下を追加して保存します。
<?xml version="1.0" encoding="UTF-8"?> <manifest> <project name="z3DD3r/android_device_lge_hammerhead" path="device/lge/hammerhead" remote="github" revision="lineage-17.1" /> <project name="z3DD3r/android_kernel_lge_hammerhead" path="kernel/lge/hammerhead" remote="github" revision="lineage-17.1" /> <project name="z3DD3r/android_vendor_lge" path="vendor/lge" remote="github" revision="lineage-17.1" /> </manifest>
<補足>
デバイス固有のコードには、大きく以下の3つが必要です。
-
- device
- kernel
- vendor
私がビルドする際は、xda developersの「Nexus5 LineageOS 17.1」のページで公開されていたコードを使用するようにmanifestファイルに設定しました。
もう一度、repo syncコマンドを実行し、デバイス固有のコードを取得します。
repo sync --force-sync
「repo sync has finished successfully.」と表示されるまで待ちます。
ビルドを高速化するためにキャッシュをオンにする
LineageOSのビルドには時間がかかります。
少しでも、高速化するためにキャッシュをオンに設定します。
export USE_CCACHE=1
実行したコマンドが、起動時に読み込みされるように「~/.bashrc」に追加します。
vi ~/.bashrc export USE_CCACHE=1
キャッシュに使用するディスク領域の最大量を指定します。
ccache -M 50G
ccache圧縮を有効にします。
export CCACHE_COMPRESS=1
実行したコマンドが、起動時に読み込みされるように「~/.bashrc」に追加します。
vi ~/.bashrc export CCACHE_COMPRESS=1
[Out Of Memory対策]スワップファイルの設定
私の環境ではメモリが十分ではないようで、ビルドを行うとJavaのOut Of Memoryエラーが発生しました。
そこで、Swapファイルを拡張しました。
Swapファイルの拡張
「free -h」コマンドを実行したところ、Swapは2.0GB割り当たっていました。
「swapon -s」コマンドを実行したところ、Swapはfile形式であることがわかりました。
以下のコマンドで、swapファイルの割当を解除します。
swapoff /swapfile
「free -h」コマンドでSwapが0になったことを確認します。
Swapファイルを削除します。
rm /swapfile
16GBの空のファイルを作成します。
fallocate -l 16G /swapfile
fallocateコマンドで作成したファイルを、Swapファイルに変換します。
mkswap /swapfile
以下のコマンドで、Swapファイルを有効にします。
swapon /swapfile
「free -h」コマンドでSwap領域が割り当てられていることを確認します。
Javaが使用するヒープ領域のMAXを制限
swapファイルの割り当てを増やすことでエラーが解消されたように思えたのですが、ビルドを行っているとまだエラーが発生しました。
そこで、ビルド時に以下のコマンドを実行することでJavaのヒープ領域のMAXを制限するようにしました。
export _JAVA_OPTIONS=-Xmx6G
実行したコマンドが、起動時に読み込みされるように「~/.bashrc」に追加します。
vi ~/.bashrc export _JAVA_OPTIONS=-Xmx6G
LineageOSのビルド
LineageOSのビルドを行います。
まずは、以下のコマンドを実行します。
. build/envsetup.sh
続いて、以下のコマンドを実行するとビルドが開始されます。
brunch hammerhead 2>&1 | tee lineage_$(date '+%Y%m%d_%H-%M-%S').log
「build completed successfully」と表示されればビルド完了です。
ビルドされたファイルは、outフォルダの配下に作成されるので以下のコマンドで確認します。
ls out/target/product/hammerhead/
赤枠で囲ったのが、ビルドされたLineageOSのファイルです。
VPS上に作成されているので、scpコマンドを使ってパソコンのローカルにダウンロードします。
※LinuxMint19がインストールされたノートパソコンを使っています。
scp root@[VPSのIPアドレス]:/root/android/lineage/out/target/product/hammerhead/lineage-17.1-20200328-UNOFFICIAL-hammerhead.zip /home/toshio/
あとは、作成されたROMをNexus5に焼けば使用できます。
まとめ
LineageOSのビルド方法を紹介しました。
今回はすべてほかの方が作成したコードを使用してビルドしただけなのですが、それでも難易度はなかなか高かったです。
私がAndroidのコードがどのように動作しているかをよくわかっていないので、ビルド方法が悪かったのか、ソースコードが誤っているのか判断がつかず、苦労しました。
それでも何回もビルドしているうちに、だんだんと原因がわかってきて、現在は特に不具合もなくNexus5でLineageOS 17.1を使えるようになりました。
今後は、ソースコードの中身を読めるようになって、カスタマイズしたり、別の端末向けにROMをビルドしたりできるようになりたいです。
(2020/08/28 追記)
以下のページで私がビルドしたNexus5用のカスタムROMをダウンロードできるようにしました。
コメント