Adding Third-Party Dependencies in a KMP

Codefy Labs's photo
Jun 6, 2024·

3 min read

Kotlin Multiplatform (KMP) allows you to share code between multiple platforms such as Android, iOS, and web applications. Adding third-party dependencies can significantly streamline development. Here's a straightforward guide to adding these dependencies to your KMP project, using the Napier logging library as an example.

Prerequisites

  1. Kotlin Multiplatform project setup: Ensure you have a working KMP project.

  2. Kotlin version: Verify that you're using a compatible Kotlin version for your dependencies.

Steps to Add Third-Party Dependencies

1. Identify Compatible Dependencies

Ensure that the third-party library supports Kotlin Multiplatform. Napier is a well-known logging library that supports KMP.

2. Modify the build.gradle.kts File

Open your project’s build.gradle.kts file. You need to add the dependencies in the appropriate source sets.

3. Add Dependency to Common Source Set

Add the dependency to the common source set if it’s available for all platforms.

kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.github.aakira:napier:2.1.0")
            }
        }
    }
}

4. Add Platform-Specific Dependencies

If the library has platform-specific implementations, add them to the respective source sets. For Napier, additional setup might not be necessary unless you want to customize platform-specific logging behavior. However, we will demonstrate adding some real platform-specific dependencies as examples.

Android

For Android, let's add Timber as an additional logging dependency.

kotlin {
    sourceSets {
        val androidMain by getting {
            dependencies {
                implementation("com.jakewharton.timber:timber:5.0.1")
            }
        }
    }
}

iOS

For iOS, let's add a specific dependency like Ktor for network operations as an example.

kotlin {
    sourceSets {
        val iosMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:2.0.0")
            }
        }
    }
}

5. Sync the Project

Sync your project to download and include the new dependencies.

6. Usage in Code

Import and use the library in your shared code or platform-specific code as required.

import io.github.aakira.napier.Napier

fun logMessage(message: String) {
    Napier.d(message)
}

Edge Cases

  1. Platform Limitations: Some libraries may only support specific platforms. Always check the library documentation.

  2. Version Conflicts: Ensure that the versions of the libraries are compatible with your Kotlin version and with each other.

  3. Platform-Specific Implementations: Some libraries might require different implementations for different platforms. Manage these in respective source sets.

Example

Here’s an example of adding the Napier logging library to your KMP project.

Adding to build.gradle.kts

kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.github.aakira:napier:2.1.0")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("com.jakewharton.timber:timber:5.0.1")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:2.0.0")
            }
        }
    }
}

Usage in Shared Code

import io.github.aakira.napier.Napier

fun logMessage(message: String) {
    Napier.d(message)
}

Initialization

Initialize Napier in your platform-specific code if needed:

Android

import android.app.Application
import io.github.aakira.napier.DebugAntilog

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Napier.base(DebugAntilog())
    }
}

iOS

import Napier

fun initializeNapier() {
    Napier.base(DebugAntilog())
}

Conclusion

Adding third-party dependencies in a KMP app is straightforward but requires attention to platform-specific details. Always ensure compatibility and manage dependencies appropriately in your source sets to streamline development and maximize code reuse across platforms. Using Napier as an example, you can easily integrate logging into your KMP projects while leveraging additional platform-specific libraries like Timber for Android and Ktor for iOS.