Compose Multiplatform中Button触发锁验证失败日志是否为框架BUG?
使用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
相关产品推荐
相关产品推荐

