lvalen91/Carlink

Android App that enables Phone Projection via the Carlinkit CPC200-CCPA Adapter.

Kotlin

94

108 commits

updated Oct 14, 2026

See the code

README

Carlink

A native Kotlin reimplementation of the original Flutter-based app. Built for personal use and shared so others can use it. Please don't expect or demand support — I'll help where I can.

XDA Developer Forums thread · Report issues on GitHub or the forum.

Requirements

Status

Work in progress — something is always changing. Updates that ship without code changes are usually new documentation or corrections.

Target and only hardware-tested platform: a 2024 Silverado gminfo3.7 Intel AAOS radio, with an iPhone as the primary device (CarPlay is the most tuned). Some simulated testing was also done on a GM emulator running GM AAOS 14 (VCUUM platform, build 470.3). Everything else is untested. See Testing scope.

Installing

How you install depends on whether your head unit gives you ADB access.

GM production vehicles (no ADB)

GM's shipping radios expose no ADB and run only apps delivered through Google Play. There is no public Play listing for this app, so each user installs it through their own Google Play Developer Account:

  1. Enroll in the Google Play Console (one-time US$25 fee).
  2. Give the app a package name you own — change ownerApplicationId in app/build.gradle.kts (a fork must not reuse zeno.carlink), then build the play bundle (AAB).
  3. Create an app in the Console and upload that bundle to an Internal Testing track.
  4. Add your own Google account as an internal tester, accept the opt-in link, then install from the Play Store on the head unit while signed into that account.

The build is signed with your upload key/certificate, not the author's — that is expected and required. If you are new to the Play Console, search for a current "upload an app to an Internal Testing track" tutorial; the process is standard Android publishing and not specific to this app.

AAOS platforms with ADB access

If your platform exposes ADB, install the APK with the installer attributed to the Play Store:

adb install -i com.android.vending app-sideload-release.apk

The -i com.android.vending flag records Google Play as the installing package. AAOS considers the install source when deciding what may run while driving, so attributing the install to Play makes the system honor the app's Distraction Optimization declarations — showing and running it normally — instead of treating a plain sideload as non-optimized and restricting it. A signed sideload APK is attached to each GitHub Release, or you can build one yourself.

[!IMPORTANT] The APK in Releases is only for people who can freely sideload via ADB. It is already signed with the author's key and uses the zeno.carlink package name, so it cannot be uploaded to your own Google Play account — Play requires a package name you own and your own signing key/certificate. GM vehicles without ADB (see above) must build their own bundle with their own package name and key; the Release APK will not work for that path.

Key limitations

Full explanations in app notes:

  • Cluster song metadata can go blank after force-stop + relaunch — an AOSP limitation with no third-party fix. All other cases are fixed. Details
  • Navigation turn-by-turn is basic on stock adapter firmware; the custom firmware restores full iAP2 route data, and the app renders CarPlay maneuver icons on-device. Details
  • Cluster navigation icons work only on gminfo3.7 and only for this build — forks can publish but won't deliver cluster icons (Google locks the GM provider authority to its first publisher). Details
  • GM VCU (Bosch VCUNH1) vehicles ignore app-supplied cluster icons entirely. Details
  • HUD is untested (author's truck has none); some Silverado/Hummer EV users report nav shows. Details
  • "Not Supported" USB toast on GM AAOS 14+ — GM's USB admission code only recognizes a fixed set of device types; the adapter's working mode isn't one of them, which is why the old Carlinkit UDisk toggle was a workaround. Details

Custom adapter firmware

Optional. Adapter-side binaries were patched to (1) forward the full iAP2 navigation data Carlinkit otherwise strips, and (2) fix Android Auto's incorrect parsing of forwarded vehicle GPS NMEA. Not required, but gives a closer-to-stock experience. Firmware lives in CPC200-CCPA_resources. See notes.

Audio

If audio misbehaves, first disconnect and forget the phone/vehicle from each other's Bluetooth and grant the app microphone access — the adapter routes audio through itself by default. Steering-wheel voice/call control is a system feature this app can't provide; for it, set in-app adapter routing to Bluetooth instead. See audio routing.

Screenshots

From the Android emulator with USB passthrough for the CPC200-CCPA.

CarPlay (iPhone)Android Auto (Pixel 10)Dashboard
CarPlayAndroid AutoDashboard

Dashboard — the app's always-visible base screen; shows the box's advertised name and live connection phase, and sits behind the video while a session is streaming:

Idle, no phone connectedOver an active Android Auto session
Dashboard idleDashboard over projection

CarPlay dark mode — the app tells the box to switch CarPlay's own UI dark automatically, independent of the app's (always-dark) rendering:

CarPlay dark mode

Adapter configuration — applied on reboot via Apply & Restart:

Audio Visual Misc

App settings — control what is hidden/shown to give the projection stream more room:

Display mode

Log export & levels — export logs to a file via the Android documents picker (no extra folder permissions needed; can save to attached USB, subject to OS restrictions). Multiple log levels narrow troubleshooting to the area you need:

File logging Log levels

Documentation

The app is self-contained — this repo builds and runs on its own. The docs in this repo are the primary reference:

TopicWhereWhat it is
App behavior, limitations & design notesdocuments/reference/app-notes.mdThe detail behind this README
Reference docs indexdocuments/reference/Emulator, cluster, and platform notes

Accuracy isn't guaranteed, but it's the most detailed, centralized source short of the adapter/GM source itself. If you have direct adapter/GM-radio source, there's a site that will gladly publish it anonymously.

Supporting & reference material

Separate repos — not dependencies of this app — that back the research behind it or provide background:

RepoWhat it is
CPC200-CCPA_resourcesWork on the Carlinkit CPC200-CCPA adapter (firmware, reverse engineering)
gminfo_resourcesGM head-unit / gminfo3.7 AAOS platform reference
carlink_flutterThe original Flutter app this one reimplements
XDA Forums threadDiscussion and support; report issues here or on GitHub

Credits

Projects that started this and provided insight, inspiration, and a lot of help:

lvalen91/Carlink

Android App that enables Phone Projection via the Carlinkit CPC200-CCPA Adapter.

Kotlin

94

108 commits

updated Oct 14, 2026

See the code

README

Carlink

A native Kotlin reimplementation of the original Flutter-based app. Built for personal use and shared so others can use it. Please don't expect or demand support — I'll help where I can.

XDA Developer Forums thread · Report issues on GitHub or the forum.

Requirements

Status

Work in progress — something is always changing. Updates that ship without code changes are usually new documentation or corrections.

Target and only hardware-tested platform: a 2024 Silverado gminfo3.7 Intel AAOS radio, with an iPhone as the primary device (CarPlay is the most tuned). Some simulated testing was also done on a GM emulator running GM AAOS 14 (VCUUM platform, build 470.3). Everything else is untested. See Testing scope.

Installing

How you install depends on whether your head unit gives you ADB access.

GM production vehicles (no ADB)

GM's shipping radios expose no ADB and run only apps delivered through Google Play. There is no public Play listing for this app, so each user installs it through their own Google Play Developer Account:

  1. Enroll in the Google Play Console (one-time US$25 fee).
  2. Give the app a package name you own — change ownerApplicationId in app/build.gradle.kts (a fork must not reuse zeno.carlink), then build the play bundle (AAB).
  3. Create an app in the Console and upload that bundle to an Internal Testing track.
  4. Add your own Google account as an internal tester, accept the opt-in link, then install from the Play Store on the head unit while signed into that account.

The build is signed with your upload key/certificate, not the author's — that is expected and required. If you are new to the Play Console, search for a current "upload an app to an Internal Testing track" tutorial; the process is standard Android publishing and not specific to this app.

AAOS platforms with ADB access

If your platform exposes ADB, install the APK with the installer attributed to the Play Store:

adb install -i com.android.vending app-sideload-release.apk

The -i com.android.vending flag records Google Play as the installing package. AAOS considers the install source when deciding what may run while driving, so attributing the install to Play makes the system honor the app's Distraction Optimization declarations — showing and running it normally — instead of treating a plain sideload as non-optimized and restricting it. A signed sideload APK is attached to each GitHub Release, or you can build one yourself.

[!IMPORTANT] The APK in Releases is only for people who can freely sideload via ADB. It is already signed with the author's key and uses the zeno.carlink package name, so it cannot be uploaded to your own Google Play account — Play requires a package name you own and your own signing key/certificate. GM vehicles without ADB (see above) must build their own bundle with their own package name and key; the Release APK will not work for that path.

Key limitations

Full explanations in app notes:

  • Cluster song metadata can go blank after force-stop + relaunch — an AOSP limitation with no third-party fix. All other cases are fixed. Details
  • Navigation turn-by-turn is basic on stock adapter firmware; the custom firmware restores full iAP2 route data, and the app renders CarPlay maneuver icons on-device. Details
  • Cluster navigation icons work only on gminfo3.7 and only for this build — forks can publish but won't deliver cluster icons (Google locks the GM provider authority to its first publisher). Details
  • GM VCU (Bosch VCUNH1) vehicles ignore app-supplied cluster icons entirely. Details
  • HUD is untested (author's truck has none); some Silverado/Hummer EV users report nav shows. Details
  • "Not Supported" USB toast on GM AAOS 14+ — GM's USB admission code only recognizes a fixed set of device types; the adapter's working mode isn't one of them, which is why the old Carlinkit UDisk toggle was a workaround. Details

Custom adapter firmware

Optional. Adapter-side binaries were patched to (1) forward the full iAP2 navigation data Carlinkit otherwise strips, and (2) fix Android Auto's incorrect parsing of forwarded vehicle GPS NMEA. Not required, but gives a closer-to-stock experience. Firmware lives in CPC200-CCPA_resources. See notes.

Audio

If audio misbehaves, first disconnect and forget the phone/vehicle from each other's Bluetooth and grant the app microphone access — the adapter routes audio through itself by default. Steering-wheel voice/call control is a system feature this app can't provide; for it, set in-app adapter routing to Bluetooth instead. See audio routing.

Screenshots

From the Android emulator with USB passthrough for the CPC200-CCPA.

CarPlay (iPhone)Android Auto (Pixel 10)Dashboard
CarPlayAndroid AutoDashboard

Dashboard — the app's always-visible base screen; shows the box's advertised name and live connection phase, and sits behind the video while a session is streaming:

Idle, no phone connectedOver an active Android Auto session
Dashboard idleDashboard over projection

CarPlay dark mode — the app tells the box to switch CarPlay's own UI dark automatically, independent of the app's (always-dark) rendering:

CarPlay dark mode

Adapter configuration — applied on reboot via Apply & Restart:

Audio Visual Misc

App settings — control what is hidden/shown to give the projection stream more room:

Display mode

Log export & levels — export logs to a file via the Android documents picker (no extra folder permissions needed; can save to attached USB, subject to OS restrictions). Multiple log levels narrow troubleshooting to the area you need:

File logging Log levels

Documentation

The app is self-contained — this repo builds and runs on its own. The docs in this repo are the primary reference:

TopicWhereWhat it is
App behavior, limitations & design notesdocuments/reference/app-notes.mdThe detail behind this README
Reference docs indexdocuments/reference/Emulator, cluster, and platform notes

Accuracy isn't guaranteed, but it's the most detailed, centralized source short of the adapter/GM source itself. If you have direct adapter/GM-radio source, there's a site that will gladly publish it anonymously.

Supporting & reference material

Separate repos — not dependencies of this app — that back the research behind it or provide background:

RepoWhat it is
CPC200-CCPA_resourcesWork on the Carlinkit CPC200-CCPA adapter (firmware, reverse engineering)
gminfo_resourcesGM head-unit / gminfo3.7 AAOS platform reference
carlink_flutterThe original Flutter app this one reimplements
XDA Forums threadDiscussion and support; report issues here or on GitHub

Credits

Projects that started this and provided insight, inspiration, and a lot of help: