AOSP のビルド手順と Pixel 3 XL への書き込み (Android10)

AOSP (Android Open Source Project) をビルドしました。
その時のメモを公開します。
Android 10 を Pixel 3 XL 向けにビルドし、書き込むところまでを記します。

Nexus や Pixel、エミュレータ向けであれば、このメモに従って、ビルドできるはずです。それ以外(例えば Xperia)の場合、ドライバの入手先やビルド設定が不明なので、このメモだけではビルドできません。

ビルド用マシンの準備

Ubuntu 14.04 以上であれば、ビルドできます。
推奨環境は 14.04 ですが、18.04 でもビルド出来ました。
ノートパソコンでも十分ビルドできます。しかし、VMware などの仮想環境は使わずに、直接 Ubuntu が動いている環境が良いでしょう。メモリー不足による失敗を回避するためです。
WSL (Windows Subsystem for Linux) の Ubuntu では、試していませんが、お薦めしません。

お金に余裕があれば、AWS EC2をお薦めします。インスタンスタイプとして c5.12xlarge や c5.18xlarge を選べば、30分程度でビルドできます。ただし、最初の repo sync 時は t2.2xlarge あたりが妥当です。なぜなら、repo sync -j並列実行数 の並列実行数を増やしても8プロセッサしか使われていなかったからです。未確認ですが、1回のビルドには500円程度かかる見込みです。
ちなみに、AMI には Ubuntu Server 14.04 LTS (HVM), SSD Volume Type 64bit(x86)、ストレージには 500GB の SSD を選択しました。SSD はもっと小さくても良さそうでした。

参照:
ビルド環境の構築  |  Android オープンソース プロジェクト  |  Android Open Source Project

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

1
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

ccache の使用を勧める記事を見かけます。コンパイラの出力をキャッシュして高速化できるのだそうです。試しましたが、高速化を実感できませんでした。そのため、ここでは ccache をインストールしません。

installing_text.png のビルド失敗を防ぐため、fontconfig をインストールします。なお、ビルド対象が aosp_x86-eng(エミュレータ用イメージファイル)のときには失敗しません。aosp_crosshatch-userdebug(Pixel 3 XL 実機用イメージファイル)のときに失敗していました。今回は、Pixel 3 XL で実行したいので、インストールが必要です。

1
sudo apt install fontconfig

参照:
ビルド環境の構築  |  Android Open Source Project
Java error building AOSP 10 - Google グループ

Repo のインストール

Repo ランチャーのダウンロード

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

Repo クライアントの初期化

ソースコードのディレクトリを作成します。

1
2
mkdir aosp
cd aosp

Repo の内部では Git を使っています。
そのため、Git に必要なユーザー名とメールアドレスを入力します。

1
2
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"

最新バージョンの Repo を入手します。
-b の後には、ソースコード タグを指定します。
Pixel 3 XL で使えるように android-10.0.0_r26 を指定します。

1
repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r26

参照:
ソースのダウンロード  |  Android Open Source Project
ソースコード タグとビルド  |  Android Open Source Project

ソースのダウンロード

-j8の数字は、並列実行数なので、CPU数以下にします。CPU数は、nproc コマンドで得られます。

1
repo sync -j8

参照:
ソースのダウンロード  |  Android Open Source Project

ドライバのダウンロード

先ほどダウンロードしたソースコードのディレクトリの中で、作業を続けます。この作業によって、vendor ディレクトリが追加されます。
うろ覚えになっていますが、エミュレータ向けにビルドする場合には、ドライバは不要なので、この作業はスキップしてください。

上記ソースコード タグの表を見ると、各タグにビルドバージョンが割り当てられています。
android-10.0.0_r26 であれば QQ1A.200205.002 です。
Driver binaries の配布ページ で、インストールしたいスマートフォンの、そのビルドバージョン向けの Vendor image を探します。
Pixel 3 XL の QQ1A.200205.002 であれば、Pixel 3 XL binaries for Android 10.0.0 (QQ1A.200205.002) ですね。
そこには、Vendor image の Download link が有ります。その link の URL をコピーします。
その URL から wget などでダウンロードします。圧縮されているので、展開が必要です。今回の端末・ビルドバージョンであれば、次のようになります。

1
2
wget https://dl.google.com/dl/android/aosp/google_devices-crosshatch-qq1a.200205.002-1b91bd71.tgz
tar xf google_devices-crosshatch-qq1a.200205.002-1b91bd71.tgz

展開すると、extract-google_devices-crosshatch.sh のような名前のシェルスクリプトが現れるので、それを実行します。

1
./extract-google_devices-crosshatch.sh

表示されるメッセージに従って、”I ACCEPT” を入力すると、vendor ディレクトリが作成されます。

ビルド設定

以下のコマンドを実行すると、ターゲット(product_name-build_variant)の一覧が表示されます。
一覧には、aosp_x86-eng や aosp_crosshatch-userdebug などのターゲット名が並びます。
先ほどのデバイスドライバでは、Pixel 3 XL に対して crosshatch というコードネームが使われていました。こちらの一覧にも aosp_crosshatch-userdebug が有るので、それを選べば良いとわかります。
一覧には、ターゲット名の前に番号が振られています。そこで、aosp_crosshatch-userdebug に対応する番号を入力します。なお、エミュレータをビルドするならば aosp_x86-eng を選択します。

1
2
3
export LC_ALL=C
source build/envsetup.sh
lunch

ビルド

下記コマンドでビルドします。
この中の 8 という数字は、並列実行数です。CPU数以下になるように、気をつけましょう。CPU数は、nproc コマンドで得られます。
なお、make -j8 と説明しているWEBサイトも有りますが、aosp 公式ページのビルド方法に従ってm -j8でビルドします。

1
m -j8

次のようなエラーが表示される場合には、m clean; mmma -j8 を実行します。

1
FAILED: out/target/common/obj/APPS/Dialer_intermediates/classes-full-debug.jar

この mmma とは、m と異なり、以下で説明されるように依存を解決してくれます。

1
2
3
4
5
6
7
Build Macros and functions
- croot - change directory to the top of the tree
- m - execute 'make' from the top of the tree (even if your current directory is somewhere else)
- mm - builds all of the modules in the current directory
- mmm <dir1> ... - Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma - Builds all of the modules in the current directory, and their dependencies.
- mmma <dir1> ... - Builds all of the modules in the supplied directories, and their dependencies.

もしも次のように表示されたら、その指示に従い、make api-stubs-docs-update-current-api; mmma -j8 を実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
1. You can add '@hide' javadoc comments to the methods, etc. listed in the
errors above.

2. You can update current.txt by executing the following command:
make api-stubs-docs-update-current-api

To submit the revised current.txt to the main Android repository,
you will need approval.
******************************

参照:
Android のビルド  |  Android Open Source Project
Missing intermediates for external project in P-preview AOSP tree - Google group
Build Macros and functions - eLinux.org

ダウンロード

この作業は、AWS EC2 でビルドした場合に必要です。クラウドに成果物が有るのですから、それを手元にダウンロードしなくてはいけません。

中間ファイルまでダウンロードすると、ファイルサイズが大き過ぎて時間がかかります。そこで、中間ファイルのディレクトリを exclude したアーカイブを作成します。
ダウンロードしたファイルが壊れていないか確認できるように、MD5を計算すると良いでしょう。

1
2
3
cd out/target/product/crosshatch
tar cvf --exclude symbols --exclude ramdisk --exclude appcompat --exclude apex --exclude fake_packages --exclude gen --exclude persist --exclude vendor --exclude data --exclude system --exclude system_other --exclude root --exclude obj --exclude product --exclude debug_ramdisk --exclude obj_arm --exclude recovery ~/android-10.0.0_r26-aosp_crosshatch-userdebug.tar *
md5sum ~/android-10.0.0_r26-aosp_crosshatch-userdebug.tar

アーカイブファイルは、SCP などを使ってダウンロードします。

パソコンの環境

コマンドラインまたはシェルで、adb コマンドや fastboot コマンドを実行できなくてはいけません。
Android Studio をインストールすることで、実行できるようになります。
Android Studio は、パソコンのストレージをかなり消費します。Android Studio を使う予定の無い人は、Android Studio 無しで adbfastbootをインストールする方法をインターネットで調べてみてください。

デバイスのロックを解除

スマートフォン側の操作です。
設定の、ビルド番号を複数回(10回?)タップしてデベロッパー機能(開発者向けオプション)を有効にします。
そのオプションの、USBデバッグとOEMロック解除をONします。
OEMロック解除は、インターネットに接続されていないと、ONできませんでした。

パソコンとUSBケーブルで接続します。
スマートフォン側に、ダイアログが表示されます。このパソコンを信頼して良いか問われているので、信頼することを回答します。

コマンドラインまたはシェルで、adb devicesを実行し、デバイスが認識されていることを確認します。
認識されていない場合、先ほどの設定を見直すか、ケーブルの再接続を試みてください。

コマンドラインまたはシェルで、adb reboot bootloader を実行し、スマートフォンのブートローダーを起動します。
デバイスが再起動して、Fastboot mode になるまで待ちます。
コマンドラインまたはシェルで、fastboot flashing unlock を実行し、ブートローダーのロック解除を要求します。
スマートフォン側で Lock/Unlock を選択する画面が表示されるので、音量ボタンで Unlock を選択したうえで、電源ボタンで決定します。これは Pixel 3 XL での操作であり、スマートフォンによっては違うこともあるでしょう。
完了するまでに数分かかるので、焦らずに待ちます。

OSアップデート

スマートフォンの現在のOSバージョンが、今回ビルドしたOSバージョンよりも古かった場合、デバイスへの書き込みに失敗することがあります。
Android 9 の Pixel 3 XL に Android 10 の AOSP を書き込もうとしたときにこの現象に出くわしました。次のようなエラーメッセージが表示されてしまいました。

1
2
Rebooting into fastboot      FAILED (remote: 'Unsupported reboot option reboot-fastboot')
fastboot: error: Command failed

事前に OS を OTA でアップデートすれば良かったのでしょう。
今回は、途中まで書き換えてしまった後なので、残念ながら、いつもの Android は起動できません。OTA のアップデートは無理です。
これを処置するには、ファクトリーイメージをダウンロードして、それを書き込むしかありません。

先ずは、Factory Images for Nexus and Pixel Devices を訪れて、Pixel 3 XL の 10.0.0 (QQ1A.200205.002, Feb 2020) のイメージをダウンロードしました。
次に、圧縮ファイルを展開します。

1
2
wget https://dl.google.com/dl/android/aosp/crosshatch-qq1a.200205.002-factory-3e5c17fd.zip
unzip crosshatch-qq1a.200205.002-factory-3e5c17fd.zip

これを書き込みます。そのためには、Windows の場合は flash-all.bat を実行します。

1
2
cd crosshatch-qq1a.200205.002
flash-all.bat

参照:
android - fastboot flashall fails (‘Unsupported reboot option reboot-fastboot’) - AOSP 10.0.0 - blueline - Stack Overflow

AOSP の書き込み

環境変数にイメージファイルの存在するディレクトリ(以下の例では C:\Users\ユーザー名\Desktop\pixel3 )を指定しないと、エラーが発生します。Windows であれば、次のように指定しなくてはいけません。

1
set ANDROID_PRODUCT_OUT=C:\Users\ユーザー名\Desktop\pixel3

ようやく、書き込めます。10分程度かかるかもしれません。無反応でも忍耐強く待ちましょう。

1
fastboot flashall -w

次のように表示されて完了します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
C:\Users\ユーザー名\Desktop\pixel3>fastboot flashall -w
--------------------------------------------
Bootloader Version...: b1c1-0.2-5946827
Baseband Version.....: g845-00086-191011-B-5933466
Serial Number........: *********
--------------------------------------------
Checking 'product' OKAY [ 0.052s]
Setting current slot to 'a' OKAY [ 0.373s]
Sending 'boot_a' (65536 KB) OKAY [ 2.678s]
Writing 'boot_a' OKAY [ 0.501s]
Sending 'dtbo_a' (8192 KB) OKAY [ 0.375s]
Writing 'dtbo_a' OKAY [ 0.073s]
Sending 'vbmeta_a' (4 KB) OKAY [ 0.116s]
Writing 'vbmeta_a' OKAY [ 0.056s]
Rebooting into fastboot OKAY [ 0.054s]
< waiting for any device >
Sending 'system_a' (4 KB) OKAY [ 0.059s]
Updating super partition OKAY [ 0.025s]
Resizing 'product_a' OKAY [ 0.005s]
Resizing 'system_a' OKAY [ 0.006s]
Resizing 'vendor_a' OKAY [ 0.005s]
Resizing 'product_a' OKAY [ 0.007s]
Sending 'product_a' (321072 KB) OKAY [ 7.972s]
Writing 'product_a' OKAY [ 1.179s]
Resizing 'system_a' OKAY [ 0.008s]
Sending sparse 'system_a' 1/2 (524284 KB) OKAY [ 13.375s]
Writing 'system_a' OKAY [ 1.570s]
Sending sparse 'system_a' 2/2 (287812 KB) OKAY [ 7.333s]
Writing 'system_a' OKAY [ 1.110s]
Sending 'system_b' (63712 KB) OKAY [ 1.585s]
Writing 'system_b' OKAY [ 0.222s]
Resizing 'vendor_a' OKAY [ 0.008s]
Sending 'vendor_a' (451928 KB) OKAY [ 11.164s]
Writing 'vendor_a' OKAY [ 1.499s]
Erasing 'userdata' OKAY [ 8.088s]
Erase successful, but not automatically formatting.
File system type raw not supported.
Erasing 'metadata' OKAY [ 0.008s]
Erase successful, but not automatically formatting.
File system type raw not supported.
Rebooting OKAY [ 0.000s]
Finished. Total time: 102.745s

参照:
ANDROID_PRODUCT_OUT not setが表示された場合 - 【AOSP】ビルドしたAndroidOSを実機に入れる - Qiita
Flashing Devices  |  Android Open Source Project

共有