Wadophone is an open source softphone for voice and video over IP calling and instant messaging.
It is fully SIP-based, for all calling, presence and IM features.
Wadophone is a fork of Linphone, developed and maintained by Belledonne Communications. All credit for the original design, SIP stack and core functionality goes to the Linphone project; this fork focuses on its own branding, and on a reduced feature set tailored to connecting to a personal or private SIP server (e.g. Asterisk) rather than Belledonne's own SIP service.
Compared to upstream Linphone, this fork:
- Only supports third-party SIP accounts (no Linphone-brand account creation/login).
- Has no group chat, group video conferencing, or "Meetings" section — only one-to-one calls and one-to-one conversations.
- Ships its own name, application ID, color scheme and icon (see CHANGELOG.md for the full list of changes).
There is no dedicated Google Play / F-Droid listing for Wadophone yet — build it yourself following the instructions below. If you're looking for the original Linphone app instead, it's available on Google Play and F-Droid.
Copyright © Wadophone contributors.
Like Linphone, Wadophone is licensed under the GNU/GPLv3 license, free and open source. Please make sure that you understand and agree with the terms of this license before using it (see the LICENSE file for details).
Linphone itself is dual licensed and also available under a proprietary license for closed source applications; that option applies to the original Linphone project only. Contact Belledonne Communications for any question about it.
This fork reuses Linphone's SIP engine (liblinphone) as a Maven dependency, so the underlying protocol documentation from the upstream project still applies:
- Supported features and RFCs: https://www.linphone.org/linphone-softphone/#linphone-fonctionnalites
- Linphone public wiki: https://wiki.linphone.org/xwiki/wiki/public/view/Linphone/
Wadophone has its own version numbering, independent from Linphone's, starting
at 1.0.0-alpha. The version name shown in the app and in the generated APK
file name (wadophone-android-<buildType>-<version>.apk) is computed from the
latest git tag reachable from the current commit (see the gitVersion logic
in app/build.gradle.kts): a build made exactly on a
tagged commit shows that tag as-is (e.g. 1.0.0-alpha), while later commits
show <tag>.<commits since tag>+<short commit hash>.
The project is currently on the alpha channel while the fork is being
tested end-to-end. Tag new releases as they're validated
(git tag -a x.y.z-alpha -m "...") and record what changed in
CHANGELOG.md.
This release only works on Android OS 9.0 and newer.
If you have Android Studio, simply open the project, wait for the gradle synchronization and then build/install the app.
It will download the Linphone SDK from Belledonne's Maven repository as an AAR file, so you don't have to build it yourself.
If you don't have Android Studio, you can build and install the app using gradle:
./gradlew assembleDebug
will compile the APK file (assembleRelease instead if you want to build a release package), and then
./gradlew installDebug
to install the generated APK from the previous step (use installRelease instead if you built a release package).
APK files are stored within ./app/build/outputs/apk/debug/ and ./app/build/outputs/apk/release/ directories.
When building a release AppBundle, use the releaseAppBundle target instead of release.
Also make sure you have an NDK installed and an environment variable named ANDROID_NDK_HOME that contains the path to the NDK, to be able to include native library symbols in the app bundle.
keystore.properties is a template with your own release keystore's info
(storePassword, keyPassword, keyAlias, storeFile). It's gitignored by
convention (app/wadophone-release.keystore), so generate your own keystore
and fill in the values before building a signed release variant — the debug
build doesn't need it.
Wadophone depends on the same linphone-sdk-android engine as Linphone. To build it locally instead of downloading the prebuilt AAR:
- Clone the linphone-sdk repository:
git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git --recursive
-
Follow the instructions in the linphone-sdk/README file to build the SDK.
-
Create or edit the gradle.properties file in $GRADLE_USER_HOME (usually ~/.gradle/) and add the absolute path to your linphone-sdk build directory, for example:
LinphoneSdkBuildDir=/home/<username>/linphone-sdk/build/
- Rebuild the app in Android Studio.
-
Install LLDB from SDK Tools in Android Studio.
-
In Android Studio go to Run -> Edit Configurations -> Debugger.
-
Select 'Dual' or 'Native' and add the path to the linphone-sdk debug libraries (
build/libs-debug/for example). -
Open the native file and set your breakpoint.
-
Make sure you're using the debug AAR (the release AAR is used by default even for debug builds, for faster build times).
-
Debug the app.
To get a symbolized stack trace from a native crash, you need the debug version of liblinphone (see "Building a local SDK" above, or download linphone-sdk-android-<version>-libs-debug.zip from https://download.linphone.org/maven_repository/org/linphone/linphone-sdk-android/ for the SDK version this app uses), plus the ndk-stack tool from the Android NDK.
adb logcat -d | ndk-stack -sym ./libs-debug/arm64-v8a/
(replace arm64-v8a with your device's actual CPU architecture if different; adb shell getprop ro.product.cpu.abi will tell you). This won't print anything until you reproduce the crash.
- If you hit a build error about
drawable/linphone_logo_tintednot being found, deleteapp/src/main/res/xml/contacts.xml(git clean -fworks) and rebuild. - If you get a
couldn't find "libc++_shared.so"crash on startup, clean the project in Android Studio and rebuild, and double-check the SDK was built for the right CPU architecture.
This fork ships without a google-services.json file (it was tied to Linphone's own Firebase project), so Firebase Cloud Messaging and Crashlytics are disabled by default. To enable push notifications, create your own Firebase project for your applicationId and drop your own app/google-services.json in place.
Translations are managed on Crowdin: https://crowdin.com/project/wadophone
Translation files live under app/src/main/res/values-<locale>/strings.xml, kept in sync with Crowdin via its GitHub integration, which opens a pull request whenever new translations are approved.
Edit the packageName variable in app/build.gradle.kts — the rest of the build (applicationId, manifest placeholders, file provider authority, etc.) picks it up automatically.