mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-06-13 08:25:07 -04:00
134 lines
4.8 KiB
Markdown
134 lines
4.8 KiB
Markdown
---
|
|
title: Architecture
|
|
parent: Developer Guide
|
|
nav_order: 1
|
|
last_updated: 2026-05-13
|
|
aliases:
|
|
- layers
|
|
- module-architecture
|
|
- kmp
|
|
---
|
|
|
|
# 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.feature` convention plugin
|
|
- Depend on `core` modules, never on other `feature` modules
|
|
- 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 in `commonMain`
|
|
- Platform-specific code goes in appropriate source set
|
|
- Prefer interfaces + DI over `expect`/`actual` for complex behaviors
|
|
- Use `expect`/`actual` only for simple declarations
|
|
|
|
## Dependency Injection
|
|
|
|
The project uses **Koin** with annotation processing:
|
|
- `@Module`, `@Single`, `@Factory` annotations
|
|
- `@ComponentScan` for automatic registration
|
|
- Feature modules export their own `Feature*Module` class
|
|
- 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 `@Serializable` data classes/objects
|
|
- Deep links resolved through `DeepLinkRouter`
|
|
- Each feature registers its own navigation entries
|
|
|
|
See [Navigation & Deep Links](navigation-and-deep-links) for details.
|
|
|
|
---
|
|
|