[!IMPORTANT] I have shifted my focus to Carlink Native
Open-source Projection Android App for Apple CarPlay and Android Auto using the Carlinkit CPC200-CCPA adapter.
Apple CarPlay and Android Auto projection
Carlinkit CPC200-CCPA (Amazon US)
About This Project:
Carlink is a modernization of the original "Carplay" project by Abuharsky, designed as an open-source alternative to the proprietary Carlinkit AutoKit application. This project provides:
Credits & Prior Works
This project builds upon the foundational research and implementations from:
Project Structure:
carlink/
├── lib/ - Flutter plugin implementation
│ ├── carlink.dart - Main API (421 lines)
│ ├── carlink_method_channel.dart - Native messaging bridge
│ ├── carlink_platform_interface.dart - Platform abstraction
│ ├── driver/ - CPC200-CCPA protocol implementation
│ │ ├── adaptr_driver.dart - Protocol orchestration, initialization
│ │ ├── readable.dart - Message parsing (13 types)
│ │ ├── sendable.dart - Message serialization
│ │ └── usb/
│ │ └── usb_device_wrapper.dart - USB lifecycle management
│ ├── console_log_listener.dart - Console logging
│ ├── file_log_manager.dart - File-based logging with rotation
│ ├── logging_lifecycle_manager.dart - Logging coordination
│ ├── log.dart - Centralized logging system
│ ├── common.dart - Shared utilities
│ └── usb.dart - USB abstractions
├── android/ - Native Android implementation
│ └── src/main/kotlin/com/carlink/
│ ├── CarlinkPlugin.kt - FlutterPlugin entry point
│ ├── handlers/ - Modular method call handlers
│ │ ├── MethodCallDispatcher.kt
│ │ ├── UsbDeviceHandler.kt
│ │ ├── BulkTransferHandler.kt
│ │ ├── VideoHandler.kt
│ │ └── DisplayMetricsHandler.kt
│ ├── UsbDeviceManager.kt - USB device discovery
│ ├── BulkTransferManager.kt - USB I/O operations
│ ├── VideoTextureManager.kt - Texture lifecycle
│ ├── H264Renderer.java - MediaCodec, Intel QuickSync
│ ├── PacketRingByteBuffer.java - 16MB ring buffer
│ ├── TextureRender.java - OpenGL ES2 rendering
│ ├── OutputSurface.java - EGL surface management
│ ├── DualStreamAudioManager.kt - 4-stream audio playback
│ ├── MicrophoneCaptureManager.kt - Microphone capture
│ ├── AudioRingBuffer.kt - Jitter-compensating audio buffer
│ ├── AppExecutors.java - Thread pool management
│ └── LogCallback.java - Native logging bridge
├── example/ - Example Android application
│ ├── lib/
│ │ ├── main.dart - App entry point
│ │ ├── main_page.dart - Video projection UI
│ │ ├── settings_page.dart - Tabbed settings interface
│ │ ├── theme.dart - Material theme configuration
│ │ ├── immersive_preference.dart - Fullscreen settings
│ │ └── settings/ - Modular settings components
│ │ ├── status_tab_content.dart
│ │ ├── control_tab_content.dart
│ │ ├── logs_tab_content.dart
│ │ ├── status_monitor.dart
│ │ ├── logging_preferences.dart
│ │ ├── enhanced_sharing.dart
│ │ ├── settings_enums.dart
│ │ ├── settings_tab_base.dart
│ │ ├── delete_confirmation_dialog.dart
│ │ ├── export_warning_dialog.dart
│ │ └── transfer_dialog.dart
│ └── android/ - Build from here for APK/AAB
└── docs/ - Technical documentation
├── project.md - Comprehensive technical analysis
├── Firmware/ - CPC200-CCPA specifications
├── GM/ - GM infotainment specs
└── Autokit_reference_only/ - Original AutoKit reference
Development Environment:
Android
Note: Flutter must be installed as both an Android Studio plugin AND as a standalone SDK. See Flutter installation guide.
Building from Source:
Quick Start:
Configure Application Identity
Edit project_config.gradle in the root directory:
myApplicationId = "com.your.app" // Your unique package name
myApplicationName = "Carlink" // App display name
myVersionCode = 1 // Play Store version code
myVersionName = "1.0.0" // User-visible version
The build system automatically:
TEMPLATE_PACKAGEMainActivity.kt with correct package nameLoad Flutter + Dart SDKs
Carlink/example/android/, run:
flutter clean && flutter pub get && ./gradlew clean
Build with Android Studio
Carlink/example/android./gradlew assembleReleaseFeatures:
Video Projection
Audio Playback & Microphone
Settings UI (Modular Architecture)
Logging System
Performance Monitoring
Current Limitations:
My Hardware:
Primary Test Platform:
Compatibility Notes:
-- Documentation
The docs/ directory contains technical documentation:
These documents provide detailed information about:
Architecture & Performance
Flutter Plugin Layer:
lib/carlink.dart - Main API with lifecycle management (421 lines)lib/carlink_method_channel.dart - Native messaging bridge (357 lines)lib/carlink_platform_interface.dart - Platform abstraction (130 lines)lib/driver/adaptr_driver.dart - CPC200-CCPA protocol orchestration (375 lines)lib/driver/readable.dart - Message parsing for 13 protocol message types (446 lines)lib/driver/sendable.dart - Message serialization (Touch, MultiTouch, Commands) (375 lines)lib/driver/usb/usb_device_wrapper.dart - USB device lifecycle management (355 lines)lib/log.dart - Centralized logging with tag filtering (324 lines)lib/file_log_manager.dart - File-based logging with rotation (422 lines)Android Native Layer (Handler-Based Architecture):
CarlinkPlugin.kt - FlutterPlugin entry pointhandlers/MethodCallDispatcher.kt - Routes method calls to specialized handlershandlers/UsbDeviceHandler.kt - USB device lifecycle managementhandlers/BulkTransferHandler.kt - USB read/write operationshandlers/VideoHandler.kt - Video texture managementhandlers/DisplayMetricsHandler.kt - Screen resolution detectionUsbDeviceManager.kt - USB device discovery and permissionsBulkTransferManager.kt - Bulk transfer retry logic and error recoveryVideoTextureManager.kt - Texture lifecycle coordinationH264Renderer.java - MediaCodec integration with adaptive buffer pools (6-20 buffers)PacketRingByteBuffer.java - 16MB ring buffer with dynamic resizeTextureRender.java - OpenGL ES2 external texture renderingOutputSurface.java - EGL surface managementCarLinkMessage.java - Protocol message wrapperCarLinkMessageHeader.java - Message header parsingExample Application:
example/lib/main.dart - App entry point with logging initialization (99 lines)example/lib/main_page.dart - Video projection with multitouch processing (361 lines)example/lib/settings_page.dart - Tabbed settings interface (148 lines)example/lib/theme.dart - Material Design theme configurationexample/lib/immersive_preference.dart - Fullscreen mode persistenceexample/lib/settings/ - 11 modular settings components:
status_tab_content.dart - Real-time adapter status displaycontrol_tab_content.dart - Device control commandslogs_tab_content.dart - Log file management UIstatus_monitor.dart - Adapter status polling servicelogging_preferences.dart - Log level persistenceenhanced_sharing.dart - AAOS-compatible file sharingPerformance Characteristics
Important Notes
Modifying Dart Protocol Code
Exercise caution when modifying lib/driver/adaptr_driver.dart, lib/driver/readable.dart, or lib/driver/sendable.dart files. The CPC200-CCPA communication protocol is based on reverse engineering from several years ago when Carlinkit App+firmware was decrypted.
The initialization sequence and communication logic must remain compatible with the adapter firmware. Breaking changes can prevent the adapter from functioning correctly.
Firmware Limitations
Adding new adapter features is not currently possible without reverse engineering the latest Carlinkit firmware. The adapter's capabilities are limited to what was documented during the original App+firmware decryption.
For firmware research: CPC200-CCPA-Firmware-Dump repository
Centralized Build Configuration
All version numbers, SDK levels, and package identifiers are managed in project_config.gradle. This file is the single source of truth for:
Update this file before publishing to Google Play Store. The automated build system handles package generation and cleanup.
Support & Issues
Consider this repo AS-IS without any support, do with it as you please. Updates are pushed out as I find things to fix, add, or remove. So Fork it or copy and make your own repo, MIT license and all that.
[!IMPORTANT] I have shifted my focus to Carlink Native
Open-source Projection Android App for Apple CarPlay and Android Auto using the Carlinkit CPC200-CCPA adapter.
Apple CarPlay and Android Auto projection
Carlinkit CPC200-CCPA (Amazon US)
About This Project:
Carlink is a modernization of the original "Carplay" project by Abuharsky, designed as an open-source alternative to the proprietary Carlinkit AutoKit application. This project provides:
Credits & Prior Works
This project builds upon the foundational research and implementations from:
Project Structure:
carlink/
├── lib/ - Flutter plugin implementation
│ ├── carlink.dart - Main API (421 lines)
│ ├── carlink_method_channel.dart - Native messaging bridge
│ ├── carlink_platform_interface.dart - Platform abstraction
│ ├── driver/ - CPC200-CCPA protocol implementation
│ │ ├── adaptr_driver.dart - Protocol orchestration, initialization
│ │ ├── readable.dart - Message parsing (13 types)
│ │ ├── sendable.dart - Message serialization
│ │ └── usb/
│ │ └── usb_device_wrapper.dart - USB lifecycle management
│ ├── console_log_listener.dart - Console logging
│ ├── file_log_manager.dart - File-based logging with rotation
│ ├── logging_lifecycle_manager.dart - Logging coordination
│ ├── log.dart - Centralized logging system
│ ├── common.dart - Shared utilities
│ └── usb.dart - USB abstractions
├── android/ - Native Android implementation
│ └── src/main/kotlin/com/carlink/
│ ├── CarlinkPlugin.kt - FlutterPlugin entry point
│ ├── handlers/ - Modular method call handlers
│ │ ├── MethodCallDispatcher.kt
│ │ ├── UsbDeviceHandler.kt
│ │ ├── BulkTransferHandler.kt
│ │ ├── VideoHandler.kt
│ │ └── DisplayMetricsHandler.kt
│ ├── UsbDeviceManager.kt - USB device discovery
│ ├── BulkTransferManager.kt - USB I/O operations
│ ├── VideoTextureManager.kt - Texture lifecycle
│ ├── H264Renderer.java - MediaCodec, Intel QuickSync
│ ├── PacketRingByteBuffer.java - 16MB ring buffer
│ ├── TextureRender.java - OpenGL ES2 rendering
│ ├── OutputSurface.java - EGL surface management
│ ├── DualStreamAudioManager.kt - 4-stream audio playback
│ ├── MicrophoneCaptureManager.kt - Microphone capture
│ ├── AudioRingBuffer.kt - Jitter-compensating audio buffer
│ ├── AppExecutors.java - Thread pool management
│ └── LogCallback.java - Native logging bridge
├── example/ - Example Android application
│ ├── lib/
│ │ ├── main.dart - App entry point
│ │ ├── main_page.dart - Video projection UI
│ │ ├── settings_page.dart - Tabbed settings interface
│ │ ├── theme.dart - Material theme configuration
│ │ ├── immersive_preference.dart - Fullscreen settings
│ │ └── settings/ - Modular settings components
│ │ ├── status_tab_content.dart
│ │ ├── control_tab_content.dart
│ │ ├── logs_tab_content.dart
│ │ ├── status_monitor.dart
│ │ ├── logging_preferences.dart
│ │ ├── enhanced_sharing.dart
│ │ ├── settings_enums.dart
│ │ ├── settings_tab_base.dart
│ │ ├── delete_confirmation_dialog.dart
│ │ ├── export_warning_dialog.dart
│ │ └── transfer_dialog.dart
│ └── android/ - Build from here for APK/AAB
└── docs/ - Technical documentation
├── project.md - Comprehensive technical analysis
├── Firmware/ - CPC200-CCPA specifications
├── GM/ - GM infotainment specs
└── Autokit_reference_only/ - Original AutoKit reference
Development Environment:
Android
Note: Flutter must be installed as both an Android Studio plugin AND as a standalone SDK. See Flutter installation guide.
Building from Source:
Quick Start:
Configure Application Identity
Edit project_config.gradle in the root directory:
myApplicationId = "com.your.app" // Your unique package name
myApplicationName = "Carlink" // App display name
myVersionCode = 1 // Play Store version code
myVersionName = "1.0.0" // User-visible version
The build system automatically:
TEMPLATE_PACKAGEMainActivity.kt with correct package nameLoad Flutter + Dart SDKs
Carlink/example/android/, run:
flutter clean && flutter pub get && ./gradlew clean
Build with Android Studio
Carlink/example/android./gradlew assembleReleaseFeatures:
Video Projection
Audio Playback & Microphone
Settings UI (Modular Architecture)
Logging System
Performance Monitoring
Current Limitations:
My Hardware:
Primary Test Platform:
Compatibility Notes:
-- Documentation
The docs/ directory contains technical documentation:
These documents provide detailed information about:
Architecture & Performance
Flutter Plugin Layer:
lib/carlink.dart - Main API with lifecycle management (421 lines)lib/carlink_method_channel.dart - Native messaging bridge (357 lines)lib/carlink_platform_interface.dart - Platform abstraction (130 lines)lib/driver/adaptr_driver.dart - CPC200-CCPA protocol orchestration (375 lines)lib/driver/readable.dart - Message parsing for 13 protocol message types (446 lines)lib/driver/sendable.dart - Message serialization (Touch, MultiTouch, Commands) (375 lines)lib/driver/usb/usb_device_wrapper.dart - USB device lifecycle management (355 lines)lib/log.dart - Centralized logging with tag filtering (324 lines)lib/file_log_manager.dart - File-based logging with rotation (422 lines)Android Native Layer (Handler-Based Architecture):
CarlinkPlugin.kt - FlutterPlugin entry pointhandlers/MethodCallDispatcher.kt - Routes method calls to specialized handlershandlers/UsbDeviceHandler.kt - USB device lifecycle managementhandlers/BulkTransferHandler.kt - USB read/write operationshandlers/VideoHandler.kt - Video texture managementhandlers/DisplayMetricsHandler.kt - Screen resolution detectionUsbDeviceManager.kt - USB device discovery and permissionsBulkTransferManager.kt - Bulk transfer retry logic and error recoveryVideoTextureManager.kt - Texture lifecycle coordinationH264Renderer.java - MediaCodec integration with adaptive buffer pools (6-20 buffers)PacketRingByteBuffer.java - 16MB ring buffer with dynamic resizeTextureRender.java - OpenGL ES2 external texture renderingOutputSurface.java - EGL surface managementCarLinkMessage.java - Protocol message wrapperCarLinkMessageHeader.java - Message header parsingExample Application:
example/lib/main.dart - App entry point with logging initialization (99 lines)example/lib/main_page.dart - Video projection with multitouch processing (361 lines)example/lib/settings_page.dart - Tabbed settings interface (148 lines)example/lib/theme.dart - Material Design theme configurationexample/lib/immersive_preference.dart - Fullscreen mode persistenceexample/lib/settings/ - 11 modular settings components:
status_tab_content.dart - Real-time adapter status displaycontrol_tab_content.dart - Device control commandslogs_tab_content.dart - Log file management UIstatus_monitor.dart - Adapter status polling servicelogging_preferences.dart - Log level persistenceenhanced_sharing.dart - AAOS-compatible file sharingPerformance Characteristics
Important Notes
Modifying Dart Protocol Code
Exercise caution when modifying lib/driver/adaptr_driver.dart, lib/driver/readable.dart, or lib/driver/sendable.dart files. The CPC200-CCPA communication protocol is based on reverse engineering from several years ago when Carlinkit App+firmware was decrypted.
The initialization sequence and communication logic must remain compatible with the adapter firmware. Breaking changes can prevent the adapter from functioning correctly.
Firmware Limitations
Adding new adapter features is not currently possible without reverse engineering the latest Carlinkit firmware. The adapter's capabilities are limited to what was documented during the original App+firmware decryption.
For firmware research: CPC200-CCPA-Firmware-Dump repository
Centralized Build Configuration
All version numbers, SDK levels, and package identifiers are managed in project_config.gradle. This file is the single source of truth for:
Update this file before publishing to Google Play Store. The automated build system handles package generation and cleanup.
Support & Issues
Consider this repo AS-IS without any support, do with it as you please. Updates are pushed out as I find things to fix, add, or remove. So Fork it or copy and make your own repo, MIT license and all that.