LineageOS 16.0 のビルド方法

LineageOS 16.0 の日本語でのビルド手順を以下に示します。お手持ちの機種向けにビルドしてみるのもいかがでしょう。

追記

当記事は2019年に書かれたものであり、現在では古くなっている記述があります。
参考に残しておきますが、今後は https://wiki.maud.io/ja/android/build/prepare を参照してください。

はじめに

一度覚えてしまえば、FlokoROMなどの派生ROMでもだいたい通用する方法です。

英語が読める人は原文とか読んだほうがいいです。

https://wiki.lineageos.org/devices/enchilada/build

過去バージョンをお探しですか?

Version LineageOS 記事リンク
Android 7.1 LineageOS/CyanogenMod 14.1 LineageOS/CM14.1 のビルド方法
Android 8.1 LineageOS 15.1 LineageOS 15.1 のビルド方法
Android 9.0 LineageOS 16.0 ここ

ビルド環境 (ハードウェア要件)

各構成 必要とされる要件
CPU 64bit対応で2コア以上
メモリ 8GB以上を推奨、少なくとも コア数×2GB は欲しいところ
ストレージ 少なくとも150GB以上の空き
OS x64なLinux環境。
ネット接続 まともな速度と安定したもの。数十GBダウンロードする必要があるのに注意

例: さくらのクラウド

パーツ 構成
CPU 8コア vCPU (Xeon E5-2650 v3 @2.30GHz)
RAM 32GB
SSD 250GB
OS Ubuntu Server 18.04.2 LTS
NW 共用100Mbps
所要時間 初回 128分 / ccache有効時 36分

工程

この記事では Ubuntu 18.04.x Server を例に進めます。Desktop版や、その他のディストリビューションでも概ね問題無いでしょう。

各工程 見込み所要時間
パッケージ導入 1時間以内
ダウンロード インターネット接続環境による。
100Mbps以上なら40分以内、5Mbpsなら6-8時間程度?
ROMのビルド PCのスペックによる
  • もしビルド時間を短縮するためにPCのアップグレードを考えているならば、以下の点について考慮するとよいでしょう。優先度の高い順:

    • よりI/O性能の高いSSDや回転数の高いHDD
      • NVMeとかPCIe Gen4とか楽しみですね
    • より新しく強力なCPU
      • 個人で16コア32スレッドが手に入る時代
    • より多くのRAM
    • より高速なインターネット回線
  • 当記事では便宜上、ビルド用のソースディレクトリは ~/lineage として進めます

ビルド環境のセットアップ (ソフトウェア)

パッケージのインストール

ビルドするマシンに直接Android端末を接続する機会がある場合は android-tools-adbphablet-toolsandroid-tools-fastboot とかも入れとくと便利です。

Ubuntu 18.04 LTS (推奨) / 16.04 LTS (可)

必要なパッケージは以下の通りです。

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 repo rsync schedtool squashfs-tools unzip xsltproc zip zlib1g-dev

非LTSな最新のリリース (執筆時点: 19.04)

一応の手順通りで良いはずだけど、サポート期間に気をつけてください。

サポートの切れたリリース

今すぐ Ubuntu 18.04.x をインストールしてください。

repo コマンドのためのセットアップ

git-repo (repo コマンド) は複数のgitリポジトリを一括で管理できるツールです。 apt などのパッケージ管理システムを用いてインストールするのが簡単でしょう。Ubuntuでのパッケージ名は repo です。

詳細はGoogleによるドキュメント、 Repo command reference | Android Open Source Project を、実践的な使い方はわたしが日本語で書いた Android ビルドで学ぶ git-repo 入門 | dev:mordiford を読むと良いです。

git config

Git使ってる人は省略。単純にビルド環境にしか使わないなら以下の通りでも問題ありませんが、これからGitを使う予定のある人は android の代わりに表示名とメールアドレスを入力しておくとよいです。

git config --global user.name "android"
git config --global user.email "android"

ソースコードのダウンロード

ビルド用のディレクトリを作成し、入ります

mkdir lineage
cd lineage
  • repo を使って、manifestと呼ばれる「どのリポジトリを取得し、どういったディレクトリ構成で配置するのか」を一覧にした設定ファイルのようなもの(実態はxml)を取得し、設定します。
    • repo init で設定(initializing)します。 -u <URL> でmanifestのソースを指定し、 -b <revision> でmanifestのブランチやリビジョンを指定します。
    • この工程は他のROMにも応用できるので覚えると良いです
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0
  • 今度はmanifestで指定されたリポジトリを全てダウンロードします
    • repo sync はmanifestに記述された全てのリポジトリを最新の状態に同期します。回線の速度とお使いのマシンの使用可能なスレッド数に応じて -jNオプションを使用してください。一般的に、100Mbps以上の実効速度であれば N=8 で問題ないとされます。
    • その他のオプションについては Android ビルドで学ぶ git-repo 入門 | dev:mordiford に書いたとおりなのでやっぱりこちらもおすすめです。
repo sync -j8 -c --force-sync --no-clone-bundle --no-tags

ビルドの準備

もちろんLineageOSのソース置いてるディレクトリに居ることが前提ですよ?

各種端末向けのソースを取得する

公式サポート済端末の場合

要するに github.com/LineageOS 以下にデバイスのリポジトリがあればの話です。
(個人的には公式にサポートされてても local_manifests 書くのをおすすめしたいんですが、手軽にやるならこちら)

まずはビルド用のコマンド集である envsetup.sh をロードします。

. build/envsetup.sh

ビルドするターゲット端末のコードネームを確認したら、

breakfast <device>

だけで必要なリポジトリを取得してくれます。Nexus 5Xだと breakfast bullhead とか。

公式にサポートされていないがツリーは存在する場合: local_manifests を自分で書く

公式にサポートされている端末ではbreakfastするだけでいい感じに ~/lineage/.repo/local_manifests/roomservice.xml に追加されますが、そうでなければ自分でmanifestを書く必要があります。まずはローカルなmanifestを置くディレクトリとmanifestのxmlを作成しましょう。xmlの名前はお好きにどうぞ。ただし、自分でmanifestを書く際は roomservice.xml は避けたほうが良いでしょう。

mkdir -p .repo/local_manifests
touch .repo/local_manifests/bullhead.xml

後はお好みのエディタでmanifestを書きましょう。以下にテンプレートを示します

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="LineageOS/android_device_lge_bullhead" path="device/lge/bullhead" remote="github" revision="lineage-16.0" />
  <project name="LineageOS/android_kernel_lge_bullhead" path="kernel/lge/bullhead" remote="github" revision="lineage-16.0" />
</manifest>

さっと見てだいたい分かって頂ける通り、name にリポジトリのパス、 path にローカルでのパス配置、 remote はソースが置かれているホスト等、 revision に リモートのブランチ名などを指定する必要があります。

少なくとも、デバイス単体のリポジトリ(この例では LineageOS/android_device_lge_bullhead )は最低限指定しておく必要があります。
他にも、 lineage.dependencies に必要なカーネルおよび兄弟機等との共有なツリー、ハードウェア周りで別途必要なリポジトリ等が記載されていることが多いので 必ず確認しましょう

宣伝: 合同誌『茜ちゃんの薄い本』 では筆者による local_manifests の書き方を丁寧にレクチャーする記事が掲載されています。.dependencies の読み解き方など、現代のAndroid OSのビルドはまずここから!ご活用ください。

vendor ディレクトリとバイナリブロブ

残念ながらカスタムROMは完全にオープンなソースだけで動かすことはできないことが多いです。時には バイナリブロブ のお世話になることも有ります。

多くの場合、これらのファイルは vendor/メーカー/コードネーム に配置されます。

実機から取り出す

ビルドしたいターゲットデバイスをPCに接続し、adbが通る状態にしておいてください。

3-1で取得したデバイス固有のソースがあるディレクトリまで移動します

cd device/lge/bullhead

ここに extract-files.sh があるので、実行すると、proprietary-files.txt に記載されたバイナリブロブ共を実機から取り出してソースと一緒に配置してくれます。

既にLineageOSが動いている端末から取り出すのが推奨されます。

proprietary-files.txt については次の記事が詳しい: Working with proprietary blobs | LineageOS Wiki

Factory Imageから取り出す

Factory Images for Nexus and Pixel Devices | Google Developers

主にNexusで使用可能な方法です。Factory Imageを展開して、必要なファイルを再配置します。

xda-Developersの [GUIDE][TUT][WINDOWS/LINUX] How To Extract Nexus Factory Images [EASY METHOD] とかが参考になると思います。

ビルド

ここまでの作業中にLineage側で何かしら更新されていたり、local_manifestsに手を加えたりしているかもしれません。ビルド前に repo sync し直すと良いです。

repo sync -j8 -c --force-sync --no-clone-bundle --no-tags
export LC_ALL=C.UTF-8
export ALLOW_MISSING_DEPENDENCIES=true

ビルド用のコマンド集みたいなもの、envsetup を読み込んで

. build/envsetup.sh

いざビルド!

brunch <device> 2>&1 | tee lineage_$(date '+%Y%m%d_%H-%M-%S').log

(ログ残すためにこうしてるだけで、 brunch <device> だけでもビルドはできます)

ビルド終了

無事に通った場合

  • 終了後、ROMの.zipファイルは out/target/product/<device> に有ります。忘れずに安全な場所に退避させましょう。
  • ビルド部分を一発で諸々やってくれる便利なスクリプトをGitHubで公開しました。こいつをベースに自分好みのスクリプトを用意すると楽しくなりますよ。
  • SSD等の比較的I/O性能の良いストレージを利用しており、また数十GB~100GB程度の十分な空き容量がある場合で、次回以降のビルドを高速化させたいときは ccache の導入を検討しましょう。ここで説明するには長くなりすぎるので、詳しい説明はArchWikiをよく読んでください。
    • https://wiki.archlinux.jp/index.php/Ccache
    • ちなみに30GBも割り当てればだいたい恩恵は受けられます。
    • ccache自体はビルド環境の prebuilts/misc/linux-x86/ccache/ccache にありました…が、最近のUbuntuではパッケージマネージャから降ってくるので素直にそっちに従うほうが良い?

失敗した場合

保存されたログの 末尾から errorFAILED あたりで検索かけていくと原因が探りやすくなります。下から400行以内には出てくるんじゃないですかね。

おまけ

rootが無い!

LineageOSではデフォルトで su を同梱しません。必要であれば、

などお好きな方法をどうぞ。

brunch とは?

brunch はターゲットを指定する breakfast のち利用可能な全コアでビルドする mka と同義です。すなわち、brunch を叩いた時点で一般的な環境では概ね問題のない数の -jN が指定されています。

この mka/proc/cpuinfo を見て決めており、多くの場合において、これはCPUに存在しているコア数(Intel HTTに対応したCPUの場合はスレッド数)の等倍です。

自分で指定してビルドする必要があるときは逆に、brunch するところを breakfast ${device} && make -jN とするとよいです。

make -jN の適正値

  • AOSPの公式ドキュメントである Preparing to Build ではハードウェアスレッド数の1-2倍程度を -jN 引数に指定したときに最も早くなるとして推奨しています。
  • が、筆者が実際に測った結果を2018年3月の東海道らぐ横浜紹介しています。結果、
    • おおよそコア数 × 2GB 以上のRAMを確保していれば -jN を等倍にするのが最適という結論
    • これを2倍に引き上げてもビルド時間は誤差程度にしか短縮されないので 2倍に増やす意味はない
    • 逆に、コア数 × 1GB 程度かそれ以下のRAMしか積んでいないのであれば、 -jN の値を下げたほうがビルド時間が改善される可能性もある

あとがき

もし困ったことがあれば、 Twitter: @lindwurm か Mastodon: @hota@mstdn.maud.io に聞いてもらえると分かる範囲で答えられるかもしれません(移植する方の開発者ではないので保証はできませんが…)。