Build & Emulate Android Automotive

# はじめに
Android Open Source Project を車載器向けの設定でビルド&エミューレーションしてみたので、それについて書きます。

# 環境
- AWS EC2 (OS: Ubuntu Server, Type: m5d.xlarge, EBS: 400GB)
    - BuildとEmulation用のマシン
- macOS Sierra
    - [XQuartz](https://www.xquartz.org/) を使って、X11 forwarding を行い、EC2 上のEmulator を描画


# 手順

[Android Open Source Project](https://source.android.com/) を参考に以下の通り行いました。

## 1. ビルドマシンを準備

[Requirements  |  Android Open Source Project](https://source.android.com/setup/build/requirements) を参照してマシンを準備します。

手元に条件を満たすマシンがなかったので、AWS EC2 を利用しました。申し訳ありませんが、AWS EC2 の使い方についてはこの記事では言及しません。

選んだAMIはこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96666/1dfab810-bf4a-3a70-1604-0e7312043805.png)

インスタンスタイプはこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96666/82c5e896-21f2-e735-ccc0-c68252f97bb3.png)

ストレージは400GBです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96666/137e7411-0aee-606c-0034-cdba1d7adb28.png)


## 2. ビルドに必要なアプリを入れる

[Establishing a Build Environment  |  Android Open Source Project](https://source.android.com/setup/build/initializing)

1. で準備したマシンにSSHでアクセスし、必要なツールをインストールします。

```bash
# Buildに必要なツール群のインストール
sudo apt-get update && sudo apt-get install -y openjdk-8-jdk python unzip m4 zip make

# ソースコードをダウンロードするためのrepoツールのインストール
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

ビルド中にコマンドが見つかりませんというエラーメッセージが出たので（`unzip`や`zip`など）マニュアルのメージには書かれていませんが追加しています。

また、ソースコードをダウンロードするための`repo`というツールを導入しています。

## 3. AOSP Source をダウンロード
[Downloading the Source  |  Android Open Source Project](https://source.android.com/setup/build/downloading#initializing-a-repo-client)

上記の記事を参考にソースコードを落としてきます。今回使用したバージョンは`android-9.0.0_r1`です。

以下のコマンドを実行します。

```bash
# 作業ディレクトリを作成
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

# repo の中でgitを使用するので事前に設定
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

# ソースのダウンロード
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r1
repo sync
```

いくつかソースコードのバージョンを試しましたが、後述するエミューレーター起動でエラーが起こったりして色々と試した結果、最終的にこのバージョンでemulationまで実行する事ができました。

## 4. ビルド
[Preparing to Build  |  Android Open Source Project](https://source.android.com/setup/build/building#initialize)

上記を参考にビルドを行います。実行したコマンドは以下です。

```bash
# 環境変数の設定
source build/envsetup.sh

# ビルドのコンフィグレーション
# ここで car がついているのを選ぶことでAutomotive 用のAndroid　が作成できます
lunch aosp_car_arm-userdebug

# ビルド
make -j4
```

## 5. エミュレーション
[Preparing to Build  |  Android Open Source Project](https://source.android.com/setup/build/building#initialize)

最後にエミューレーションです。エミュレーションのためにはGUI必要になってきます。遠隔サーバー上のGUIを利用するにはVNCなどの方法がありますが、今回はX11 Forwardingを使用して、GUIを立ち上げました。

参考にした記事を一例として上げておきます。僕はmacOSを使用しているので、XQuartzというX11 サーバーアプリを使用しています。
[X11 ForwardingとOSX、Windowsからのリモート接続の話し - そごうソフトウェア研究所](http://begirama.hatenablog.com/entry/2015/03/05/004355)
[X11 forwarding — 京大マイコンクラブ (KMC)](https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/10/X11forwarding.html)

まず、EC2 にSSH接続する際に、オプションとして `-YC`をつけます。`-X`でも試してみたのですが、上手く行かなかったため、今回は`-Y`を使用しました。`-C` については、データの圧縮オプションです。なお、mac側で予めXQuartzを起動しているものとします。

```bash
# クライアント側で以下のオプショでSSH接続を行う
ssh -YC -i xxxx.pam ubuntu@xxx.xxx.xxx.xxx
```

接続が完了したら、ビルドしたディレクトリまで移動してエミュレーターを起動します。

```bash
emulator

# デバッグ用のオプションも付けれます。以下は例。
# emulator -help でオプション一覧が見れます
emulator -verbose   -no-boot-anim -debug all,-qemud,-mtport,-mtscreen,-sensors_port,-sensors
```
エミュレーターを起動したときの様子が以下通りです。

![Screenshot_1544711930.png](https://qiita-image-store.s3.amazonaws.com/0/96666/6c81e813-896c-8490-1f01-ca394ff70937.png)
![Screenshot_1544711981.png](https://qiita-image-store.s3.amazonaws.com/0/96666/9fc1936f-341a-dabe-81e2-33470db9a150.png)
![Screenshot_1544712073.png](https://qiita-image-store.s3.amazonaws.com/0/96666/572d3ab7-91aa-7a9a-df16-33a7ad5a99af.png)
![Screenshot_1544712156.png](https://qiita-image-store.s3.amazonaws.com/0/96666/32ae45d8-aa17-bc0f-3d96-12adcce0e0a0.png)
![Screenshot_1544712191.png](https://qiita-image-store.s3.amazonaws.com/0/96666/4d3e3bda-7086-abc6-a9a7-bcfedc918451.png)

車特有の機能がいくつか表示されているのがわかります。

# 終わりに
今回は、Android を Automotive向けのコンフィグレーションでビルドしてみました。特有の画面がいくつかあったりと、新しい発見がありました。

今後は、Automotive 特有の機能などについて調査しきたいと思います。,