Android Studio refused to sync the project after the lightning-kmp-app bump in4e939c4: Using multiple versions of the Android Gradle Plugin [9.1.1, 9.4.0] across Gradle builds is not allowed. Affected builds: [:, :lightning-kmp-app:lightning-kmp:bitcoin-kmp:secp256k1-kmp] A composite build has to settle on a single AGP version across every build that applies the plugin. Four builds in this tree do: : 9.1.1 version catalog :lightning-kmp-app 9.1.1 version catalog :secp256k1-frost-kmp 9.1.1 version catalog :lightning-kmp-app:lightning-kmp:bitcoin-kmp:secp256k1-kmp 9.4.0 hardcoded lightning-kmp and bitcoin-kmp apply no android plugin at all, which is why the message names only the two ends of the chain rather than everything between them. secp256k1-kmp pins 9.4.0 twice -- a buildscript classpath entry, and a pluginManagement resolutionStrategy that rewrites every requested com.android plugin to that version -- so it cannot be talked out of it from here. The three catalogs move up to meet it. Pinning it down to 9.1.1 instead would mean editing a build four submodules deep and then committing in bitcoin-kmp and lightning-kmp purely to carry the pointer, for no gain. Moving up is also the direction the chain already set: bbba08b's f22c30a moved every build in it onto Gradle 9.7.1 for the same reason, and4e939c4followed. Submodule commits carried here: lightning-kmp-app bbba08b -> ce1ed01 build: move to AGP 9.4.0, matching the version the submodule chain pins secp256k1-frost-kmp d3b294d -> 80a55b7 build: move to AGP 9.4.0 to match the rest of mantra-kmp's composite Both sit on branches (build/agp-9.4.0 and build/gate-ios-targets-on-macos) rather than their masters, and neither is pushed yet, so a fresh clone cannot resolve these two pointers until they are. 9.4.0 is a minor bump inside the AGP 9.x line, so the DSL is unchanged and every android.* flag in gradle.properties -- newDsl, builtInKotlin, the r8 settings -- keeps its meaning. `:composeApp:compileDebugKotlinAndroid` passes clean. Note that this is only what the IDE needs to sync, not everything worth knowing about the chain. bitcoin-kmp's settings.gradle.kts substitutes secp256k1-kmp, -jni-jvm and the three -jni-jvm-{linux,darwin,mingw} coordinates, but not -jni-android. So the android app still resolves secp256k1-kmp-jni-android from maven central at stock 0.24.0, without the FROST/prefractal native modules the threshold branch exists to provide, and a call into those from android would fail with UnsatisfiedLinkError. Fixing that needs a substitution rule in bitcoin-kmp. Untouched here because it is a runtime concern, not a sync one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This is a Kotlin Multiplatform project targeting Android, iOS, Desktop (JVM).
-
/composeApp is for code that will be shared across your Compose Multiplatform applications. It contains several subfolders:
- commonMain is for code that’s common for all targets.
- Other folders are for Kotlin code that will be compiled for only the platform indicated in the folder name. For example, if you want to use Apple’s CoreCrypto for the iOS part of your Kotlin app, the iosMain folder would be the right place for such calls. Similarly, if you want to edit the Desktop (JVM) specific part, the jvmMain folder is the appropriate location.
-
/iosApp contains iOS applications. Even if you’re sharing your UI with Compose Multiplatform, you need this entry point for your iOS app. This is also where you should add SwiftUI code for your project.
Build and Run Android Application
To build and run the development version of the Android app, use the run configuration from the run widget in your IDE’s toolbar or build it directly from the terminal:
- on macOS/Linux
./gradlew :composeApp:assembleDebug - on Windows
.\gradlew.bat :composeApp:assembleDebug
Build and Run Desktop (JVM) Application
To build and run the development version of the desktop app, use the run configuration from the run widget in your IDE’s toolbar or run it directly from the terminal:
- on macOS/Linux
./gradlew :composeApp:run - on Windows
.\gradlew.bat :composeApp:run
Build and Run iOS Application
To build and run the development version of the iOS app, use the run configuration from the run widget in your IDE’s toolbar or open the /iosApp directory in Xcode and run it from there.
Learn more about Kotlin Multiplatform…