Android Auto protocol re-implementation for GrapheneOS
  • Kotlin 96%
  • Shell 3.7%
  • Makefile 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-11 10:14:53 -07:00
.vscode Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
app Fix crash on launch: app had no Theme.AppCompat theme declared 2026-07-06 07:38:22 -07:00
docs Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
gradle Migrate to Gradle Daemon JVM toolchain auto-provisioning 2026-07-01 09:17:31 -07:00
scripts Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
.gitignore Scaffold Changeling Android project 2026-06-30 15:44:47 -07:00
AGENTS.md Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
build.gradle.kts Upgrade AGP to 9.2.1, Kotlin to 2.2.10, Gradle to 9.4.1 2026-07-01 09:15:34 -07:00
changeling.code-workspace Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
gradle.properties Upgrade AGP to 9.2.1, Kotlin to 2.2.10, Gradle to 9.4.1 2026-07-01 09:15:34 -07:00
gradlew Fix build: protoc output config, Cryptor interface, Android SSLEngine API 2026-07-01 08:23:00 -07:00
gradlew.bat Fix build: protoc output config, Cryptor interface, Android SSLEngine API 2026-07-01 08:23:00 -07:00
LICENSE Vendor aasdk's protobuf schema and switch project license to GPLv3 2026-07-01 07:42:24 -07:00
Makefile Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
PLAN.md Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
README.md Prepare hardware testing workflow 2026-08-11 10:14:53 -07:00
settings.gradle.kts Migrate to Gradle Daemon JVM toolchain auto-provisioning 2026-07-01 09:17:31 -07:00

Changeling

An Android app for GrapheneOS that implements the Android Auto head-unit protocol on the phone side, so a car's stock head unit can connect to it exactly as if it were talking to real Android Auto — no head unit modification, no Google Android Auto app, no Google Play services required.

Why

GrapheneOS deliberately ships without Google Play services, which is what the real Android Auto app depends on. Changeling's goal is to provide equivalent functionality (maps, music, calls, voice) by speaking the Android Auto wire protocol directly from a degoogled phone, so the car itself doesn't need to know or care that anything is different.

How it works (planned)

Android Auto's phone↔head-unit protocol ("AASP") has already been reverse-engineered by the open-source community, most notably by the OpenAuto / aasdk projects, which implement the head unit side in C++. Changeling implements the phone side, in Kotlin, natively on Android:

  1. Transport — USB accessory mode (AOAP), the same way a real phone connects to a car over a USB cable.
  2. Session layer — SSL/TLS handshake and protobuf-framed control messages that negotiate which services (media, navigation, input, sensors) are available.
  3. Service channels — audio output, video/rendering output for navigation, input events from the head unit's controls/touchscreen, and sensor data the car expects (e.g. GPS, night mode).
  4. App layer — a real navigation/maps backend and a media player feeding into those channels.

This is an interoperability project: re-implementing a documented, already-reverse-engineered protocol so two pieces of hardware (phone, car) that already expect to speak it can do so without Google's official client.

Status

Early protocol prototype. The app currently has USB accessory matching, bulk-frame transport, control-channel version negotiation, a TLS server handshake, auth completion, service discovery/channel-open support, and a first media-audio path using either a generated tone or a user-picked audio file.

The main remaining reality check is hardware validation with a real Android Auto head unit. The JVM/Robolectric tests prove the framing, TLS negotiation, and media-audio channel behavior are internally consistent, but they do not prove that a car will accept the session. See PLAN.md and docs/roadmap.md for the current milestone state.

Building

Standard Gradle/Android Studio project. Requires Android SDK 34, JDK 17.

./gradlew test
./gradlew assembleDebug

For first hardware-test setup, see docs/hardware-testing.md:

make prep-phone
make capture-logs

License

GPLv3. This project vendors the Android Auto protobuf schema from aasdk (app/src/main/proto/), which is GPLv3-licensed, so the project as a whole is too. See LICENSE.