Android Automotive OSをラズパイに組み込む。

# はじめに
Android Automotive OSをラズパイに組み込むまでの手順をまとめる。下記GitHubの手順に従い実施した。手持ちのパソコンの性能が良くなかったのでビルドに時間はかかったが、大きな問題なく試すことができた。

![aaos.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/9f2fe24f-2d8a-d53c-a859-8f25b1ae5149.gif)


https://github.com/raspberry-vanilla/android_local_manifest

# 目次
+ [Android Automotive OSとは](#android-automotive-osとは)
+ [試した環境](#試した環境)
    + [PC(ビルド環境)](#pcビルド環境)
    + [Raspberry pi(組み込み環境)](#raspberry-pi組み込み環境)
+ [ビルド手順](#ビルド手順)
    1. [GitとRepoの準備](#1gitとrepoの準備)
    2. [ビルドに必要なソフト取得](#2ビルドに必要なソフト取得)
    3. [Repoでビルド環境取得](#3repoでビルド環境取得)
    4. [ビルド](#4ビルド)
    5. [Kernelもビルドしたい場合](#5kernelもビルドしたい場合) 
+ [Raspberry piに組み込む](#raspberry-piに組み込む)
+ [参考にしたサイト](#参考にしたサイト)

## Android Automotive OSとは
Andoroid Automotive OSは車載機器用のAndoroid OS。似たようなものにAndroid Autoがあるが、違いをイメージ図にまとめてみた。Android Autoはスマホ側の機能を車載機器に表示するので、頭脳はスマホ側にある。AppleのCarPlayもAndoroid Autoと同様の仕組みで実現している。対してAndoroid Automotiveは車載機器自体をAndroid化したもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/a2b8ac9a-4c43-115f-5ecc-0922d6061113.png)


https://source.android.com/docs/devices/automotive/start/what_automotive?hl=ja

[戻る](#目次)

## 試した環境
Android Automotive OSをビルドしたパソコン環境と組み込むラズパイは下記の通り。

### PC(ビルド環境)
Android automotive OSのビルド環境。この環境で、ソースコードのダウンロードで1時間、ビルドで12時間位かかる。推奨メモリは64GBだが、メモリSWAPで乗りきれた。

OS|Ubuntu 22.04.5 LTS
-|-
CPU|AMD Ryzen 7 3750h (4コア 8スレッド)
メモリ|32GB
SSD|512GB

SWAPメモリサイズの変更は下記の通り。
```console:cmd
# 16GBにする場合。
$ sudo dd if=/dev/zero of=/swaparea bs=1M count=16384
$ sudo chmod 600 /swaparea
$ sudo mkswap /swaparea
$ sudo swapon /swaparea
```
[戻る](#目次)

### Raspberry pi(組み込み環境)
Andoroid Automotiveを動作確認するためのラズパイの環境。手持ちにタッチパネルディスプレイがなかったので、HDMIのパソコンディスプレイとマウスで代用。
+ Raspberry pi 4　4GB
+ microSD 32GB
+ ディスプレイとマウス

https://www.raspberrypi.com/products/raspberry-pi-4-model-b/

[戻る](#目次)



## ビルド手順
1. [GitとRepoの準備](#1gitとrepoの準備)
2. [ビルドに必要なソフト取得](#2ビルドに必要なソフト取得)
3. [Repoでビルド環境取得](#3repoでビルド環境取得)
4. [ビルド](#4ビルド)
5. [Kernelもビルドしたい場合](#5kernelもビルドしたい場合)

1～4のステップでビルド完了する。ビルドに必要なソフトやAndroidのOSバージョン(記事 ```android-15.0.0_r6```)の最新情報は下記サイトを参照。

https://github.com/raspberry-vanilla/android_local_manifest

併せてKernelもビルドしたい場合は5を実施してから4を実施(1→2→3→5→4)。但し必須ではない。




[戻る](#目次)

### 1.GitとRepoの準備
Android Automotive OS の環境を取得するためにGitとRepoが必要なので準備する。既にGit,Repoを設定している場合はこの手順をスキップ。

#### Git インストール
gitはソースコードをバージョン管理するツール。
```console:cmd
$ sudo apt install git

$ git --version
# git version 2.XX.X
```
初期設定
```console:cmd
$ git config --list

# ユーザー名設定
$ git config --global user.name "yourname"

# メールアドレス設定
$ git config --global user.email your_address@xxx.com
```
設定確認
```console:cmd
$ git config --list

# user.name=yourname
# user.email=your_address@xxx.com
```

#### Repo インストール
Repoは大量のGitリポジトリを一括管理するためのツール。Googleが開発したツール。
```console:cmd

#移動
$ cd ~/

#binディレクトリ作成
$ mkdir ~/bin

# Pathを通す
$ PATH=~/bin:$PATH 

#~/bin/repoに格納
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

#実行権限付与
$ chmod a+x ~/bin/repo
```

[戻る](#ビルド手順)


### 2.ビルドに必要なソフト取得
必要なソフトを```apt-get install```と```Python3 pip```で取得。
```console:cmd
$ sudo apt-get install bc coreutils dosfstools e2fsprogs fdisk kpartx mtools ninja-build pkg-config python3-pip
$ sudo pip3 install meson mako jinja2 ply pyyaml dataclasses
```

[戻る](#ビルド手順)


### 3.Repoでビルド環境取得
ソフトを取得・ビルドするディレクトを作成し、Repoで取得する。例では```~/aaos```としている。ディレクトリ名は、何でもよい。```repo sync```で取得するが、100GB程度あるので注意。約1時間ぐらいかかった。
```console:cmd
# フォルダ作成
$ mkdir ~/aaos
$ cd ~/aaos

# Repo初期化
$ repo init -u https://android.googlesource.com/platform/manifest -b android-15.0.0_r6
$ curl -o .repo/local_manifests/manifest_brcm_rpi.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_local_manifest/android-15.0/manifest_brcm_rpi.xml --create-dirs

# 取得
$ repo sync
```

[戻る](#ビルド手順)

### 4.ビルド
ここからビルド。下記3コマンドで開始される。私の環境では12時間程度かかってしまった。Andoridをビルドするためには、やはりそれなりのPC環境が必要。。
```console:cmd
$ . build/envsetup.sh
$ lunch aosp_rpi4_car-ap4a-userdebug
$ make bootimage systemimage vendorimage
```
完了すると下記となる。
```:cmd
#### build completed successfully (XX:XX:XX (hh:mm:ss)) ####
```

私の環境では途中ビルドが止まる難所があった。

***難所①***
メモリが足りなくて、ビルドが落ちた。おそらくここで一番メモリ食った。32G + SWAP 12Gぐらい。SWAPメモリを拡張して乗り切った。
```:cmd
# [  0% 0/1] analyzing Android.bp files and generating ninja file at out/soong/build.aosp_rpi4_car.ninja 
```
***難所②***
足りないソフトがあった、```byacc```と```flex```。
```console:cmd
# meson.build:1980:17: ERROR: Program 'byacc' not found or not executable
$ sudo apt install byacc

# meson.build:1991:14: ERROR: Program 'flex' not found or not executable
$ sudo apt install flex
```
[戻る](#ビルド手順)


### 5.Kernelもビルドしたい場合
Kernelをビルドしなくても動作確認はできたが、もしKernelをビルドする場合は下記の通り。例では```~/android_kernel```でrepo、ビルドを実施している。
bazel-bin/common/rpi4/arch/arm64/boot ディレクトリにKernelのイメージ類が生成される。
生成されたファイルを Android ソースツリー```~/aaos側```の device/brcm/rpi4-kernel ディレクトリ内の既存のファイルと置き換えて、[手順4](#4ビルド)のビルドに含める。

```console:cmd
$ mkdir ~/android_kernel
$ cd ~/android_kernel
$ repo init -u https://android.googlesource.com/kernel/manifest -b common-android15-6.6-lts
$ curl -o .repo/local_manifests/manifest_brcm_rpi.xml -L $ https://raw.githubusercontent.com/raspberry-vanilla/android_kernel_manifest/android-15.0/manifest_brcm_rpi.xml --create-dirs

# repos syncでソースコード取得
$ repo sync

# kernel build
$ tools/bazel build --config=fast --config=stamp //common:rpi4
```
[戻る](#ビルド手順)



## Raspberry piに組み込む

#### ```./rpi4-mkimg.sh```でイメージ作成される。
```console:cmd
# イメージ作成
$ ./rpi4-mkimg.sh

# イメージが下記にディレクトリに作成される
Done, created ~/aaos/out/target/product/rpi4/RaspberryVanillaAOSP15-20241215-rpi4.img!
```
#### Raspberry Pi Imagerを取得しインストールする。

https://www.raspberrypi.com/software/

```console:cmd
# ダウンロードしたパッケージをインストール
$ sudo dpkg -i ~/Downloas/imager_X.X.X_amd64.deb
#依存関係でエラーが出る場合は
$ sudo apt-get install -f
```

#### Raspberry Pi ImagerでmicroSDに書き込む
Raspberry Piデバイスは 「Raspberry Pi 4」、OSは「Use custom」で「RaspberryVanillaAOSP15-20241215-rpi4.img」を選択して書き込み開始。


#### Raspberry Pi にmicroSDを差し込み起動
Raspberry Pi にmicroSDを差し込み、電源を入れると約1,2分で画面が出てくる。
スマホとBluetoothを繋げればBluetooth Audioの再生ができる。また、Wifiのアクセスポイントに接続すれば、ネットワークもつながりブラウザアプリでインターネットもできる。
反応も良くサクサク動く。ラズパイのシリアル通信でコンソールアクセスもできたので、そちらについては別途記事にする。

![aaos.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/31cb81a1-2630-85ae-4eee-bc19a3bdc26c.gif)




[戻る](#目次)


## 参考にしたサイト
+ https://zenn.dev/turing_motors/articles/9c18325ffdfb57
+ https://note.com/stable_version2/n/n497c87f5fdc3
+ https://medium.com/make-android/android-automotive-os-14-on-a-raspberry-pi-4-e83b2f8ca353

このページには、[Android オープンソース プロジェクトにより作成および公開された](https://source.android.com/docs/setup/contribute/report-bugs?hl=ja)コンテンツの複製が含まれており、[クリエイティブ・コモンズ 4.0表示ライセンス](https://creativecommons.org/licenses/by/4.0/) の規約に基づいて利用されています。

[戻る](#目次)