Android Auto を学ぶその2 DHU(Desktop Head Unit) を使ってアプリを動かしてみる

前回は簡単なコードで Android Auto の画面を作ってみました。
funnelbit.hatenablog.com

しかしまだ動かしていないので、アプリをビルドして動作確認してみます。早速クルマに接続したいところですが、実はただ単にビルドするだけではクルマの画面には表示されません。PC だとビルドするだけで表示できるので、とりあえずPCで動かしてみましょう!

前回までのコードはこちらの github にあげてあります。
github.com

DHU(Desktop Head Unit)をインストールする

PC で動かす場合、DHU をインストールする必要があります。これはクルマのナビ画面で動く Android Auto の画面をエミュレートしてくれるものです。
developer.android.com


Android Studio のメニュー Preference -> Appearance & Behavior -> System Settings -> Android SDK から、SDK Tools タブを開いて Android Auto Desktop Head Unit Emulator をインストールしましょう。ドキュメント通りにやっていけばインストールできるはずです。

実機スマートフォンを接続したいので、Android Auto をスマートフォンにインストールしておいてください。
play.google.com


DHU をインストールしたら DHU のあるディレクトリに行きましょう。特に設定していない場合は ~/Library/Android/sdk/extras/google/auto になっていると思います。ここで ./desktop-head-unit --usb します。すると DHU は Android Auto のUSB接続を待機する状態になります。

結構すぐに接続待ちを諦めてしまうので、これをやる前に繋げておくのがおすすめです。

この状態でスマートフォンを接続すると GUI が起動します。

DHU の設定について

クルマによってナビの形態は様々です。画面サイズが違ったり、タッチパネルを搭載していなかったり、ダイヤルをクルクル回してメニューを移動する「ロータリーコントローラー」が搭載されていたりします。

シフトレバー下にあるのが「ロータリーコントローラー」です。左右にクルクルと回せます

DHU では、そういったナビのエミュレートできるよう、.ini ファイルに項目を記述して設定することが可能です。
また DHU はクルマのセンサ入力をエミュレートする機能も利用可能です。クルマの速度、ガソリンの残量、ジャイロの状態などをターミナルから入力して反映できます。
developer.android.com

例えば現在の速度をコマンド入力することで DHU に反映できます。

ただしこれではまだ反映されません。DHU は普通に起動するだけでは各種センサが OFF の状態になっています。上のコマンドは成功したように見えますが、DHU に接続しているアプリケーションには何も飛んできません。

設定を書く方法はドキュメントにも書いていますが、試しに速度の設定を書いてみましょう。
developer.android.com


設定ファイルは .ini ファイルです。今回は設定ファイルのデフォルトファイルパス ~/.android/headunit.ini にはおかずに、別の場所に作ってみましょう。どこでもいいです。

[sensors]
  speed = true # speed [speed] に必要

他にもセンサを追加したければ並べて書けば良いです。

[sensors]
  accelerometer = true # accel [x] [y] [z] を利用するために必要
  compass = true # compass bearing [pitch] [roll] に必要
  fuel = true # fuel [percentage] に必要
  gyroscope = true # gyro [x] [y] [z] に必要
  location = true # location lat long [accuracy] [altitude] [speed] [bearing] に必要
  odometer = true # odometer km [current_trip_km] に必要
  speed = true # speed [speed] に必要

センサの一覧はこちら
developer.android.com

設定ファイルを書いたら、起動時に指定して読み込ませましょう。

> ./desktop-head-unit --usb -c ~/Desktop/headunit.ini
Android Auto - Desktop Head Unit
  Build: 2022-03-30-438482292
  Version: 2.0-mac-arm64

[I]: Loaded configuration from '/Users/funnelbit/Desktop/headunit.ini'.
BoringSSL is the SSL implementation used in the receiver-lib.
Starting link. Requested protocol version: 1.7
[I]: Searching for compatible USB device...
[I]: Found 5 USB devices.
[I]: Found device 'Google Pixel 7' in accessory mode (vid=18d1, pid=2d01).
[I]: Found accessory: ifnum: 0, rd_ep: 129, wr_ep: 1
[I]: Attaching to USB device...
[I]: Attached!
> Phone reported protocol version 1.7
ssl state=TLS client read_server_hello -1
ssl state=TLS client process_change_cipher_spec -1
ssl state=SSL negotiation finished successfully 1
SSL version=TLSv1.2 Cipher name=ECDHE-RSA-AES128-GCM-SHA256
Verify returned: ok

ちゃんとheadunit.iniを読み取ることができていれば、[I]: Loaded configuration from '/Users/funnelbit/Desktop/headunit.ini'. の表示が出るのでわかります。ただし設定ファイルの記述が間違っていてもエラーとか出ませんが。

ビルドして表示してみる

あとは簡単です。ビルドボタンを押してスマートフォンにアプリをインストールします。そして DHU を再起動してください。

アプリが出ていますね。アイコンを選択してみましょう。


無事に画面が出ました!ところで Car API Level は 6 と表示されています。ライブラリの更新履歴を見る限り、てっきり 5 が上限だと思っていたのですが、ドキュメント漁ってみるとしれっとCar API Level 6 が定義されていました。
developer.android.com

バージョン番号を定義しているファイルを覗いてみても LEVEL_6 の存在が確認できます。

ただし Car API Level 6 で何ができるのか、ドキュメントにもコードにも今の所情報はありません。

とりあえず動いたので、次は実車に接続してナビ画面に出してみましょうか。