見出し画像

Android AutomotiveをビルドしてRaspberry Pi 4で動かしてみた。

こんにちは、トヨタコネクティッド株式会社 先行企画部 新技術開発GのエンジニアのShingo.Nです。

私が所属するトヨタコネクティッド株式会社 先行企画部では「全体の20%を未来を先取りする集団として 責任をもって 味見(トライ)する」をパーパスとしています。

我々新技術開発Gでは、「技術」という領域に特化して、日々試験研究をすすめています。

私が担当しているのは「生成AIをどのように業務に活用するか」がメインとなっています。「生成AIを活用する」という広い観点で、生成AIそのもの調査だけではなく、生成AIを活用した事業の検討といった活動にも取り組んでいます。

今回は以下の動機からAndroid AutomotiveをRasberry Pi 4向けにビルドして動かしてみた!という記事を書きました。

  • 前回の記事に書いたオートモティブワールドで受けた刺激

  • 「車載機器と生成AIの統合」への関心

  • これまでの経験から個人的にAndroidとの親和性が高い

Raspberry pi 4

記事の構成

本記事の構成についてです。
まず「Android Automotiveとは何か」、そして「生成AIとの活用について」を探るポエムのような導入部から始めます。この部分では、Android Automotiveの基本概念と、生成AIの活用についてどのような可能性が広がるのかについて考察します。

該当する以下の記事は読み飛ばしても影響ナシです。
(生成AIとの対話記録に近い。) 

Android Open Source Project
Android Automotive
Android Automotive × 生成AI


Android Automotiveのビルドから、具体的な技術的内容にフォーカスを移し、「ビルド過程や動作確認した内容」について詳細に解説していきます。ここでは、Android 13をベースにビルドしたプロセス、遭遇した課題や解決策、そして最終的にどのような結果が得られたのかを、段階を追ってご紹介します。

ライセンス表記

記事の途中では、DALL-Eが生成したドロイド君(Androidの緑のロボットキャラクター)が登場し、記事の内容をより視覚的に、かつユニークな形で補足します。ガイドラインに基づき、以下の記載を行います。

Android ロボットは、Google によって作成および共有された作品から複製または変更されており、クリエイティブ コモンズ 3.0 表示ライセンスに記載されている条件に従って使用されています。

https://developer.android.com/distribute/marketing-tools/brand-guidelines

また一部画像を引用しているため、以下の記載を行います。

このページには、Android オープンソース プロジェクトにより作成および公開されたコンテンツの複製が含まれており、クリエイティブ・コモンズ 3.0 表示 ライセンスの規約に基づいて利用されています。

https://source.android.com/license?hl=ja#exact-reproductions

Android Open Source Project

読んでいる方の中には、スマートフォンのOSとしてのAndroidについて耳にしたことがあるかもしれません。Androidは、オープンソースプロジェクトであるAndroid Open Source Project(以下、AOSP)として開発が進められています。世界中の開発者がコードの改良に貢献しています。

Android オープンソース プロジェクト

オープンソースの方針は、Androidオープンソースプロジェクト(AOSP)のウェブサイトにも以下の様に記載されています。多岐にわたるデバイスをサポートしていることが強調されています。スマートフォンだけでなく車載機器を含めたデバイスで単一コードベースの実装が可能となっています。

オープンソース プロジェクトとしての Android の目標は、ある業界プレーヤーが他のプレーヤーのイノベーションを制限または制御する可能性のある、主要な障害ポイントが生じないようにすることです。そのため Android は、ほぼすべてのデバイスに移植できるカスタマイズ可能なソースコードと誰もが利用できる公開ドキュメントを備えた、消費者製品向けの完全な製品版品質のオペレーティング システムとなっています

Android  Open Source Project 

以下はAndroidのスタックを示した画像です。この画像はAOSPのソースコードがどのように構造化されているかを示しています。AOSPは、デバイスメーカーや開発者がAndroid OSを構築するための基盤となるソースコードを提供しており、下図のレイヤーで構成されています。

Androidレイヤー

車載機器について、このレイヤーにどのように対応しているのでしょうか。重要なレイヤーは「HAL」となります。

HAL (Hardware Abstraction Layer)
Androidでは車載機器向けのインターフェースとしてVehicle Hardware Abstraction Layer(VHAL)が提供されています。HALインタフェースの詳細な説明についてはこちらをご覧ください。

車両 HAL と Android の自動車向けアーキテクチャ
  • 車載固有のハードウェアとのインターフェースを提供

  • CANバス、車両センサー、IVIシステム、HMIデバイスなど、車載システムを構成する各種ハードウェアへのアクセスを可能にする

  • 車両固有の情報と操作を抽象化し、上位レイヤーからのアクセスを容易にする

イメージしやすいように、車両情報を取得するメソッドのシーケンス図をご紹介します。(HVACは、屋内スペースまたは車両の温度、湿度、および空気の質を制御するシステムのこと。)

 HVAC の温度の取得(CS = CarService、VHAL = Vehicle HAL)

同様に設定メソッドのシーケンス図は以下のようになっています。
APPでボタン押下をトリガーとしてイベントハンドリングを行い温度設定を変更するというイメージです。

 HVAC の温度の取得(CS = CarService、VHAL = Vehicle HAL)
DALL-E作

時刻管理のソースコードとなりますが、
使い方をイメージしやすいのはこちらでしょうか。
https://source.android.com/docs/devices/automotive/time/old_etm?hl=ja

Android Automotive

AOSPのWebサイトではAndroid Automotiveの専用ページがあります。まず、Android Automotiveとは何でしょうか?

Android Automotiveは、車載ハードウェア上で直接実行される、フルスタックのオープンソースの高度にカスタマイズ可能なプラットフォームです。

https://source.android.com/docs/automotive?hl=ja
アンドロイド・オートモティブ

Android Automoiveについてまとめてあるページもあるのですが、わかりづらいので、箇条書きベースでまとめました(ChatGPTが)。https://source.android.com/docs/automotive/start/what_automotive?hl=ja

  • Android Automotiveとは:

    • 車載インフォテインメントシステム(IVI)用のAndroidプラットフォーム。

    • プリインストールされたIVI専用アプリだけでなく、セカンド・サードパーティアプリも実行可能。

    • オープン性、カスタマイズ性、拡張性を提供し、製品の差別化を実現。

  • Androidエコシステムとの関係:

    • 携帯電話やタブレットに使用されるAndroidと同じコードベースを共有。

    • 既存のAndroidのセキュリティモデルや開発者ツールを利用可能。

    • 自動車固有の要件や機能を追加し、車載インフォテインメント用のプラットフォームを構築。

  • Android Autoとの違い:

    • Android Auto:ユーザーの携帯電話上で動作し、そのエクスペリエンスを車載システムに投影。

    • Android Automotive:車載ハードウェア上で直接動作する独立したオペレーティングシステムとプラットフォーム。

  • Google Automotive Services (GAS)について:

    • 自動車メーカーがライセンスを取得し、IVIシステムに統合できるGoogleのアプリケーションとサービスのセット。

    • Googleのサービスを車載システムに取り込むことが可能。

うーんわかりません
非エンジニアの気分でもう一度サマってもらいます。

簡易に説明してもらう。

追加で質問してみる。

追加で質問してみる

Geminiに信ぴょう性を確認して、具体的な情報を補足してもらいました。

Geminiによる補足

このように、Android Automotiveは車載インフォテインメントシステム向けに特化されたAndroidプラットフォームであり、Androidエコシステム全体と連携しながら、車載環境に特有の拡張機能とカスタマイズオプションを提供します。また、Android Autoとは異なり、車内の独立したシステムとして機能します。

エコシステムって結局なんなんだ!

Androidエコシステムとの連携

  • Google Play Store

  • Google Maps

  • Google Assistant

  • その他のAndroidアプリ

なるほど。

Android AutoとAndroid Automotiveの違い

Android  Automotive × 生成AI

Android Automotiveは生成AIとどう絡んでくるのでしょうか。
一般論過ぎて恐縮なのですが、ChatGPTにまとめてもらった結果を以下に掲載しました。

ChatGPTによるまとめ

個人的に考えるAndroid Automotiveの強みは以下の2つではないかと思います。

「プラットフォームとして自由であること(試行錯誤しやすい)」
「Androidエコシステムおよびサードパーティーアプリが生み出シナジーとデータ価値の発掘」といったところでしょうか。

DALL-E作

車載装置のユーザインターフェースを担っているため、それだけユーザーに身近なものになり、スマートフォンのようなAndroidとは同じコードベースなのでデバイス間での連携も容易であり、モビリティ分野の周辺領域との連携が容易というところも、新たな価値を生み出す土壌になっているかと思います。

DALL-E作
DALL-E作

ということで、前段は一旦ここまで。

Android Automotiveをビルドするための準備

Android Automotiveをビルドするために準備したことを書きます。

ハードウェアの準備

ビルド用PCとRasberry Piが必要です。

ビルド用PC
私は以下のスペックのマシンでビルドしました。
(ビルド時には空冷FANがブンブンなってました)

  • CPU:Core™ i7-12700

  • メモリ:64GB (DDR4 PC4-25600 32GB × 2)

  • SSD:2TB  (500GB程度あると良い)

Raspberry Pi 4 Model B/8GB

本体はあったもののガワや配線がなかったので、以下を買い足しました。

  • ラズパイケース(基盤むき出しなので取り回しが面倒なため)

  • MicroHDMIケーブル(ラズパイからHDMIで出力できます。)

  • microSDカード(32GB程度で良い。ビルドマシンでOSイメージをフラッシュする用)

  • microSDカードリーダー(PCに接続する)

  • マウス(今回、タッチスクリーンは使ってません。)

  • ディスプレイ(PC用の27インチディスプレイです。)

ソフトウェアの準備

以下のソフトウェアをビルドマシンに入れます。(Ubuntuで取得するaptパッケージなどは割愛。)

WSL2
Androidのビルド環境はLinuxのため、Ubuntuが使えるWSL2を使ってビルドしました。以後の手順はWSL2環境でのビルド手順となります。

Raspberry Pi Imager
ラズパイで起動する用にイメージバイナリをmicroSDカードにフラッシュします。

フラッシュとは何ぞや

ビルド完了後にゲストマシンからマウントされているホストマシンの領域からビルドイメージを読み込んでWindowsマシンでmicroSDにフラッシュしました。

Android Automotiveのビルド

おおまかなビルド手順は以下の通りです。(WSL2の環境構築は割愛します。)
いくつか参考にした記事も内容が微妙に古かったり、必要な内容が省略されれいたりしたため、トライアンドエラーでビルドには結構苦労しました。

WSL2のインストールは割愛します。

まぁだたいたいあってる

ビルド環境構築

様々なパッケージをインストールします。

aptでパッケージ入手

 sudo apt update
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig bc coreutils dosfstools e2fsprogs fdisk kpartx mtools ninja-build pkg-config python3-pip repo

Pythonパッケージのインストール

sudo pip3 install meson mako jinja2 ply pyyaml dataclasses

AOSPソースコードの取得


ワーキングディレクトリを作成
(buildとかaaos)とか何でもよいです。

mkdir hoge

作ったワーキングディレクトリに移動して、Repoツールを実行します。
android-13.0.0_rXXはビルドIDを入力します。


repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_rXX

ビルドIDについては以下のサイトを参照。

現状での最新は13.0.0_r83っぽい

android_local_manifestsのダウンロード

curl -o .repo/local_manifests/manifest_brcm_rpi4.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_local_manifest/android-13.0/manifest_brcm_rpi4.xml --create-di
Geminiに聞いてみた


Repoというツールを使いビルドに必要なソースコードを取得

curl -o .repo/local_manifests/manifest_brcm_rpi4.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_local_manifest/android-13.0/manifest_brcm_rpi4.xml --create-dirs
Geminiに聞いてみた

repo syncで必要なソースコードを取得してくるのですが、
時間がかかります。40分くらいかかります。そしてソースコードの容量もかなりありますので、気を付けてください。

repo sync 
Geminiに聞いてみた

並列実行もできます。マシンに負荷がかかります。ソースコードがダウンロード完了するまで、しばらくお待ちください。

repo sync -j16

カーネルビルド

カーネルビルド


ワーキングディレクトリはAOSPのソースコードとは分けた方が良いと思います。

ソースコードはcommon-android13-5.15を使います。

repo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.15

カーネルのビルド用マニフェストを取得します。

カーネルのビルド用マニフェスト
curl -o .repo/local_manifests/manifest_brcm_rpi4.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_kernel_manifest/android-13.0/manifest_brcm_rpi4.xml --create-dirs

カーネルのソースコードを取得します。ソースコードがダウンロード完了するまで、しばらくお待ちください。

repo sync

カーネルをビルドします。

BUILD_CONFIG=common/build.config.rpi4 build/build.sh

ビルドが完了するとout/common/arch/arm64/bootに出力されます。
ファイルをコピーして、AOSPのワーキングディレクトリのdevice/brcm/rpi4-kernelに格納します。既に存在するファイルは置き換えてください。

Android  Automotiveのビルド

スクリプトを実行します。


. build/envsetup.sh

ビルド対象を設定します。


lunch aosp_rpi4_car-userdebug

ビルドを実行します。時間がかかります。1時間くらいかかりました。

make bootimage systemimage vendorimage

フラッシュ可能なイメージに変換


./rpi4-mkimg.sh

フラッシュ可能なイメージをmicroSDにフラッシュします。
私はWindows版のRasberry Pi Imagerを使いました。

使い方は細かく触れませんが、PCに差したmicroSDとImageファイルを
指定して実行するという感じです。

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

Rasberry Pi Imager
エクスプローラーからUbuntuにアクセス

長かったビルド手順実行もこれにて完了です!

Android Automotiveの動作確認

イメージをフラッシュしたmicroSDを、Rasberry Pi4に差し込んで電源を投入してみましょう。

何やら起動画面がはじまりました。

起動画面

そしてAndroidロゴが表示されます。

ロゴ

そしてとうとうUIが表示されました!

起動中

そして完全に表示されました!やったー!

Android  Automotiveの起動

それにしても気になるところがあります。
右側はエアコンの設定でしょうか。摂氏ではなく華氏表示になっている模様。

それに天気が「Mountain View」になっています。
これですよね?

マウンテンビュー

地図アプリもデフォルトではインストールされていません。え?そうなの地図アプリないの?

地図アプリがない

それにエアコンっぽい表示も2つあります。微妙に温度も違うし。
ドライバーと助手席みたいな使いわけなのかな?

これだけ情報量を圧縮していても、アイコンでだいたい機能のイメージが
つくるのはさすが。

画面全体

まずは設定アプリを探して以下のことをやります。

  • 言語設定

  • タイムゾーンの変更

  • 単位の変更

言語設定

タイムゾーンやら温度表示も「設定」から変更できます。

タイムゾーン変更

キーボードは対応するものがありませんでした。

キーボード変更

気を取り直して、インターフェースをチェック。

Wi-Fiにも接続できました!

Wi-Fi接続

Bluetoothもちゃんと接続できます。ちゃんとアドバタイズパケットを拾ってます。

Bluetooth

車の名前はラズパイになっています。ちゃんと電話として、Pixel7と
連係できました。

車の名前

アプリも色々とビルドされているようですね。デバッグ用のアプリっぽいものもある。

アプリ

エアコンのダイアログもありました。私はこれ見て、「まぁわかるといえばわかる。だけどなぁ。」という印象でした。

ボトムシートみたいなやつ

そこで以下の質問。

つれないGemini

そっかーGeminiがいうならそうだよね。
でもWebView使えるならCSSも使えそう。
パフォーマンスとか脆弱性とか互換性考えると厳しいけど。

総括

Androidというプラットフォームで、ビルド手順が確立されているため
それほど難しいという印象はなかったです。しかしビルドは手動だと手間がかかる印象があるため、実際に取り組むのであれば、ビルドパイプラインを構築して手数を増やしたいな。という印象でした。AOSPのメリットを最大限に活かして色々できたら楽しそう。

今後

ということで、今回、Android Automtiveをビルドしました。
しかし地図アプリがないことや、温度表示を設定しても元に戻ってしまうため、カスタマイズにも挑戦しようかと思います。

今後は、AOSPがらみで以下の記事を書いてみようと思います。
勿論、GitHub Copilot ChatやGemini、ChatGPTを
フル稼働させて色々作ってみたいですね。

  • Android Automotiveのビルド設定によりどの程度カスタマイズできるか

  • Flutterアプリをビルトインできるのか

  • UnityやUE5のAndroidビルドも組み込めるのか

  • Kotlin地図アプリ開発(MapGPTとか良さげ)

スナドラ搭載のAutomotive開発環境とか、i.MX 8M Mini EVKとかルネサス社のR-Car自動車用SoCの記事を書くのも面白そうですね。

本記事は以上となります。
最後までご覧いただき、ありがとうございました。

DALL-E作 自動車のダッシュボード要素やその他の車関連技術に囲まれており、自動車技術の開発におけるロボットの役割を象徴しています。

「Android ロボットは、Google によって作成および共有された作品から複製または変更されており、クリエイティブ コモンズ 3.0 表示ライセンスに記載されている条件に従って使用されています。」

https://developer.android.com/distribute/marketing-tools/brand-guideline

参考文献