Ubuntu24.04の環境でAndroid Automotive OSをビルドする

## Android Automotive OS とは

Android Automotive OS とはAndroidをベースに車の In-Vhiecle Infortainment (IVI) 向けのOSである。スマホをIVIに接続してスマホにインストールしていたアプリをIVIのスクリーンで利用するAndroid Autoとは名前が似ているため混乱しやすいので注意が必要だ。

[オフィシャルサイト](https://source.android.com/docs/devices/automotive/start/what_automotive?hl=ja)からAndroid Automotive OSに関連する情報としては次のようなことが確認できる。

- Android Automotive OS (AAOS)
    - Googleによって開発された車載用のOS
    - Androidの特別なバージョンであり、自動車用の組み込みシステムに特化している
- Google Automotive Service (GAS)
    - GoogleからAAOS向けに提供される商用サービス
    - 次のアプリケーションが統合されている
        - ナビゲーション (Google Maps)
        - アシスタント (Google Assistant)
        - アプリストア (Google Play Store)
- OSS版とGAS版(商用版)
    - OEMはGASを利用しないOSS版を利用するベンダーとGASが統合されたGAS版(商用版)を利用するベンダの２種類がある


## Android Automotive OSの開発プラットフォーム

Android Automotive OSの開発プラットフォームとして Google Pixel Tablet が利用できる。[オフィシャルサイト](https://source.android.com/docs/automotive/start/pixelxl?hl=ja)では2024年11月の段階でGoogleが検証している機器は Google Pixel Tablet だと記載されている。

Google Pixel Tablet で開発を進めるためにはプリインストールされているタブレット用のAndroid OSをAutomotive用のOSに書き換える必要がある。

## Android Automotive OSのビルド

ビルドのオフィシャルサイトの通り進めれば良い

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

手順としては次の通り
1. Google Pixel TabletのOEMロックを解除しデバックモードをONにする
1. x86_64 Linux (Ubuntu16.04推奨)にビルド環境を構築
1. Androidのソースコードを取得
1. Google Pixelデバイス用のベンダーイメージをダウンロード
1. パッチを取得
1. ビルド
1. Automotive関連のパッケージをビルド
1. デバイスのOSを書き換えられるように設定
1. ビルドしたOSをデバイスに書き込み

## Ubuntu24.04向けに必要な手順

上述の`Androidのソースコードを取得`の前に下記を実施しておくと良い

### 最低限必要なライブラリ

```terminal
sudo apt update && sudo apt-get install curl git gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386  x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
```

```terminal:dockerの場合
apt update && apt-get install curl git gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386  x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
```

### ncurses5

Ubuntu24.04 で Android Automotive OS のビルドを行う場合、Ubuntu24.04では ncurses5 が  ncurses6 に置き換わってしまい存在しないためビルドエラーとなる。そこで古いUbuntuのパッケージを取得して手動インストールして解決する

```terminal:libncurses5と依存するlibtinfo5を手動インストールする
curl --output libtinfo5_6.4-4_amd64.deb http://ftp.us.debian.org/debian/pool/main/n/ncurses/libtinfo5_6.4-4_amd64.deb
curl --output libncurses5_6.4-4_amd64.deb http://ftp.us.debian.org/debian/pool/main/n/ncurses/libncurses5_6.4-4_amd64.deb
sudo dpkg -i libtinfo5_6.4-4_amd64.deb 
sudo dpkg -i libncurses5_6.4-4_amd64.deb
```

ライブラリのダウンロード先は下記のサイトから見つけることも可能

https://packages.debian.org/bookworm/libncurses5

### repo

Ubuntuに用意されている repo はバージョンが低いため最新版を取得する
```terminal:~/bin にrepoをインストールする場合
cd
mkdir ~/bin
PATH=~/bin:$PATH 
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

### udev

adbでビルドしたOSを書き込む際にパーミッションエラーが発生した場合、Androidデバイスに対応するudevルールを作成する。

```terminal:新しい udev ルールファイルを作成
sudo vi /etc/udev/rules.d/51-android.rules
```

次の内容を追記する

```config:/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```

ファイルの権限を変更してudevルールを再読み込みする。

```terminal
sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
```

udevルールの最読み込みが終了したら、デバイスにさしていたUSBケーブルを抜き差しします。

#### idVendorの確認

idVendorは下記のコマンドで確認できる。Google Pixel Tableの場合は`18d1`である。

```terminal
$ lsusb
...
Bus 001 Device 022: ID 18d1:4ee7 Google Inc. Nexus/Pixel Device (charging + debug)
...
```

# システムを復帰させる方法

https://qiita.com/rairaii/items/48da574a518fcf64aeff