Skip to content

调试技巧 (Debugging)

Compose 的声明式特性使得传统的“打断点”调试变得有些困难(因为你不知道重组何时发生)。以下是一些实用的调试技巧。

1. Layout Inspector

Android Studio 内置工具。

  • 实时更新: 可以看到 UI 树的实时变化。
  • 重组计数: 在 Component Tree 中,每个节点右侧会显示重组次数(Recomposition Count)和跳过次数(Skipped Count)。
    • 如果重组次数飙升,说明存在性能问题。
    • 如果跳过次数为 0,说明该组件不是可跳过的(Unstable)。

2. LogCompositions

这是一个常用的调试 Helper 函数,用于打印日志来观察重组。

kotlin
class Ref(var value: Int)

@Composable
inline fun LogCompositions(tag: String, msg: String) {
    if (BuildConfig.DEBUG) {
        val ref = remember { Ref(0) }
        SideEffect { ref.value++ }
        Log.d(tag, "Compositions: $msg ${ref.value}")
    }
}

// 使用
@Composable
fun MyScreen() {
    LogCompositions("MyScreen", "Recomposing")
    // ...
}

3. recomposeHighlighter

这是一个“视觉调试”修饰符。当组件重组时,给它画一个闪烁的边框。

kotlin
fun Modifier.recomposeHighlighter(): Modifier = this.then(if (BuildConfig.DEBUG) {
    composed {
        val numCompositions = remember { mutableIntStateOf(0) }
        val fadingAnimation = remember { Animatable(0f) }
        
        SideEffect {
            numCompositions.intValue += 1
            launch { fadingAnimation.snapTo(1f); fadingAnimation.animateTo(0f) }
        }

        this.drawWithContent {
            drawContent()
            drawRect(Color.Red.copy(alpha = fadingAnimation.value))
        }
    }
} else Modifier)

4. 调试 Modifier 链

有时你会困惑为什么样式不对。可以在 Modifier 链中插入调试点。

kotlin
Modifier
    .padding(10.dp)
    .let { 
        // 在这里打断点查看 it (Modifier) 的状态
        it 
    }
    .background(Color.Red)