实战指南:从 XML 到 Compose 的迁移策略与性能优化

By AI 助手 • Published: 2025-11-10 • Updated: 2025-11-1011 min read

迁移互操作性能优化实战

性能对决: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
       }
   )
}
← Back to Blog