添加含共享元素过渡的Compose动画库时项目崩溃排查
问题描述
使用Compose BOM 2023.03.00版本,添加带共享元素更新的Compose动画模块(版本1.7.0-alpha07)后,应用启动即崩溃,报错信息如下:
java.lang.NoSuchMethodError: No static method restrictedConstraints-xF2OJ5Q$default(Landroidx/compose/ui/unit/Constraints$Companion;IIIIZILjava/lang/Object;)J in class Landroidx/compose/ui/unit/Constraints$Companion; or its super classes (declaration of 'androidx.compose.ui.unit.Constraints$Companion' appears in /data/app/com.xx.xxxx-55o2y0IBA6N3Qr0mj4DgbQ==/base.apk
at androidx.compose.foundation.layout.RowColumnMeasurementHelper.measureWithoutPlacing-_EkL-Y(RowColumnMeasurementHelper.kt:187)
at androidx.compose.foundation.layout.RowColumnMeasurePolicy.measure-3p2s80s(RowColumnImpl.kt:69)
at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:135)
at androidx.compose.foundation.layout.SizeNode.measure-3p2s80s(Size.kt:838)
仅添加该依赖就触发崩溃(未使用ShareElementsLayout等相关代码),示例应用可正常运行,但主应用匹配示例依赖版本(包括1.7.0-beta01)后仍崩溃,怀疑是多依赖间的兼容性问题。
排查步骤
- 强制统一Compose核心库版本:
NoSuchMethodError本质是同一类库存在多版本,导致方法签名不匹配。在build.gradle中强制指定所有Compose核心模块版本与动画模块一致(1.7.0-alpha07),覆盖BOM默认版本:configurations.all { resolutionStrategy { force "androidx.compose.ui:ui:1.7.0-alpha07" force "androidx.compose.foundation:foundation:1.7.0-alpha07" force "androidx.compose.animation:animation:1.7.0-alpha07" // 按需添加其他Compose核心模块,如ui-tooling、material等 } } - 检查依赖树定位冲突源:执行Gradle命令生成完整依赖树,找出引入旧版Compose模块的第三方库:
搜索./gradlew app:dependencies --configuration releaseRuntimeClasspathcompose.ui、compose.foundation等关键词,标记版本不符的依赖,通过exclude排除旧版本:implementation("第三方库坐标") { exclude group: "androidx.compose.ui", module: "ui" exclude group: "androidx.compose.foundation", module: "foundation" } - 逐步排查第三方依赖:暂时移除主应用中的非核心第三方依赖,逐个重新添加并运行应用,定位到引发冲突的具体依赖。找到后要么升级该依赖到兼容Compose 1.7.x的版本,要么继续用
exclude处理冲突。 - 验证BOM与预览版的兼容性:Compose BOM
2023.03.00对应的核心版本是1.4.3,而1.7.0-alpha07是跨大版本的预览版,BOM无法管理这类跨版本依赖,这是冲突根源。建议要么升级BOM到对应1.7.x的版本(如2024.04.00对应1.7.0-beta01),要么放弃预览版动画模块,改用BOM管理的稳定版。
内容的提问来源于stack exchange,提问作者Monster Brain

