Android AutomotiveをビルドしてRaspberry Pi 4で動かしてみた。
こんにちは、トヨタコネクティッド株式会社 先行企画部 新技術開発GのエンジニアのShingo.Nです。
私が所属するトヨタコネクティッド株式会社 先行企画部では「全体の20%を未来を先取りする集団として 責任をもって 味見(トライ)する」をパーパスとしています。
我々新技術開発Gでは、「技術」という領域に特化して、日々試験研究をすすめています。
私が担当しているのは「生成AIをどのように業務に活用するか」がメインとなっています。「生成AIを活用する」という広い観点で、生成AIそのもの調査だけではなく、生成AIを活用した事業の検討といった活動にも取り組んでいます。
今回は以下の動機からAndroid AutomotiveをRasberry Pi 4向けにビルドして動かしてみた!という記事を書きました。
前回の記事に書いたオートモティブワールドで受けた刺激
「車載機器と生成AIの統合」への関心
これまでの経験から個人的にAndroidとの親和性が高い
記事の構成
本記事の構成についてです。
まず「Android Automotiveとは何か」、そして「生成AIとの活用について」を探るポエムのような導入部から始めます。この部分では、Android Automotiveの基本概念と、生成AIの活用についてどのような可能性が広がるのかについて考察します。
該当する以下の記事は読み飛ばしても影響ナシです。
(生成AIとの対話記録に近い。)
Android Open Source Project
Android Automotive
Android Automotive × 生成AI
Android Automotiveのビルドから、具体的な技術的内容にフォーカスを移し、「ビルド過程や動作確認した内容」について詳細に解説していきます。ここでは、Android 13をベースにビルドしたプロセス、遭遇した課題や解決策、そして最終的にどのような結果が得られたのかを、段階を追ってご紹介します。
ライセンス表記
記事の途中では、DALL-Eが生成したドロイド君(Androidの緑のロボットキャラクター)が登場し、記事の内容をより視覚的に、かつユニークな形で補足します。ガイドラインに基づき、以下の記載を行います。
また一部画像を引用しているため、以下の記載を行います。
Android Open Source Project
読んでいる方の中には、スマートフォンのOSとしてのAndroidについて耳にしたことがあるかもしれません。Androidは、オープンソースプロジェクトであるAndroid Open Source Project(以下、AOSP)として開発が進められています。世界中の開発者がコードの改良に貢献しています。
オープンソースの方針は、Androidオープンソースプロジェクト(AOSP)のウェブサイトにも以下の様に記載されています。多岐にわたるデバイスをサポートしていることが強調されています。スマートフォンだけでなく車載機器を含めたデバイスで単一コードベースの実装が可能となっています。
以下はAndroidのスタックを示した画像です。この画像はAOSPのソースコードがどのように構造化されているかを示しています。AOSPは、デバイスメーカーや開発者がAndroid OSを構築するための基盤となるソースコードを提供しており、下図のレイヤーで構成されています。
車載機器について、このレイヤーにどのように対応しているのでしょうか。重要なレイヤーは「HAL」となります。
HAL (Hardware Abstraction Layer)
Androidでは車載機器向けのインターフェースとしてVehicle Hardware Abstraction Layer(VHAL)が提供されています。HALインタフェースの詳細な説明についてはこちらをご覧ください。
車載固有のハードウェアとのインターフェースを提供
CANバス、車両センサー、IVIシステム、HMIデバイスなど、車載システムを構成する各種ハードウェアへのアクセスを可能にする
車両固有の情報と操作を抽象化し、上位レイヤーからのアクセスを容易にする
イメージしやすいように、車両情報を取得するメソッドのシーケンス図をご紹介します。(HVACは、屋内スペースまたは車両の温度、湿度、および空気の質を制御するシステムのこと。)
同様に設定メソッドのシーケンス図は以下のようになっています。
APPでボタン押下をトリガーとしてイベントハンドリングを行い温度設定を変更するというイメージです。
時刻管理のソースコードとなりますが、
使い方をイメージしやすいのはこちらでしょうか。
https://source.android.com/docs/devices/automotive/time/old_etm?hl=ja
Android Automotive
AOSPのWebサイトではAndroid Automotiveの専用ページがあります。まず、Android Automotiveとは何でしょうか?
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に信ぴょう性を確認して、具体的な情報を補足してもらいました。
このように、Android Automotiveは車載インフォテインメントシステム向けに特化されたAndroidプラットフォームであり、Androidエコシステム全体と連携しながら、車載環境に特有の拡張機能とカスタマイズオプションを提供します。また、Android Autoとは異なり、車内の独立したシステムとして機能します。
エコシステムって結局なんなんだ!
Androidエコシステムとの連携
Google Play Store
Google Maps
Google Assistant
その他のAndroidアプリ
なるほど。
Android Automotive × 生成AI
Android Automotiveは生成AIとどう絡んでくるのでしょうか。
一般論過ぎて恐縮なのですが、ChatGPTにまとめてもらった結果を以下に掲載しました。
個人的に考えるAndroid Automotiveの強みは以下の2つではないかと思います。
「プラットフォームとして自由であること(試行錯誤しやすい)」
「Androidエコシステムおよびサードパーティーアプリが生み出シナジーとデータ価値の発掘」といったところでしょうか。
車載装置のユーザインターフェースを担っているため、それだけユーザーに身近なものになり、スマートフォンのようなAndroidとは同じコードベースなのでデバイス間での連携も容易であり、モビリティ分野の周辺領域との連携が容易というところも、新たな価値を生み出す土壌になっているかと思います。
ということで、前段は一旦ここまで。
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
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
repo syncで必要なソースコードを取得してくるのですが、
時間がかかります。40分くらいかかります。そしてソースコードの容量もかなりありますので、気を付けてください。
repo sync
並列実行もできます。マシンに負荷がかかります。ソースコードがダウンロード完了するまで、しばらくお待ちください。
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/
長かったビルド手順実行もこれにて完了です!
Android Automotiveの動作確認
イメージをフラッシュしたmicroSDを、Rasberry Pi4に差し込んで電源を投入してみましょう。
何やら起動画面がはじまりました。
そしてAndroidロゴが表示されます。
そしてとうとうUIが表示されました!
そして完全に表示されました!やったー!
それにしても気になるところがあります。
右側はエアコンの設定でしょうか。摂氏ではなく華氏表示になっている模様。
それに天気が「Mountain View」になっています。
これですよね?
地図アプリもデフォルトではインストールされていません。え?そうなの地図アプリないの?
それにエアコンっぽい表示も2つあります。微妙に温度も違うし。
ドライバーと助手席みたいな使いわけなのかな?
これだけ情報量を圧縮していても、アイコンでだいたい機能のイメージが
つくるのはさすが。
まずは設定アプリを探して以下のことをやります。
言語設定
タイムゾーンの変更
単位の変更
タイムゾーンやら温度表示も「設定」から変更できます。
キーボードは対応するものがありませんでした。
気を取り直して、インターフェースをチェック。
Wi-Fiにも接続できました!
Bluetoothもちゃんと接続できます。ちゃんとアドバタイズパケットを拾ってます。
車の名前はラズパイになっています。ちゃんと電話として、Pixel7と
連係できました。
アプリも色々とビルドされているようですね。デバッグ用のアプリっぽいものもある。
エアコンのダイアログもありました。私はこれ見て、「まぁわかるといえばわかる。だけどなぁ。」という印象でした。
そこで以下の質問。
そっかー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の記事を書くのも面白そうですね。
本記事は以上となります。
最後までご覧いただき、ありがとうございました。