- Kotlin 100%
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. |
||
|---|---|---|
| app | ||
| gradle | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| PLAN.md | ||
| README.md | ||
| settings.gradle.kts | ||
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:
- Transport — USB accessory mode (AOAP), the same way a real phone connects to a car over a USB cable.
- Session layer — SSL/TLS handshake and protobuf-framed control messages that negotiate which services (media, navigation, input, sensors) are available.
- 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).
- 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.