mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-05-30 09:37:13 -04:00
4.8 KiB
4.8 KiB
title, parent, nav_order, last_updated, aliases
| title | parent | nav_order | last_updated | aliases | |||
|---|---|---|---|---|---|---|---|
| Architecture | Developer Guide | 1 | 2026-05-13 |
|
Architecture
The Meshtastic Android/Desktop/iOS application follows a modular Kotlin Multiplatform (KMP) architecture with clear layer boundaries.
Layer Overview
┌─────────────────────────────────────────────┐
│ androidApp / desktopApp │ Platform entry points
├─────────────────────────────────────────────┤
│ feature/* modules │ UI + Business Logic
├─────────────────────────────────────────────┤
│ core/* modules │ Shared infrastructure
├─────────────────────────────────────────────┤
│ Platform (Android/JVM/iOS) │ OS-specific bindings
└─────────────────────────────────────────────┘
Module Categories
androidApp/ — Android Application
The Android application entry point:
- Activity, Application, and Manifest definitions
- Koin DI module composition (
AppKoinModule) - Flavor-specific bindings (
google/,fdroid/) - Android-only integrations (widgets, services)
desktopApp/ — Desktop JVM Application
The Desktop (Linux/macOS/Windows) entry point:
- Compose Desktop window management
- Desktop-specific DI (
DesktopKoinModule) - Platform stubs for Android-only capabilities
- BLE (Kable), Serial, and TCP transport implementations
feature/* — Feature Modules
Each feature/ module owns a vertical slice of functionality:
| Module | Responsibility |
|---|---|
feature:intro |
Onboarding/welcome flow |
feature:messaging |
Messages, channels, contacts, quick chat |
feature:connections |
Bluetooth/USB/TCP connection management |
feature:map |
Map display, waypoints |
feature:node |
Node list, node detail, metrics |
feature:settings |
All configuration screens |
feature:firmware |
Firmware update flow |
feature:docs |
In-app documentation browser |
feature:wifi-provision |
WiFi provisioning |
feature:widget |
Android home screen widgets |
Feature modules:
- Use the
meshtastic.kmp.featureconvention plugin - Depend on
coremodules, never on otherfeaturemodules - Own their navigation entries and DI registrations
- Contain platform-specific implementations in
androidMain/jvmMain/iosMain
core/* — Core Modules
Shared infrastructure used by all features:
| Module | Responsibility |
|---|---|
core:common |
Utilities, extensions, build config |
core:navigation |
Routes, deep links, Navigation 3 |
core:ui |
Shared Compose components, icons, theme |
core:resources |
Shared string resources |
core:model |
Domain models |
core:data |
Data layer abstractions |
core:database |
Room KMP database |
core:datastore |
DataStore preferences |
core:prefs |
App preferences |
core:repository |
Repository interfaces |
core:service |
Mesh service layer |
core:di |
DI utilities |
core:network |
HTTP/serial/transport |
core:ble |
Bluetooth LE abstractions |
core:proto |
Protobuf definitions |
core:testing |
Test utilities |
KMP Source Sets
Each module uses the standard KMP source set hierarchy:
src/
├── commonMain/ ← Shared code (all platforms)
├── commonTest/ ← Shared tests
├── androidMain/ ← Android-specific
├── jvmMain/ ← Desktop JVM-specific
├── iosMain/ ← iOS-specific
└── jvmTest/ ← Desktop test host
Golden Rules:
- No
android.*imports incommonMain - Platform-specific code goes in appropriate source set
- Prefer interfaces + DI over
expect/actualfor complex behaviors - Use
expect/actualonly for simple declarations
Dependency Injection
The project uses Koin with annotation processing:
@Module,@Single,@Factoryannotations@ComponentScanfor automatic registration- Feature modules export their own
Feature*Moduleclass - App/Desktop compose all modules in their root DI configuration
Navigation
Navigation uses Navigation 3 with typed routes:
- All routes defined in
core/navigation/Routes.kt - Routes are
@Serializabledata classes/objects - Deep links resolved through
DeepLinkRouter - Each feature registers its own navigation entries
See Navigation & Deep Links for details.