mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-02 20:16:07 +00:00
134 lines
5.5 KiB
Markdown
134 lines
5.5 KiB
Markdown
# Android App Development
|
|
|
|
This is a guide to contributing to the develop of the SimpleX android and desktop apps.
|
|
|
|
## Project Overview
|
|
|
|
This is the **Kotlin Multiplatform (KMP)** mobile and desktop client for SimpleX Chat, sharing code between Android and Desktop (JVM) platforms using Compose Multiplatform for UI.
|
|
|
|
## Build Commands
|
|
|
|
```bash
|
|
# Android debug APK
|
|
./gradlew assembleDebug
|
|
|
|
# Android release APK
|
|
./gradlew assembleRelease
|
|
|
|
# Desktop distribution (current OS)
|
|
./gradlew :desktop:packageDistributionForCurrentOS
|
|
|
|
# Run desktop/JVM tests
|
|
./gradlew desktopTest
|
|
|
|
# Run Android instrumented tests (requires connected device/emulator)
|
|
./gradlew connectedAndroidTest
|
|
|
|
# Build native libraries for all platforms
|
|
./gradlew common:cmakeBuild -PcrossCompile
|
|
|
|
# Clean build
|
|
./gradlew clean
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Module Structure
|
|
|
|
- **`common/`** - Shared code (Compose UI, models, business logic)
|
|
- `src/commonMain/` - Cross-platform code
|
|
- `src/androidMain/` - Android-specific implementations
|
|
- `src/desktopMain/` - Desktop-specific implementations
|
|
- **`android/`** - Android app container
|
|
- **`desktop/`** - Desktop JVM app container
|
|
|
|
### Key Components (`common/src/commonMain/kotlin/chat/simplex/common/`)
|
|
|
|
- **`model/ChatModel.kt`** - Main state container with reactive properties (MutableState, MutableStateFlow)
|
|
- **`model/SimpleXAPI.kt`** - API bindings to Haskell core library via FFI
|
|
- **`platform/Core.kt`** - FFI interface to native `libapp` library
|
|
- **`platform/`** - Platform abstraction layer (expect/actual pattern for Android/Desktop specifics)
|
|
- **`views/`** - Compose UI screens organized by feature (chat, chatlist, call, usersettings, etc.)
|
|
- **`ui/theme/`** - Design system (colors, typography, shapes)
|
|
|
|
### Native Integration
|
|
|
|
The app calls into a Haskell core library via JNI/FFI:
|
|
- CMake builds in `common/src/commonMain/cpp/android/` and `cpp/desktop/`
|
|
- Cross-compilation toolchains in `cpp/toolchains/`
|
|
- Built libraries go to `cpp/desktop/libs/` (organized by platform)
|
|
|
|
## Configuration
|
|
|
|
### `local.properties` (create from `local.properties.example`)
|
|
|
|
```properties
|
|
compression.level=0 # APK compression (0-9)
|
|
enable_debuggable=true # Debug mode
|
|
application_id.suffix=.debug # Multiple app instances on same device
|
|
app.name=SimpleX Debug # App name for debug builds
|
|
```
|
|
|
|
### `gradle.properties`
|
|
|
|
Contains versions (Kotlin, Compose, AGP) and app version info. Key settings:
|
|
- `kotlin.jvm.target=11`
|
|
- `database.backend=sqlite` (or `postgres`)
|
|
|
|
## Testing
|
|
|
|
Tests are in:
|
|
- `common/src/commonTest/kotlin/` - Cross-platform tests
|
|
- `common/src/desktopTest/kotlin/` - Desktop-specific tests (run with `./gradlew desktopTest`)
|
|
- `android/src/androidTest/` - Android instrumented tests
|
|
|
|
## Resources & Localization
|
|
|
|
- String resources: `common/src/commonMain/resources/MR/base/strings.xml` + 21 language variants
|
|
- Uses Moko Resources (`dev.icerock.moko:resources`) for cross-platform resource management
|
|
- The `adjustFormatting` gradle task validates string resources during build
|
|
|
|
## Platform-Specific Notes
|
|
|
|
### Android
|
|
- Min SDK 26, Target SDK 35
|
|
- NDK 23.1.7779620
|
|
- Supports ABI splits: `arm64-v8a`, `armeabi-v7a`
|
|
- Deep linking requires SHA certificate fingerprint in `assetlinks.json` (see README.md)
|
|
|
|
### Desktop
|
|
- Distributions: DMG (macOS), MSI/EXE (Windows), DEB (Linux)
|
|
- Mac signing/notarization configured via `local.properties`
|
|
- Video playback uses VLCJ
|
|
|
|
## Gotchas
|
|
|
|
#### SHA Signature for verification for app links/deep links
|
|
|
|
In order for the SimpleX app to be automatically adopted for opening links from https://simplex.chat the SHA certificate fingerprint for the App installed on the phone must be in the hosted [assetlinks.json](https://simplex.chat/.well-known/assetlinks.json) file on simplex.chat.
|
|
|
|
The accepted fingerprints are in the `sha256_cert_fingerprints` list.
|
|
|
|
To find your SHA certificate fingerprint perform the following steps.
|
|
|
|
1. Build and install your development version of the app as usual
|
|
2. From the terminal in Android studio run `adb shell pm get-app-links chat.simplex.app`
|
|
3. Copy the signature listed in `signatures` in the result
|
|
4. Add your signature to [assetlinks.json](https://github.com/simplex-chat/website/blob/master/.well-known/assetlinks.json) in the [website repo](https://github.com/simplex-chat/website) and make a PR. On approval, wait a few minutes for the changes to propagate to the public website and then you should be able to verify SimpleX.
|
|
|
|
More information is available [here](https://developer.android.com/training/app-links/verify-site-associations#manual-verification). If there is no response when running the `pm get-app-links` command, the intents in `AndroidManifest.xml` are likely misspecified. A verification attempt can be triggered using `adb shell pm verify-app-links --re-verify chat.simplex.app`.
|
|
|
|
Note that this is not an issue for the app store build of the app as this is signed with our app store credentials and thus there is a stable signature over users. Developers do not have general access to these credentials for development and testing.
|
|
|
|
## Adding icons
|
|
|
|
1. Find a [Material symbol](https://fonts.google.com/icons?icon.style=Rounded) in Rounded category.
|
|
|
|
2. Set weight to 400, grade to -25 and size to 48px.
|
|
|
|
3. Click on the icon, choose Android and download XML file.
|
|
|
|
4. Update the color to black (#FF000000) and the size to "24.dp", as in other icons.
|
|
|
|
For example, this is [add reaction icon](https://fonts.google.com/icons?selected=Material+Symbols+Rounded:add_reaction:FILL@0;wght@300;GRAD@-25;opsz@24&icon.style=Rounded).
|