You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose Multiplatform中Button触发锁验证失败日志是否为框架BUG?

关于Compose Multiplatform Button组件触发锁验证失败日志的问题

使用Compose Multiplatform的Button组件时,控制台会打印锁验证失败的警告日志,但OutlinedButton、TextButton等其他按钮组件不会触发该日志,疑问这是否是Compose Multiplatform(CMP)的BUG。

示例代码

Button(onClick = {

}) {
    Text("Todo")
}

控制台日志

Method boolean androidx.compose.runtime.snapshots.SnapshotStateList.conditionalUpdate(boolean, kotlin.jvm.functions.Function1) failed lock verification and will run slower.
                                                                        Common causes for lock verification issues are non-optimized dex code
                                                                        and incorrect proguard optimizations.

Method boolean androidx.compose.runtime.snapshots.SnapshotStateList.conditionalUpdate$default(androidx.compose.runtime.snapshots.SnapshotStateList, boolean, kotlin.jvm.functions.Function1, int, java.lang.Object) failed lock verification and will run slower.

Method java.lang.Object androidx.compose.runtime.snapshots.SnapshotStateList.mutate(kotlin.jvm.functions.Function1) failed lock verification and will run slower.

问题解答

这不是Compose Multiplatform的BUG,本质是Android ART运行时的锁验证机制相关问题,原因和解决方向如下:

  • 日志来自Android ART运行时,提示的是ART无法验证SnapshotStateList相关方法的锁操作逻辑,导致这些方法会以解释模式运行(而非AOT编译优化后的模式),仅会影响方法执行效率,不会破坏功能。
  • Button与其他按钮组件的内部实现差异:Button默认的样式/状态管理逻辑触发了SnapshotStateList的特定操作,而OutlinedButton、TextButton的状态处理路径不同,未涉及这些触发锁验证警告的方法。
  • 常见触发场景:Debug编译模式(未开启Dex优化)、ProGuard/R8规则配置不当导致SnapshotStateList相关方法被错误混淆或裁剪,或者使用的Compose版本中部分方法的字节码结构不符合ART的锁验证规则。

解决建议

  • 切换至Release模式编译:Release模式会启用Dex优化,ART能正确验证锁逻辑,该警告日志会自动消失。
  • 检查ProGuard/R8配置:确保Compose相关的保护规则正确应用,避免SnapshotStateList类及其方法被错误处理。
  • 更新Compose Multiplatform版本:后续官方版本可能会修复字节码层面的细节,避免触发ART的锁验证警告。

内容的提问来源于stack exchange,提问作者Mobile Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:55:00