If you’re tired of repeating the same dependencies across different modules in your Android project, you’re not alone. Managing dependencies manually is error-prone, messy, and not scalable. Fortunately, Bundles in libs.versions.toml offer a clean and modern solution that saves time and reduces duplication. Let’s break it down, step by step, in a simple way.
What Is libs.versions.toml?
Starting with Gradle 7 and Android Gradle Plugin 7+, Google introduced Version Catalogs — a new way to centralize and manage dependencies. Instead of scattering dependency strings across multiple build.gradle files, you can now define everything in a single place: libs.versions.toml.
This TOML (Tom’s Obvious Minimal Language) file lives in your project’s gradle folder and acts as your master dependency list.
Here’s what a basic libs.versions.toml file looks like:
[versions]
kotlin = "1.9.0"
coroutines = "1.7.1"
[libraries]
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }That’s great — but what if you’re using the same group of libraries in every module? Writing them out repeatedly is a waste of time. That’s where Bundles in libs.versions.toml come to the rescue.
What Are Bundles?
Bundles are a feature of version catalogs that let you group related dependencies under a single name. Think of them like playlists for your libraries. Instead of referencing each dependency one by one, you just call the bundle, and you’re done.
Why Use Bundles?
- Clean, organized code
- No repeated dependencies
- Easy updates across modules
- Better modularization
How to Create a Bundle in libs.versions.toml
Let’s say you’re using multiple Jetpack Compose libraries across several modules. Without bundles, you’d need to add each one like this:
implementation(libs.compose.ui)
implementation(libs.compose.material)
implementation(libs.compose.tooling)With Bundles in libs.versions.toml, you can simplify it like this:
Step 1: Define the Libraries
[versions]
compose = "1.5.0"
[libraries]
compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
compose-material = { module = "androidx.compose.material:material", version.ref = "compose" }
compose-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }Step 2: Create a Bundle
[bundles]
compose = ["compose-ui", "compose-material", "compose-tooling"]How to Use Bundles in build.gradle.kts
In your module’s build.gradle.kts file, just add:
implementation(libs.bundles.compose)That one-liner brings in all the Compose dependencies you need. Clean, right?
Real-World Use Case: Networking Stack
Let’s say you always use Retrofit, Moshi, and OkHttp in your data modules. Define a bundle like this:
[versions]
retrofit = "2.9.0"
moshi = "1.13.0"
okhttp = "4.10.0"
[libraries]
retrofit-core = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
moshi-core = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
[bundles]
networking = ["retrofit-core", "moshi-core", "okhttp-core"]Then in your module:
implementation(libs.bundles.networking)You’ve just replaced three lines with one — and centralized version control in the process.
Common Mistakes to Avoid
- Wrong syntax: The bundle array must reference exact keys from the
[libraries]block. - Missing versions: Always define versions under
[versions]and refer usingversion.ref. - Not reusing bundles: If two modules share the same libraries, don’t duplicate — bundle them.
Why Bundles in libs.versions.toml Matter for Android Developers
Bundles in libs.versions.toml are more than just a convenience—they’re a best practice. They improve your project structure, reduce maintenance overhead, and make scaling a breeze. Whether you’re working solo or on a large team, bundling dependencies is the smart way to manage complexity.
If you’re building modular Android apps (and let’s face it, who isn’t in 2025?), adopting bundles is a no-brainer.
Conclusion
The old way of managing dependencies is clunky and outdated. With Bundles in libs.versions.toml, you can streamline your workflow, stay DRY (Don’t Repeat Yourself), and future-proof your project.
Say goodbye to repetitive implementation lines and hello to clean, maintainable build scripts.
Start bundling today — and give your Android project the structure it deserves.
