Jetpack Compose NoSuchMethodError问题修复求助
解决Jetpack Compose NoSuchMethodError问题
环境与项目结构
- AndroidLib项目:Gradle 8.7、AGP 8.3、Kotlin 1.9.24
- 包含a、b两个Lib模块:
- a模块依赖Jetpack Compose(Compose BOM版本2024.08.00)
- b模块通过
api(a)依赖a,实现Compose页面 - 两个模块已发布至私有Maven仓库
- Demo项目:同版本Gradle/AGP/Kotlin,依赖a、b模块
模块核心Gradle配置
android { compileSdk = 34 defaultConfig { minSdk = 21 version = "1.0.0" consumerProguardFiles("consumer-rules.pro") } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } publishing { singleVariant("release") { withSourcesJar() withJavadocJar() } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.14" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } }
错误日志
运行Demo打开b模块Compose页面时抛出:
Process: com.example.demo2, PID: 6778 java.lang.NoSuchMethodError: No static method rememberComposableLambda(IZLjava/lang/Object;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/internal/ComposableLambda; in class Landroidx/compose/runtime/internal/ComposableLambdaKt; or its super classes (declaration of 'androidx.compose.runtime.internal.ComposableLambdaKt' appears in /data/app/~~Ri7xosVZ6ufBSkK7omydlw==/com.example.demo2-opiYr7AKT_qiXDWM96x19A==/base.apk) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:428) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:186) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:119) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:118) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:110) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:139) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:138) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:138) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:123) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:90) at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3302) at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:3235) at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:725) at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1071) at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633) at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114) at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1289) at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114) at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:164) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314) at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:192) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114) at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:1364) at android.view.View.dispatchAttachedToWindow(View.java:22340) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3544) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3551) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3551) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3551) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3551) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3572) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2989) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10304) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1594) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1603) at android.view.Choreographer.doCallbacks(Choreographer.java:1125) at android.view.Choreographer.doFrame(Choreographer.java:1030) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1567) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:224) at android.os.Looper.loop(Looper.java:318) at android.app.ActivityThread.main(ActivityThread.java:8790) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:561) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
已尝试方案
在Demo项目中添加与Lib模块一致的Gradle配置(编译选项、Compose开关、Kotlin编译器扩展版本等),但问题未解决。
解决方案
1. 统一Compose依赖版本,强制使用BOM管理
在Demo项目的根build.gradle.kts或settings.gradle.kts中添加Compose BOM约束,确保所有Compose依赖版本一致:
dependencyResolutionManagement { dependencies { constraints { implementation(platform("androidx.compose:compose-bom:2024.08.00")) } } }
或在模块的build.gradle.kts中直接引入BOM:
dependencies { implementation(platform("androidx.compose:compose-bom:2024.08.00")) // 其他Compose依赖无需指定版本,由BOM统一管理 }
2. 检查并排除依赖冲突
使用Gradle命令分析依赖冲突:
./gradlew app:dependencies --configuration releaseRuntimeClasspath | grep "compose-runtime"
若发现不同版本的compose-runtime,在Demo项目依赖中排除旧版本:
dependencies { implementation("your.group:a:1.0.0") { exclude(group = "androidx.compose.runtime", module = "runtime") } implementation("your.group:b:1.0.0") { exclude(group = "androidx.compose.runtime", module = "runtime") } // 手动添加统一版本的runtime,或通过BOM引入 implementation("androidx.compose.runtime:runtime") }
3. 验证Lib模块的依赖传递配置
确认Lib模块的publishing配置中,singleVariant正确传递了Compose相关的依赖约束,确保下游项目能继承统一的版本信息。
4. 清理缓存并重新构建
执行以下命令清理构建缓存,重新构建所有模块:
./gradlew clean build --refresh-dependencies
说明
该错误本质是Compose runtime版本不一致导致的——Lib模块与Demo项目使用的compose-runtime版本不匹配,运行时无法找到对应方法。通过统一版本、排除冲突依赖即可解决问题。
内容的提问来源于stack exchange,提问作者Taku shousei
相关产品推荐
相关产品推荐

