古いAndroidナビすらも永く使う喜び

何年か前、ネオクラシックカーにAndroidナビを搭載することで、新しい愛車との体験を作り、愛車をより長く楽しめるアプローチを紹介したことがありました。
その時、Androidナビはある意味小さいPCなので、車両診断やチューニングアプリをいつか統合して、やりたいことすべてが車内で完結し、車との対話をより深める体験を作りたいと考えていました。
今回のコンテンツは、それがもうほぼ実現できてしまったという話です。
しかも、新しいデバイスを自ら開発したわけではなく、既にあるものに少しの工夫を加えただけでより大きな体験価値を作れてしまった。
まさに、TSUNAGIの幹となる考え方を、具体的かつ分かりやすく表現できた事例です。
今回のコンテンツを書く目的は、僕が積み上げた知見に誰かがさらに知見を上乗せし、より良いものが残り続いていくことです。
E46M3///Launcher のこだわり
僕がインストールしているAndroidナビは、EONONのGA9450Bです。
2021年頃の製品だったかな?Android10だし、変更できないホーム画面も古く飽きてしまいました。

ちなみに、このユニットは設定画面では「Android 10」と名乗っているのですが、中を覗いてみると実体はAPI 27、つまりAndroid 8.1でした。バージョン表記だけが化粧されていたわけです。今回作ったランチャーがAPI 27に合わせてあるのは、そういう理由です。
このような、アフターマーケットプロダクトには、最新のメーカーデザインを望みがちですが、最新は飽きるのも早く都度変えるのも面倒です。
ですので、E46のアナログスタイルをデジタルで再現し、一貫性と調和を得ることで愛着を深化させることを目指しました。

具体的には、ボタンを5列×2段の10個に絞ってコンソールスイッチのように並べ、そのひとつひとつにソケット(受け皿)を描きました。上の情報窓は、E46の車載ディスプレイと同じ5×7ドットマトリクスの琥珀色で、時計と日付と外気温だけを出しています。背景はカーボン。
結果として、起動もずいぶん速くなりました。純正のホーム画面は起動に約5.9秒かかっていたのですが、置き換え後は0.8〜1.8秒です。目標だった0.8秒にはまだ届いていないので、ここは宿題として残っています。
隠しボタン - M
毎度おなじみ、K+DCANケーブルを接続すると、Mボタンが現れます。


ケーブルが挿さっていないときは、ボタンが消えるのではなく、ソケットに化粧板が嵌まるようにしました。隠しスイッチが存在する感を演出したかったからです。
ケーブルの判定は、FTDI(0x0403)とCH340(0x1A86)という2つのベンダーIDだけを見ています。製品IDまで細かく見ていないのは、わざとです。判定を厳しくしすぎて、ケーブルが挿さっているのにMボタンが出てこないほうが困るからです。出てきてしまう分には、押しても中身は無害ですから。
Mボタンを押すと僕が開発したチューニングツールにアクセスできる裏メニューが現れます。
現在は、CSLコンバートチューナーしか配置していませんが、近いうちにINPAの代りになるダイアグノシスアプリ(DIAG)を実装します。
(コーディングやプログラミング機能も追加で付ける予定です。)
そのため、MコンソールにはDIAGと整備履歴の場所を先に確保してあります。今は化粧板が嵌まっているだけで、アプリができたらそこに嵌め込むだけ。値が後から繋がってもレイアウトが1ミリも動かないようにしてあります。
※MSS54HP CSL CONVERT/// TUNERはひっそりとモバイル対応したので、AndroidナビやAndroidスマホでもチューニングができるようになっています。

車内では、これをブラウザとしてではなく全画面のアプリとして開くようにしました。アドレスバーもステータスバーも出ません。オフラインでも開きます。
使う機能のみ見えるところに並べた
多くのスマホやアプリにみられる、ごちゃごちゃと使わない機能まで並べられるとストレスです。
そのようなアプリは見える所に表示しないようにしました。
あまり使わないけど、使用できるアプリは、ミニマルで整列したUIで並べるようにしました。

アプリ一覧は、起動するたびに端末を数えて作っています。実車では19件でした。
ここで一度つまずいたのが、このメーカー独自の仕込みです。素直に数えると16件しか出てこないのですが、メーカーが独自に付けたラベルまで拾うと、今度は純正UIひとつだけで35個も並んでしまう。それらはアプリではなく、純正UIの中の「画面」だったんです。結局、独自ラベルは「他に入口を持たないアプリ」に限って拾うことにしました。
アイコンを読み込まず、頭文字のバッジで並べているのも意図的です。このユニットはアプリ1つに使えるメモリが192MBしかないので、19件分のアイコンを抱えるより、こちらのほうが速くて確実でした。
変形ロボのような動きを再現
隠しボタンに切り替わるUIを、なるべくアナログに近づけるように拘りました。
Mボタンを押すと、ボタンが裏に引っ込み、特別ボタンが裏からせり出てくる。

アナログボタンが機械的に置き換わるUXをアニメーションで再現しました。
上の画像は、その途中の一瞬を捕まえたものです。肉眼ではまず見えません。
沈み込みの量は、520分の300という数字から決めました。奥に300だけ下げて、520の距離から覗く。そう決めると、ボタンの見かけの大きさは0.634倍になります。実際にやっているのは縮小と減光だけなのですが、この比率だと奥に引っ込んだように見えるんですね。
そして列ごとに30ミリ秒ずつずらして動かします。左から順にパタパタと沈んでいく、あの感じです。全部終わるまで約1.26秒。
一番気を遣ったのは、2組のボタンを絶対に同時に画面へ出さないことでした。沈む側が消えるのが0.39秒、出てくる側が現れるのが0.40秒。この0.01秒の隙間があるおかげで、透けて重なることがありません。フェードで混ぜてしまうと、一気に「画面の描き替え」に見えてしまうんです。
ボタンがある場所に、背景色の化粧板を配置したのも拘りです。
これは、映画 TAXIや、特撮ヒーロー ウィンスペクターの影響をもろに受けています。
007のボンドカーもそうですよね。でも僕はTAXIの方が印象強めです。
データログのリアルタイム表示
これまでの開発で、E46M3の通信プロトコルとデータアドレス、数値変換ロジックを完全に解析可能になりました。

こうなると、どこになにをどのように配置するか自由自在です。
データ処理まで自在に行うことができます。
やっていることは、実はとても単純です。DMEに12 05 0B 03 1Fという5バイトを投げると、35バイトが返ってきます。その中の、
- 先頭2バイトが回転数
- 11バイト目が水温、12バイト目が油温、10バイト目が吸気温
- 15バイト目が外気温
- 16バイト目がバッテリー電圧
温度はどれも、返ってきた数字から48を引くだけで摂氏になります。ゲージを見ている間は、これを1秒に11回繰り返しています。
もう、Torqe Proやtesto、TrakAddictなどのアプリで取りたい値に困ることはありません。ネット検索をして誰かの開発を待つ必要もありません。
ここが一番清々しい気分を得られた部分です。
開発の苦労話
開発には、もちろんAIにお世話になったわけですが、AIがなんでも間でもやってくれるわけではありません。
AIと二人三脚で、時に僕も手を動かし開発を進めました。
AIにおまかせではなく、このようにできないか?という角度を変えた人間の質問力が肝
これまでの開発は、claude codeというAI開発ソフトを使い、PC画面にかじりついてAIの出力をチェックしながら指示を出すことが多いものでした。
それは、参考にするアプリやコードがどこかにあったからです。
今回、中華製Androidナビということで、解析コードやオープンソースコードはありません。
多くの人に愛されているプロダクト(E46M3のように)や、そうなることを狙ったプロダクトだと、解析コードがオープンソースで公開されています。
使い捨てイメージのある製品は解析も活発には行われていません。
なので、ソースコードを血眼になって探すより、解析のアプローチ(手順や考え方)を習得することに意味があります。
僕は、暇さえあれば、AIにぼくが実現したいことのアプローチを質問しまくってます。
長年僕のハードルだったのは、「通信プロトコル」の解析でした。
AIに通信プロトコルの規格の説明やドキュメント検索をお願いしても、見つかりませんでした。
あるとき、ふと「逆コンパイル」をAIにできないかと聞いたら、できちゃいました。
さらに、これまでは逆コンパイル後のコードの理解も僕にとって高い壁でした。
「逆コンパイルコードを理解できる?」と聞いたら、できるというのでやってもらいました。
僕にとってのブレイクスルーでした。
この質問ひとつが、結局2か所で効いています。ひとつはナビ本体の純正UIを開いて、外気温や車速を持っている入口を見つけたこと。もうひとつはBMW側の診断ファイルを開いて、どのバイトが何の値なのかという対応表を手に入れたことです。
いつも進むときは、これならできるかもしれない。無理かもしれない。の間にあることを聞いてみる。ことだと思ってます。
AIへの質問に限らず、人への問い合わせもですね。
技術を今知らなくても、やりながら覚える
今回の開発に至る前まで、ラズベリーパイやOSを独自開発したオリジナルデバイスを作ろうとしていました。
無駄な機能をそぎ落として、必要な機能だけを集めるにはそうするしかないと考えていたんです。
だけど、デバイス製作に必要な部品を調べているうちに、Androidナビには既に全部そろっていて、安価であることに気付いたんです。
あとは、ソフトウェアさえ制御できれば、夢は実現できる感覚がありました。
でも、オープンソースがなくてどうやってやるんだと途方にくれていました。
AIと対話を続けている中で、今回知った技術やツールは下記です。
- WebView … アプリの中でWebページを表示する仕組み。ただしこのナビのWebViewは中身が古く、チューナーはChromeで開く方針にしました
- ADB … PCから端末を操作する道具。このナビはUSB端子が「挿される側」ではないので、Wi-Fi経由で繋いでいます
- TWA … Webアプリをアドレスバー無しの全画面で開く仕組み。CSLチューナーはこれで動いています
- Service Worker … 一度開いたWebアプリをオフラインでも開けるようにする仕組み
- ランチャー … ホーム画面そのものを担当するアプリ。今回作ったのはこれです
- root … 端末の管理者権限。このユニットでは取れませんでした
- Androidエミュレーター … PCの中で動く仮想のAndroid端末。この記事の画面写真の何枚かはここで撮ったものです
並べてみて思うのですが、これらを勉強してから作り始めたわけではありません。全部、必要になって拾ったものです。
抽象的すぎない目標を定め、逆算して技術を組み立てる
振り返ってみると、車載ナビで車と対話するように自動チューニングをできるようにする、という最初の目標は、僕にとって抽象的すぎたのだと思います。
基板を選んで、OSを載せて、画面を用意して、車に固定する方法を考えて……。やることが多すぎて、どこから手を付けても完成の実感が薄い。だから何年も、構想のままでした。
流れが変わったのは、部品を調べているうちに「Androidナビには全部そろっている」と気付いた瞬間です。あれは新しい技術を覚えた瞬間ではなく、目標を具体的に置き直した瞬間でした。
目標が具体的になると、そこからは逆算になります。
車内で全部完結させたい。ならばソフトの制御権が要る。制御権を握るにはホーム画面そのものを置き換えればいい。ホーム画面には出したい数字がある。ならば通信プロトコルを解く必要がある。すでに作ってあるチューナーも車内で開きたい。ならばWebアプリを全画面で開く方法を調べればいい。
さきほど並べた技術の名前は、この矢印を1本ずつ辿った結果です。順番が逆だったら、たぶん今も勉強が終わっていません。
そして、目標の粒度感の話は、そのまま「これならできるかもしれない、無理かもしれない、の間を聞く」という話とつながっています。確実にできることを聞いても前には進まないし、明らかに無理なことを聞いても手が止まる。ちょうどその境目にあることを聞いたときだけ、景色が変わるんですよね。
結果として、ナビの中身を調べ始めてから実車に載せるまで、2日でした。何年も動かなかったものが、目標を分解しただけで2日です。
もっとも、まだ完成ではありません。
昼間の直射日光の下でちゃんと読めるかは、実はまだ確認できていません。実車に入れたのが夜の22時40分で、画面が夜モードだったからです。起動時間も目標に届いていないし、DIAGはまだ形になっていません。
でも、それでいいと思っています。全部できてから出すつもりでいたら、たぶんまた何年も出さなかったので。
冒頭に書いたとおり、このコンテンツの目的は、僕が積み上げた知見に誰かがさらに知見を上乗せし、より良いものが残り続いていくことです。
ですので、今回作ったランチャーは、調査メモも設計の記録も含めてすべて公開しました。
同じナビを積んだ方も、別のユニットの方も、ここから先は好きに持っていってください。うまくいかなかった話も、間違えて訂正した話も、そのまま残してあります。そちらのほうが役に立つと思うので。
古いAndroidナビすらも、まだまだ永く使えます。
僕と同じモデルはもう購入できないけど、現在のモデルでも同じことができるかもしれません。
E46用の現行モデルは2機種です。(いずれも2026年8月7日時点)
Android 14、4GB RAM、Bluetooth 5.4。世代としては一番新しいのがこちら。

Android 13ですが、6GB RAMでチップも上位の、上のグレードがこちら。

僕のGA9450Bが実質Android 8.1だったことを思うと、ずいぶん新しくなりました。
ただ、新しければそのまま同じ手が通るわけでもありません。たとえばAndroid 11以降は、インストール済みアプリの一覧を取ること自体にひと手間が要ります。今回のアプリ一覧の作り方は、そのまま持っていっても動かないはずです。
このあたりは、僕もまだ実機で確かめていません。どなたかが試して、知見を上乗せしてくださると嬉しいです。


