Android Open Source Project(AOSP)最新環境をビルドし、リファレンスボード：Hikey960で動かす

Android Open Source Project(AOSP)のmasterブランチ環境を、リファレンスボードであるHiKey960向けにビルドして書き込み・動作を行う

基本的には、[AOSPサイト](https://source.android.com/)及びビルド環境の`device/linaro/hikey/hikey960/README`の手順通り

# 用意するもの
* Hikey960
    * 電源
    * USBケーブル (ビルドPCと接続。Hikey960側はType-C)
    * HDMIディスプレイ、ケーブル
    * USBマウス
* ビルドPC
    * CPUコアは多いほど良い  
      ただし第一世代Ryzenの初期ロットは、ランダムにビルドがコケる場合あり  
      → [Ryzen SEGV問題](https://www.google.com/search?q=ryzen+segv)
    * ストレージはビルド環境 & 生成物で200GB近く食うのでそれ以上
    * OSはUbuntu16.04が無難。AOSPサイトには14.04推奨とは書いてあるけど古い感

# ビルドPCのセットアップ
## ビルドに必要となるパッケージをインストール
AOSPサイト記載のUbuntu14.04向けのパッケージ一式でビルド確認済
JDKは、ビルド環境に含まれるので、個別にインストールする必要がない模様

```bash
$ 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
```
## Repoコマンドのインストール
ビルド環境のGitレポジトリ一式をまとめてダウンロードするツールをインストール

```bash
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
~~~
※~/binはログインし直せば勝手にPATHが通るはず

## adb/fastbootアクセスの設定
Android SDKを入れてadb/fastbootが使えるようにしておく
＃ aptでandroid-tools-adb, android-tools-fastbootを入れてもいいかもしれないが古そう？

また、ユーザ権限でアクセスできるようにするために、udevルールファイルを作成しておく

```text:/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```
# AOSPビルド環境取得

```bash
$ repo init -u https://android.googlesource.com/platform/manifest -b master
$ repo sync -c -j24
```
repo init の-b指定は、masterなら省略できる
repo sync の-cは、カレントブランチのみ取得の指定。多少早くなる

ローカルにmirrorを作成して利用する方法については[こちらの記事](https://qiita.com/s-aki/items/151d15b2e5d4b04f088e)を参照

<!-- AOSPサイトの記載がなくなり、やらなくても動いているのでひとまずコメントアウト
### GPUドライバの取得
最新のURLは`device/linaro/hikey/hikey960/README`参照

```bash
$ wget https://dl.google.com/dl/android/aosp/arm-hikey960-OPR-cf4e0c80.tgz
$ tar xzf arm-hikey960-OPR-cf4e0c80.tgz
$ ./extract-arm-hikey960.sh
```
-->

# ビルド実行

```bash
$ . ./build/envsetup.sh
$ lunch hikey960-userdebug
$ make -j16
```
-j指定は、色々と試した経験上、物理コア数x2(HTT/SMT対応CPUなら論理コア数x1)くらいが丁度よい感
Ryzen2700X / メモリ32GB / NVMe SSDの環境でビルド時間は80分程度

# イメージ書き込み
まずはfastbootモードでHikey960を起動させておくこと
HiKey960上のスイッチ1,3をONにして起動するか、`adb reboot bootloader`を実行

flash-all.shによりパーティションテーブル含めて一括更新が可能

```bash
$ cd device/linaro/hikey/installer/hikey960
$ ./flash-all.sh
android out dir:./../../../../..//out/target/product/hikey960
Sending 'xloader' (151 KB)                         OKAY [  0.010s]
Writing 'xloader'                                  FAILED (remote: 'flash write back vrl failure')
Finished. Total time: 0.116s
Sending 'ptable' (196 KB)                          OKAY [  0.011s]
Writing 'ptable'                                   OKAY [  0.023s]
Finished. Total time: 0.047s
・・・
```
xloaderパーティションの更新でエラーが出るが、`device/linaro/hikey/installer/hikey960/README`には気にするなとの記載あり
nvmeパーティションの更新以降でエラーとなる場合は、直前にwaitを入れておくと良さげ

```patch:device/linaro/hikey/installer/hikey960/flash-all.sh
diff --git a/installer/hikey960/flash-all.sh b/installer/hikey960/flash-all.sh
index 2888020..c123577 100755
--- a/installer/hikey960/flash-all.sh
+++ b/installer/hikey960/flash-all.sh
@@ -19,6 +19,7 @@ fastboot flash xloader "${INSTALLER_DIR}"/hisi-sec_xloader.img
 fastboot flash ptable "${INSTALLER_DIR}"/hisi-ptable.img
 fastboot flash fastboot "${INSTALLER_DIR}"/hisi-fastboot.img
 fastboot reboot-bootloader
+sleep 5s
 fastboot flash nvme "${INSTALLER_DIR}"/hisi-nvme.img
 fastboot flash fw_lpm3   "${INSTALLER_DIR}"/hisi-lpm3.img
 fastboot flash trustfirmware   "${INSTALLER_DIR}"/hisi-bl31.bin
```
<!--
全書き込み後に個別のパーティションを更新したい場合は、fastbootモードに入れてからout/target/product/hikey960/に吐かれている個別のイメージを`fastboot flash`で書き込む

```bash
fastboot flash system out/target/product/hikey960/system.img　★Systemパーティションの場合
```
-->
# 起動
HiKey960上のスイッチを弄っていた場合は、スイッチ3をOFFに戻してから起動
繋いだHDMIディスプレイに、起動画面(androidロゴ)、続いてホーム画面が表示されればOK