- Kotlin 59.8%
- C 34.4%
- Shell 4.1%
- CMake 1.7%
|
|
||
|---|---|---|
| .forgejo | ||
| app | ||
| docs/screenshots | ||
| gradle | ||
| scripts | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| README.md | ||
| settings.gradle.kts | ||
| THIRD_PARTY_NOTICES.md | ||
AndroidSip
A small, understandable SIP softphone for Android — Kotlin + Jetpack Compose on top of the baresip SIP engine via a native JNI bridge.
AndroidSip lets you use a normal SIP account on a phone without depending on
Android's deprecated SipManager API. Most of the SIP heavy lifting is done by
baresip; the Android side handles permissions, notifications, audio routing,
account storage, and making the call screen feel like a phone.
It is deliberately not a huge phone-system app — it registers one account and makes or receives calls, with a clean Material 3 UI.
Screenshots
| Dial (dark) | Recents (dark) | Dial (light) | Recents (light) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Features
- 📞 Make outgoing calls from the dial screen
- 📲 Receive incoming calls while the foreground service is running
- 🔗 Opens
sip:,sips:, andtel:links straight into the dialer - 🕐 Recent-calls history
- 🎛️ Answer, reject, hang up, mute, hold, speaker, DTMF, and call transfer
- 🔌 UDP, TCP, or TLS transport
- 🔐 SIP password stored encrypted with the Android Keystore
- 🌐 Re-registers automatically when the network changes (Wi-Fi ↔ mobile)
Architecture
The app is written in Kotlin with Jetpack Compose. The native SIP engine is baresip, built as Android static libraries and linked into the app with CMake.
┌─────────────────────────────────────────────┐
│ Compose UI (dial / call / recents / setup) │
├─────────────────────────────────────────────┤
│ SipRuntime + SipForegroundService │
├─────────────────────────────────────────────┤
│ SipEngine / NativeSipEngine (Kotlin) │
├─────────────────────────────────────────────┤
│ JNI bridge (app/src/main/cpp) │
├─────────────────────────────────────────────┤
│ baresip · libre · librem · OpenSSL │
└─────────────────────────────────────────────┘
The Android package is dev.local.androidsip. Important parts of the project:
| Path | What it is |
|---|---|
app/src/main/java/dev/local/androidsip/ |
Android app, UI, service, runtime |
app/src/main/java/dev/local/androidsip/sip/ |
SIP engine wrapper and baresip config |
app/src/main/cpp/ |
JNI bridge for baresip |
scripts/build_baresip_distribution.sh |
downloads and builds the native libraries |
THIRD_PARTY_NOTICES.md |
notes about baresip and the vendored bridge code |
Building
1. Build the native libraries
Before the Android app can build, the distribution/ folder must exist. It is
created from juha-h/libbaresip-android
by running:
scripts/build_baresip_distribution.sh
You need these tools installed:
- JDK
- Android SDK 36
- Android NDK
29.0.14206865 - CMake
make,git,wget,pkg-config,automake,autoconf,libtool,unzip
If the NDK is not found automatically, set ANDROID_NDK_HOME to the NDK path.
2. Build the app
./gradlew testDebugUnitTest
./gradlew assembleDebug
If the Gradle wrapper JAR is missing, create it once from a machine that already has Gradle installed:
gradle wrapper --gradle-version 9.4.1
Known limitations
- Incoming calls only work while the foreground service is running.
- No Android Telecom integration yet.
- The app does not start itself after reboot.
- WebSocket SIP transports are not exposed — the pinned native build does not include the baresip websocket transport modules.
netroam.sois not used; AndroidSip listens to Android network callbacks and asks baresip to re-register when the network changes.
Status
This is still an early personal project. The main call flow works, but it is not finished or polished yet. It should be a good base if you want to experiment with baresip on Android or need a small SIP client that is easy to understand.
License
AndroidSip is released under the MIT License. The bundled baresip,
libre, librem, and OpenSSL libraries keep their own licenses — see
THIRD_PARTY_NOTICES.md.



