Android Auto protocol re-implementation for GrapheneOS
Find a file
David Spitzer ab1dee1a09 Fix crash on launch: app had no Theme.AppCompat theme declared
MainActivity extends AppCompatActivity and calls setContentView(), which
requires a Theme.AppCompat descendant theme — the manifest had no
android:theme at all, so the app crashed immediately on real hardware
with 'You need to use a Theme.AppCompat theme (or descendant) with this
activity.' First bug caught by testing on the actual Pixel 10a.
2026-07-06 07:38:22 -07:00
app Fix crash on launch: app had no Theme.AppCompat theme declared 2026-07-06 07:38:22 -07:00
gradle Migrate to Gradle Daemon JVM toolchain auto-provisioning 2026-07-01 09:17:31 -07:00
.gitignore Scaffold Changeling Android project 2026-06-30 15:44:47 -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
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
PLAN.md Document the screen design decision: map + now-playing dock, blue theme, media-session integration 2026-07-02 16:32:33 -07:00
README.md Vendor aasdk's protobuf schema and switch project license to GPLv3 2026-07-01 07:42:24 -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 scaffolding — no protocol implementation yet. See PLAN.md for the milestone roadmap.

Building

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

./gradlew assembleDebug

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.