Skip to content

Commit 290f744

Browse files
fix: restore ABI compatibility for runOnKoinStarted + add apiCheck to CI
- Add @file:JvmName("KoinWaitExtKt") and @file:JvmMultifileClass to KoinWaitExt.jvm.kt and KoinWaitExt.kt to restore the original JVM symbol for runOnKoinStarted, fixing binary incompatibility between 4.1.x and 4.2.0 (#2391) - Add apiCheck step to build.yml CI workflow so binary compatibility is validated on every PR, preventing future ABI breaks - Update all .api dump files to reflect current public API surface (koin-core, koin-android, koin-core-coroutines, koin-core-viewmodel, koin-androidx-workmanager, koin-ktor) Fixes #2391 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9cc1cf6 commit 290f744

10 files changed

Lines changed: 136 additions & 7 deletions

File tree

.github/workflows/build.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ jobs:
2323
- name: Build & Test
2424
run: cd projects && ./test.sh
2525

26+
- name: API Binary Compatibility Check
27+
run: cd projects && ./gradlew apiCheck
28+
2629
build-publish-local:
2730
runs-on: ubuntu-latest
2831
timeout-minutes: 30

projects/android/koin-android/api/koin-android.api

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public final class org/koin/androidx/scope/FragmentExtKt {
114114
public static final fun getScopeOrNull (Landroidx/fragment/app/Fragment;)Lorg/koin/core/scope/Scope;
115115
}
116116

117-
public abstract class org/koin/androidx/scope/RetainedScopeActivity : androidx/activity/ComponentActivity, org/koin/android/scope/AndroidScopeComponent {
117+
public abstract class org/koin/androidx/scope/RetainedScopeActivity : androidx/appcompat/app/AppCompatActivity, org/koin/android/scope/AndroidScopeComponent {
118118
public fun <init> ()V
119119
public fun <init> (I)V
120120
public synthetic fun <init> (IILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -123,7 +123,7 @@ public abstract class org/koin/androidx/scope/RetainedScopeActivity : androidx/a
123123
protected fun onCreate (Landroid/os/Bundle;)V
124124
}
125125

126-
public abstract class org/koin/androidx/scope/ScopeActivity : androidx/activity/ComponentActivity, org/koin/android/scope/AndroidScopeComponent {
126+
public abstract class org/koin/androidx/scope/ScopeActivity : androidx/appcompat/app/AppCompatActivity, org/koin/android/scope/AndroidScopeComponent {
127127
public fun <init> ()V
128128
public fun <init> (I)V
129129
public synthetic fun <init> (IILkotlin/jvm/internal/DefaultConstructorMarker;)V

projects/android/koin-androidx-workmanager/api/koin-androidx-workmanager.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,15 @@ public final class org/koin/androidx/workmanager/koin/KoinApplicationExtKt {
88
public static final fun workManagerFactory (Lorg/koin/core/KoinApplication;)V
99
}
1010

11+
public final class org/koin/plugin/module/dsl/WorkerDSLExtKt {
12+
public static final fun worker (Lorg/koin/core/module/Module;)Lorg/koin/core/definition/KoinDefinition;
13+
public static final fun worker (Lorg/koin/dsl/ScopeDSL;)Lorg/koin/core/definition/KoinDefinition;
14+
}
15+
16+
public final class org/koin/plugin/module/dsl/WorkerModuleExtKt {
17+
public static final fun buildWorker (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
18+
public static final fun buildWorker (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
19+
public static synthetic fun buildWorker$default (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
20+
public static synthetic fun buildWorker$default (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
21+
}
22+

projects/core/koin-core-coroutines/api/koin-core-coroutines.api

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,11 @@ public final class org/koin/core/KoinLazyExtKt {
1212
}
1313

1414
public final class org/koin/core/KoinWaitExtKt {
15+
public static final fun runOnKoinStarted (Lorg/koin/core/Koin;Lkotlin/jvm/functions/Function2;)V
1516
public static final fun waitAllStartJobs (Lorg/koin/core/Koin;Lkotlinx/coroutines/CoroutineDispatcher;)V
1617
public static synthetic fun waitAllStartJobs$default (Lorg/koin/core/Koin;Lkotlinx/coroutines/CoroutineDispatcher;ILjava/lang/Object;)V
1718
}
1819

19-
public final class org/koin/core/KoinWaitExt_jvmKt {
20-
public static final fun runOnKoinStarted (Lorg/koin/core/Koin;Lkotlin/jvm/functions/Function2;)V
21-
}
22-
2320
public final class org/koin/core/context/ContextWaitJVMKt {
2421
public static final fun waitKoinStart ()V
2522
}

projects/core/koin-core-coroutines/src/commonMain/kotlin/org/koin/core/KoinWaitExt.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:JvmName("KoinWaitExtKt")
17+
@file:JvmMultifileClass
1618
@file:OptIn(KoinInternalApi::class)
1719

1820
package org.koin.core
1921

22+
import kotlin.jvm.JvmMultifileClass
23+
import kotlin.jvm.JvmName
24+
2025
import kotlinx.coroutines.CoroutineDispatcher
2126
import kotlinx.coroutines.Dispatchers
2227
import org.koin.core.annotation.KoinInternalApi

projects/core/koin-core-coroutines/src/jvmMain/kotlin/org/koin/core/KoinWaitExt.jvm.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:JvmName("KoinWaitExtKt")
17+
@file:JvmMultifileClass
18+
1619
package org.koin.core
1720

1821
import kotlinx.coroutines.runBlocking

projects/core/koin-core-viewmodel/api/android/koin-core-viewmodel.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
public final class org/koin/plugin/module/dsl/ViewModelDSLExtKt {
2+
public static final fun viewModel (Lorg/koin/core/module/Module;)Lorg/koin/core/definition/KoinDefinition;
3+
public static final fun viewModel (Lorg/koin/dsl/ScopeDSL;)Lorg/koin/core/definition/KoinDefinition;
4+
}
5+
6+
public final class org/koin/plugin/module/dsl/ViewModelModuleExtKt {
7+
public static final fun buildViewModel (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
8+
public static final fun buildViewModel (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
9+
public static synthetic fun buildViewModel$default (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
10+
public static synthetic fun buildViewModel$default (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
11+
}
12+
113
public final class org/koin/viewmodel/BundleExtKt {
214
public static final fun emptyState ()Lkotlin/jvm/functions/Function0;
315
public static final fun toExtras (Landroid/os/Bundle;Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/viewmodel/CreationExtras;

projects/core/koin-core-viewmodel/api/jvm/koin-core-viewmodel.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
public final class org/koin/plugin/module/dsl/ViewModelDSLExtKt {
2+
public static final fun viewModel (Lorg/koin/core/module/Module;)Lorg/koin/core/definition/KoinDefinition;
3+
public static final fun viewModel (Lorg/koin/dsl/ScopeDSL;)Lorg/koin/core/definition/KoinDefinition;
4+
}
5+
6+
public final class org/koin/plugin/module/dsl/ViewModelModuleExtKt {
7+
public static final fun buildViewModel (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
8+
public static final fun buildViewModel (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
9+
public static synthetic fun buildViewModel$default (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
10+
public static synthetic fun buildViewModel$default (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
11+
}
12+
113
public final class org/koin/viewmodel/BundleExtKt {
214
public static final fun emptyState ()Lkotlin/jvm/functions/Function0;
315
public static final fun toExtras (Landroidx/savedstate/SavedState;Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/viewmodel/CreationExtras;

projects/core/koin-core/api/koin-core.api

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ public final class org/koin/KoinApplicationExtKt {
44
public static synthetic fun fileProperties$default (Lorg/koin/core/KoinApplication;Ljava/lang/String;ILjava/lang/Object;)Lorg/koin/core/KoinApplication;
55
}
66

7+
public abstract interface annotation class org/koin/compiler/hints/KoinConfigurationHint : java/lang/annotation/Annotation {
8+
public abstract fun moduleClass ()Ljava/lang/String;
9+
}
10+
711
public final class org/koin/core/Koin {
812
public fun <init> ()V
13+
public final fun addResolutionExtension (Lorg/koin/core/resolution/ResolutionExtension;)V
914
public final fun close ()V
1015
public final fun createEagerInstances ()V
1116
public final fun createScope (Ljava/lang/String;Lorg/koin/core/qualifier/Qualifier;Ljava/lang/Object;Lorg/koin/core/qualifier/TypeQualifier;)Lorg/koin/core/scope/Scope;
@@ -36,8 +41,9 @@ public final class org/koin/core/Koin {
3641
public final fun unloadModules (Ljava/util/List;)V
3742
}
3843

39-
public final class org/koin/core/KoinApplication {
44+
public class org/koin/core/KoinApplication {
4045
public static final field Companion Lorg/koin/core/KoinApplication$Companion;
46+
protected fun <init> ()V
4147
public final fun allowOverride (Z)V
4248
public final fun close ()V
4349
public final fun createEagerInstances ()V
@@ -66,6 +72,9 @@ public abstract interface annotation class org/koin/core/annotation/KoinExperime
6672
public abstract interface annotation class org/koin/core/annotation/KoinInternalApi : java/lang/annotation/Annotation {
6773
}
6874

75+
public abstract interface annotation class org/koin/core/annotation/KoinViewModelScopeApi : java/lang/annotation/Annotation {
76+
}
77+
6978
public abstract interface class org/koin/core/component/KoinComponent {
7079
public fun getKoin ()Lorg/koin/core/Koin;
7180
}
@@ -713,3 +722,53 @@ public final class org/koin/mp/KoinPlatformTools_jvmKt {
713722
public static final fun generateId (Lorg/koin/mp/KoinPlatformTools;)Ljava/lang/String;
714723
}
715724

725+
public final class org/koin/plugin/module/dsl/ApplicationDSLExtKt {
726+
public static final fun koinApplication (Lkotlin/jvm/functions/Function1;)Lorg/koin/core/KoinApplication;
727+
public static synthetic fun koinApplication$default (Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/core/KoinApplication;
728+
public static final fun koinApplicationWith (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lorg/koin/core/KoinApplication;
729+
public static synthetic fun koinApplicationWith$default (Ljava/util/List;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/core/KoinApplication;
730+
public static final fun koinConfiguration (Lkotlin/jvm/functions/Function1;)Lorg/koin/dsl/KoinConfiguration;
731+
public static synthetic fun koinConfiguration$default (Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/dsl/KoinConfiguration;
732+
public static final fun koinConfigurationWith (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lorg/koin/dsl/KoinConfiguration;
733+
public static synthetic fun koinConfigurationWith$default (Ljava/util/List;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/dsl/KoinConfiguration;
734+
public static final fun module (Lorg/koin/core/KoinApplication;)V
735+
public static final fun modules (Lorg/koin/core/KoinApplication;[Lkotlin/reflect/KClass;)V
736+
public static final fun startKoin (Lkotlin/jvm/functions/Function1;)Lorg/koin/core/KoinApplication;
737+
public static synthetic fun startKoin$default (Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/core/KoinApplication;
738+
public static final fun startKoinWith (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lorg/koin/core/KoinApplication;
739+
public static synthetic fun startKoinWith$default (Ljava/util/List;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/koin/core/KoinApplication;
740+
public static final fun withConfiguration (Lorg/koin/core/KoinApplication;Lkotlin/jvm/functions/Function1;)V
741+
public static synthetic fun withConfiguration$default (Lorg/koin/core/KoinApplication;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
742+
public static final fun withConfigurationWith (Lorg/koin/core/KoinApplication;Ljava/util/List;Lkotlin/jvm/functions/Function1;)V
743+
public static synthetic fun withConfigurationWith$default (Lorg/koin/core/KoinApplication;Ljava/util/List;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
744+
}
745+
746+
public final class org/koin/plugin/module/dsl/BaseDSLExtKt {
747+
public static final fun factory (Lorg/koin/core/module/Module;)Lorg/koin/core/definition/KoinDefinition;
748+
public static final fun factory (Lorg/koin/dsl/ScopeDSL;)Lorg/koin/core/definition/KoinDefinition;
749+
public static final fun scoped (Lorg/koin/dsl/ScopeDSL;)Lorg/koin/core/definition/KoinDefinition;
750+
public static final fun single (Lorg/koin/core/module/Module;)Lorg/koin/core/definition/KoinDefinition;
751+
}
752+
753+
public final class org/koin/plugin/module/dsl/CreateDSLKt {
754+
public static final field USE_KOIN_COMPILER_PLUGIN Ljava/lang/String;
755+
public static final fun USE_KOIN_COMPILER_PLUGIN (Ljava/lang/String;)Ljava/lang/Void;
756+
}
757+
758+
public final class org/koin/plugin/module/dsl/ModuleExtKt {
759+
public static final fun bind (Lorg/koin/core/definition/KoinDefinition;Lkotlin/reflect/KClass;)Lorg/koin/core/definition/KoinDefinition;
760+
public static final fun buildFactory (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
761+
public static final fun buildFactory (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
762+
public static synthetic fun buildFactory$default (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
763+
public static synthetic fun buildFactory$default (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
764+
public static final fun buildScoped (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;)Lorg/koin/core/definition/KoinDefinition;
765+
public static synthetic fun buildScoped$default (Lorg/koin/dsl/ScopeDSL;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
766+
public static final fun buildSingle (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;Z)Lorg/koin/core/definition/KoinDefinition;
767+
public static synthetic fun buildSingle$default (Lorg/koin/core/module/Module;Lkotlin/reflect/KClass;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function2;ZILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
768+
public static final fun createDefinition (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function2;Lorg/koin/core/qualifier/Qualifier;Lorg/koin/core/qualifier/Qualifier;Lorg/koin/core/definition/Kind;Lorg/koin/core/module/Module;Z)Lorg/koin/core/definition/KoinDefinition;
769+
public static synthetic fun createDefinition$default (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function2;Lorg/koin/core/qualifier/Qualifier;Lorg/koin/core/qualifier/Qualifier;Lorg/koin/core/definition/Kind;Lorg/koin/core/module/Module;ZILjava/lang/Object;)Lorg/koin/core/definition/KoinDefinition;
770+
public static final fun includes (Lorg/koin/core/module/Module;Lorg/koin/core/module/Module;)V
771+
public static final fun scope (Lorg/koin/core/module/Module;Lorg/koin/core/qualifier/Qualifier;Lkotlin/jvm/functions/Function1;)V
772+
public static final fun typeQualifier (Lkotlin/reflect/KClass;)Lorg/koin/core/qualifier/Qualifier;
773+
}
774+

projects/ktor/koin-ktor/api/koin-ktor.api

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1+
public final class org/koin/core/KoinKtorApplication : org/koin/core/KoinApplication {
2+
public static final field Companion Lorg/koin/core/KoinKtorApplication$Companion;
3+
public fun <init> ()V
4+
public final fun bridge (Lkotlin/jvm/functions/Function1;)V
5+
public final fun getKtorApplication ()Lio/ktor/server/application/Application;
6+
public final fun getKtorBridge ()Lorg/koin/core/KtorBridgeDSL;
7+
public final fun setKtorApplication (Lio/ktor/server/application/Application;)V
8+
public final fun setKtorBridge (Lorg/koin/core/KtorBridgeDSL;)V
9+
}
10+
11+
public final class org/koin/core/KoinKtorApplication$Companion {
12+
public final fun init ()Lorg/koin/core/KoinKtorApplication;
13+
}
14+
15+
public final class org/koin/core/KtorBridgeDSL {
16+
public fun <init> ()V
17+
public final fun koinToKtor ()V
18+
public final fun ktorToKoin ()V
19+
}
20+
21+
public final class org/koin/ktor/di/KoinDependencyMap : io/ktor/server/plugins/di/DependencyMap {
22+
public fun <init> (Lorg/koin/core/Koin;)V
23+
public fun contains (Lio/ktor/server/plugins/di/DependencyKey;)Z
24+
public fun getInitializer (Lio/ktor/server/plugins/di/DependencyKey;)Lio/ktor/server/plugins/di/DependencyInitializer;
25+
}
26+
127
public final class org/koin/ktor/ext/ApplicationCallExtKt {
228
public static final fun getKoin (Lio/ktor/server/application/ApplicationCall;)Lorg/koin/core/Koin;
329
public static final fun getProperty (Lio/ktor/server/application/ApplicationCall;Ljava/lang/String;)Ljava/lang/Object;

0 commit comments

Comments
 (0)