[備忘録] MacBook Pro を使って Android 10 を Raspberry Pi 4 に焼く

Linux を使える環境だったら全く問題ないんですが、 macOS を搭載した MacBook Pro で Android 10 を Raspberry Pi に焼く時にいくつかハマるポイントがあったので備忘録がてら残しておく。

macOS で、とありますが Docker や VirtualBox で Linux は使いますので Linux を使わずに Android を焼く。という縛りプレイとかではないです。 Linux系OS の起動ディスク作ったりが面倒だったのでそれをやらずに焼く方法。という感じです。

主に以下で公開されている内容に沿って進めていきます。
https://github.com/android-rpi/device_arpi_rpi4

この記事もわかりやすくまとめられています。 Linux が使える環境であればこちらを読んでその通りに進めていければいいと思います。
https://medium.com/@jpnurmi/android-10-on-raspberry-pi-4-5078901698dd


Android のソースは以下のサイトからダウンロードしてきます。
https://source.android.google.cn/?hl=ja

ここに書いてあることが非常に重要で、macOS は多くの場合でファイルの大文字、小文字を区別しないファイルシステム上で動いているんですが、そのせいで macOS の環境で Android のビルドを始めると途中でコケます。以下のコマンドでどこかしらに `android.dmg.sparseimage` を作成してマウントし、そこで基本的に作業を進めるようにしてください。

```
$ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 250g ~/android.dmg.sparseimage
```

https://source.android.google.cn/setup/build/initializing?hl=ja#setting-up-a-mac-os-x-build-environment

それでは、 Android のソースコードをダウンロードします。以下のコマンドを打ち込んでいってください。最後の `repo sync` コマンドは `-j{任意の数字}` を入れると数字分並列して実行してくれるため高速化できることがあります。

```
$ repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r41
$ git clone https://github.com/android-rpi/local_manifests .repo/local_manifests -b arpi-10
$ repo sync
```

https://github.com/android-rpi/local_manifests

`repo` コマンドは Google 製のリポジトリ管理ツールとのことです。入れていなかったら以下を参考に入れてください。

https://source.android.google.cn/setup/develop?hl=ja

次に、カーネルのビルドをします。上記でダウンロードしたソースに `kernel` ディレクトリが存在することを確認して進めてください。また、この作業は macOS だと上手くいかなかったので VirtualBox を使い Ubuntu 20.04 でやりました。

```
$ sudo apt install gcc-arm-linux-gnueabihf libssl-dev build-essential bs python-mako
$ cd kernel/arpi
$ ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/bcm2711_defconfig kernel/configs/android-base.config kernel/configs/android-recommended.config
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make dtbs
```

結構時間かかります。また環境によってはライブラリが足りずコケるかもしれませんので適宜追加して進めてください。

次に、以下にあるように一部ソースコードを書き換えます。

https://github.com/android-rpi/device_arpi_rpi4/wiki/Android-10-:-patch-framework-source

それが済んだらいよいよ Android のビルドです。 macOS 上で Android のソースコードのディレクトリで以下の通り作業をします。
macOS のバージョンによっては SDK のバージョンが新しすぎて途中でビルドがコケる。ということもあったのでその場合は古い SDK を入れて進めました。

```
$ source build/envsetup.sh
$ lunch rpi4-eng
$ make ramdisk systemimage vendorimage
```

次に、 Android を焼く SD カードのフォーマットをします。 macOS 10.15 でこの通りパーティションを以下の通りに分けることはできなかったので再び VirtualBox の Ubuntu 20.04 上でやりました。

```
 Partitions of the card should be set-up like followings.
  p1 128MB for boot : Do fdisk, set W95 FAT32(LBA) & Bootable type, mkfs.vfat
  p2 768MB for /system : Do fdisk, new primary partition
  p3 128MB for /vendor : Do fdisk, new primary partition
  p4 remainings for /data : Do fdisk, mkfs.ext4
 Set volume label of /data partition as userdata
```

ミソは p4 を userdata という label にすることと、 p1 にきちんと boot と lba のフラグをつけることです。
VirtualBox を使っているなら以下のページにある画像の通りに Gparted を使えばいけると思います。
https://medium.com/@jpnurmi/android-10-on-raspberry-pi-4-5078901698dd

最後に以下の通り SD カードにビルドした Android をコピーしていけば完成です。

```
# Write system & vendor partition
  $ cd out/target/product/rpi4
  $ sudo dd if=system.img of=/dev/<p2> bs=1M
  $ sudo dd if=vendor.img of=/dev/<p3> bs=1M
  
# Copy kernel & ramdisk to BOOT partition
  device/arpi/rpi4/boot/* to p1:/
  kernel/arpi/arch/arm/boot/zImage to p1:/
  kernel/arpi/arch/arm/boot/dts/bcm2711-rpi-4-b.dtb to p1:/
  kernel/arpi/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4.dtbo to p1:/overlays/
  out/target/product/rpi4/ramdisk.img to p1:/
```

だいぶ雑な感じですが自分用の備忘録ということで。