实战指南:从 XML 到 Compose 的迁移策略与性能优化
迁移互操作性能优化实战
性能对决:Compose vs. XML
Compose 和 XML 哪个更快?答案是复杂的。XML 在初始渲染上通常更快,因为它作为系统框架的一部分被预编译(AOT)。而 Compose 作为一个库,在首次运行时需要即时编译(JIT),导致启动时间较长。
然而,这个问题可以通过基线配置文件(Baseline Profiles)解决,它能触发对关键代码路径的 AOT 编译,使 Compose 的启动速度与 XML 基本持平。
在运行时效率上,Compose 通常更优。它的智能重组机制可以跳过未变化的 UI 更新,提供比 XML 更平滑的用户体验,慢帧百分比更低。
Note: 编写糟糕的 Compose 代码比编写糟糕的 XML 代码更容易。最大的陷阱是“过度重组”,通常是由于向 Composable 传递了不稳定的参数(如可变的 `List<T>`)引起的。请优先使用不可变集合或用 `@Immutable` 注解标记你的数据类。
权威迁移指南:从 XML 到 Compose
对于已有项目,“xml 转 compose”的核心原则是:绝不要一次性重写所有内容。官方推荐的策略是增量迁移。
- 步骤一:用 Compose 构建所有新屏幕。
- 步骤二:将可重用的 UI 元素提取到共享的 Compose 组件库中。
- 步骤三:按照从简单到复杂的顺序,逐个屏幕替换现有功能。
战术一:在 XML 中嵌入 Compose (ComposeView)
这是迁移的起点。你可以在现有的 XML 布局中添加一个 `<androidx.compose.ui.platform.ComposeView>`,然后在代码中调用其 `setContent` 方法来渲染 Composable 函数。
关键点:在 Fragment 中使用时,必须设置正确的组合策略 `ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed`,以防止因 View 重建导致 Compose 状态丢失。
my_compose_view.apply {
setViewCompositionStrategy(
ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
)
setContent {
MaterialTheme {
Text("Hello Compose!")
}
}
}战术二:在 Compose 中嵌入 XML (AndroidView)
当你正在构建一个 Compose 屏幕,但需要嵌入一个旧的 View 组件(如 MapView)时,可以使用 `AndroidView` Composable。它通过 `factory` lambda(仅执行一次,用于创建 View)和 `update` lambda(每次重组时执行,用于更新 View)来实现双向通信。
@Composable
fun MyLegacyViewInCompose(selectedItem: Int) {
AndroidView(
factory = { context ->
MyCustomView(context).apply {
// View -> Compose 通信
setOnClickListener { /*... */ }
}
},
update = { view ->
// Compose -> View 通信
view.selectedItem = selectedItem
}
)
}