1 Project Status
David Spitzer edited this page 2026-07-02 16:00:10 -07:00

Project Status

Last updated after the M3 (media/audio) milestone. For full detail and the milestone-by-milestone plan, see PLAN.md in the repo — this page is a lighter-weight summary.

The big caveat, up front

Nothing in this project has been tested against a real head unit yet. Everything below is built from aasdk/OpenAuto source, official and leaked Google documentation, and — where possible — automated tests that exercise real protocol logic (a real TLS handshake, real frame encoding) against itself. That's a meaningfully stronger foundation than "it compiles," but it is not the same as a car accepting a connection. The first real-hardware test is still ahead of us (2017 Ford Explorer / SYNC 3, wired).

M0 — Project scaffolding — done

Gradle/Android project structure, GrapheneOS-compatible (no Play services dependency anywhere).

M1 — USB handshake — mostly done

The raw AOAP control-transfer handshake (GET_PROTOCOL/SEND_STRING/START) is handled entirely by Android's kernel f_accessory USB gadget driver before any app runs — confirmed via research, not something we implement. Our job starts once Android hands us an attached UsbAccessory:

  • accessory_filter.xml + manifest intent-filter, matching the head unit's confirmed self-identification strings (manufacturer="Android", model="Android Auto").
  • UsbAccessoryConnection — permission request + openAccessory() to get the bulk pipe as streams.

Not yet verified: that a real head unit actually keeps the session open once we're this far.

M2 — Control channel & TLS handshake — implemented and unit-tested

  • Frame format (FrameHeader, FrameSize, ChannelId) confirmed against aasdk source, including fragmentation (FIRST/MIDDLE/LAST) for messages bigger than one frame.
  • ControlChannel handles VERSION_REQUEST/RESPONSE, drives the TLS handshake (TlsServerSession, phone as TLS server — the head unit is the TLS client), sends AUTH_COMPLETE, then SERVICE_DISCOVERY_REQUEST, and handles ChannelOpenResponse and PING_REQUEST/RESPONSE keepalive.
  • PhoneIdentity generates a self-signed cert via AndroidKeyStore for the phone's TLS identity.
  • Protobuf schema vendored from aasdk (aasdk_proto) via the com.google.protobuf Gradle plugin — this is why the project is GPLv3.
  • Tested: ControlChannelTest drives a real client-mode SSLEngine (standing in for the head unit) through an actual TLS 1.3 handshake against ControlChannel, verifying the whole sequence through to SERVICE_DISCOVERY_REQUEST. This caught a real bug: TLS 1.3 can emit more than one SSL_HANDSHAKE frame per exchange (session tickets sent right after the handshake finishes) — a naive one-request-one-response assumption breaks.

Open risk: whether a real head unit will accept the phone's self-signed cert at all is unverified — there's no public CA infrastructure for phones the way there is for HTTPS, so this is presumed to work the way aasdk's own hardcoded cert works for it.

M3 — Media/audio channel — in progress

  • AndroidAutoSession orchestrates which channels get opened based on the head unit's ServiceDiscoveryResponse, and dispatches messages to per-channel handlers.
  • MediaAudioChannel handles the audio channel's SETUP_REQUEST/START_INDICATION/STOP_INDICATION protocol.
  • AudioFileDecoder decodes a user-picked audio file to PCM via standard MediaExtractor/MediaCodec — independently testable without a car. MainActivity has a minimal UI (a "Choose Music" button) to pick a file; a 440Hz test tone remains as a fallback if none is picked, as a simpler pipeline probe.
  • Tested: MediaAudioChannelTest covers the setup/start/stop protocol and confirms a picked file's audio (not the tone) is what actually streams, byte-for-byte.

Not yet done: transport controls (play/pause/skip) from the head unit, resampling if the file's format doesn't match what the head unit negotiates, and the timestamped audio-media variant needed once video sync matters.

M4 onward — not started

Navigation/maps, calls/voice, polish, and wireless transport are all still just entries in the plan. See Screen Design for early thinking on M4's UI, which is being worked out ahead of the code.

Test vehicle

2017 Ford Explorer, SYNC 3, factory wired Android Auto. Testing will be wired (USB) first. See PLAN.md's "Test vehicle notes" section for cable/timing quirks specific to SYNC 3 worth knowing before testing.

Dev environment

Fully set up and reproducible — see Setup and Building and Testing.