見出し画像

Android Auto開発秘話

こんにちは、キャンプ大好き丸です。ナビタイムジャパンでカーナビタイムのアプリ開発を担当しています。

近年、Androidスマートフォンを車載システムとして使用できるAndroid Autoに対応する車種が増えてきており、多くのアプリがAndroid Autoへの対応が期待されています。

本日6/11(金)、Android版カーナビタイムはAndroid Autoに対応しました!

AndroidAutoプロダクト紹介ページ

カーナビタイムとは

カーナビタイムは圏外でも使える本格派カーナビアプリです。
渋滞情報、オービス通知、オフラインナビなどを搭載した多機能カーナビアプリで、AndroidとiOSで展開しています。

Android Autoとは

Android Autoとは、Googleが開発した、Androidスマートフォンを車での利用に最適化するためのアプリです。

Androidスマートフォンを車載ディスプレイに接続するだけでAndroid Autoが起動し、運転中でもメッセージの送受信や音楽の再生、ルート検索などが安全に行えます。

カーナビタイムは、Android Auto利用の肝である「ナビゲーション」アプリとして対応し、ナビタイムが提供する高品質なルートと音声案内でユーザーの運転をサポートします。

画像1

Android Automotiveとの違い
Android Autoは車との連携アプリで、車載ディスプレイに接続してスマートフォン内のアプリを利用するのに対し、Android Automotiveは車載器に予め組み込まれたOSで、スマートフォンを接続することなくそのまま利用できます。

なぜ今?

このタイミングでAndroid Autoに対応した理由は以下です。

1. Android Auto対応アプリが公開可能になった
2. ユーザーからの要望が多かった
3. 日本向けAndroid Auto対応ナビアプリのデファクトを確立したかった

Android Auto対応アプリは「メディアアプリ」「メッセージングアプリ」「ナビゲーション、駐車場、充電スポットアプリ(以下ナビゲーションアプリ)」の3種のカテゴリに分類されます。

以前よりGoogle Play Storeで公開されているAndroid Auto対応アプリは数多く存在しますが、サードパーティが公開できるアプリは「メディアアプリ」と「メッセージングアプリ」の2種類のみで、「ナビゲーションアプリ」はGoogleと一部のサードパーティしか許可されていませんでした…。

しかし、4月5日にポリシーが変更され、サードパーティが「ナビゲーションアプリ」をGoogle Play Storeに公開することが可能になりました。
また、かねてからカーナビタイムユーザーからの要望が多く開発者として対応したかった点と、いち早く対応して「Android Autoのナビアプリといえばカーナビタイム」というデファクトスタンダードを確立したかった点も、開発にいたった理由です。

スマホ用アプリ開発との違い

私が開発中に感じた、"スマホ用アプリ開発との違い"を紹介します。

1. レイアウトが予め決められている

Android Autoアプリの1画面をScreenと呼び、その画面構成は予め決められていて、それをTemplateと呼びます。Templateにはいくつか種類があり、目的に応じて使い分けます。

画像3

Template一覧

各Templateの各パーツをModelと呼び、これに表示したい値をセットして画面更新(invalidate()メソッドを呼び出す)することで、画面上の文字や画像が更新されます。

スマホ用アプリはレイアウトを自由に構築できるxmlファイルがありますが、Android Autoはコード上でTemplateとModelを駆使してレイアウト構築することになります。

自由にレイアウトが組めない分、アプリ側の機能を全て転用できない可能性もあり、場合によっては機能削減を検討する必要もあります。

2. 制約が多い

スマホ用アプリと違い、運転中に利用することが想定されているため、安全運転の観点から多くの制約が存在します。
そのうち、Android Auto対応前の仕様検討として最も気を付けなければならない制約は「1タスクで表示されるTemplateは5つまで」という点です。

1タスクで表示されるTemplateは5つまで
起動時のScreenで使うTemplateも1つとしてカウントし、合計5つ以内に収める必要がある
また、5つ目のTemplateは「Navigation Template」「Pane Template」「Message Template」のいずれかでなければならない。

運転中に階層が深くなる複雑な操作をさせないための制約ですが、これを予め知っておかないと大きな手戻りが発生する可能性があります。
5つ目のTemplateの種類に制限がある点もポイントで、画面フローの検討に大きく影響します。

スマホアプリのカーナビタイムは地点検索〜ナビ開始までのタスクを

画像6

というフローで基本的には行っていますが、これをAndroid Autoに適用すると、以下になります。

画像6


上記の通り、5つ目のTemplateが「Route Preview Template」となってクラッシュしていまします。
据置カーナビのフローを参考にし、4つ目「地点詳細画面」を外すことでこの問題を解決しました。これでアプリがクラッシュすることは避けられます。

画像6

上記のように、アプリ全体の仕様に関わる制約があるため、事前に制約をしっかり把握しておくことをオススメします。

3. 実機検証が難しい

Googleが提供しているAndroid Autoエミューレータ「Desktop Head Unit」を利用すれば簡単にPC上で動作確認を行えます。しかし、より現実に近い環境でテストする場合はAndroid Auto搭載の車でテストする必要があります。

実物の車載器に開発中のAndroid Auto対応アプリを認識させるには、Google Play Consoleで配信する必要があります。オープンテスト/クローズドテスト/内部テストのいずれかで配信すると良いでしょう。

開発中に困ったこと

ドキュメントとガイドラインのインプット

Googleが公開しているAndroid Autoのドキュメントにざっと目を通すと、様々な制約があることがわかりました。それ以外にも、デザインガイドラインがあったため、まずはそれらをインプットする必要があると考えました。当時はドキュメントもガイドラインも日本語訳が無かった※ため、英語が得意ではない私がインプットするには膨大な時間がかかると思いました。

しかし、丁度社内でAndroid Autoに注力している別の事業があったので、協力してチームで全文翻訳することにしました。そこで大活躍したのがDeepL翻訳です。6人ほどで翻訳作業をし、約2人日で完了できました。

完成した翻訳は今後社内資産として活用でき、実際に開発時に制約考慮やガイドライン考慮に役立ちました。

※現在は公式でガイドラインの日本語訳があります

Modelの見た目

デザインガイドラインには各テンプレートの見た目が紹介されていますが、各Modelがどのパーツに当てはまるのかは書いてありません。Android Studioでプレビューが見れるレイアウトファイルでの構築でもありませんので、実際に動かして確認するしかありません。

Modelの理解を深める意味でも実際に手を動かして確認した方が良いと思ったので、テスト実装を重ねて理解を深めました。

幸い、Googleが提供しているサンプルコードが概ねのModelを網羅しているので、それを修正しながら試してみるのが良いと思います。

スクリーンショット 2021-06-10 16.30.01

スクリーンショット 2021-06-10 16.30.36

サンプルコードの起動画面

短期間での開発で工夫したこと

Android Autoがサードパーティ向けに公開可能になるアナウンスが発表されてから約2ヶ月という短期間でリリースするため、以下の工夫をしました。

共通するビジネスロジックを活用した

Android Auto対応は、端的に言えば「Android Auto用のレイアウトに適応する」対応です。

アプリの設計パターンにMVVMパターン等のビジネスロジックとプレゼンテーションロジックが分割できる設計パターンを採用している場合は、導入が簡単です。つまり、Android Auto用のView側の実装だけで済むのです。

カーナビタイムはMVVMパターンで設計されているため、開発は主にView側の実装となりました。ビジネスロジック側の実装は既存コードを流用できたため、開発工数を大きく削減できました。

画像9


開発と並行してクリアランス調査をした

Android Auto対応をリリースするにあたり、特許的に問題が無いか、利用規約に変更が必要か等、一デベロッパーとしてリリースして問題が無いか確認する必要があり、調査にある程度時間がかかります。
このクリアランス確認は別部署が担当しているため、開発と並行して確認依頼をすることで、効率よくタスクを進めました。

今後の展望

現状のカーナビタイムで目的地を設定するときはフリーワード検索を利用しますが、今後はそれに加えて周辺のジャンル検索住所検索自宅指定の追加を検討しています。

とはいえサードパーティに公開されているAndroid Autoライブラリの都合上できることがまだまだ少なく、どのデベロッパーが対応しても似たようなUIとなり差別化が図れないのが実情です。

今後、Android Autoライブラリのアップデート等でできることが増えれば、より便利な機能を追加したいと考えています!