Se você estiver enfrentando problemas de performance resultantes de recomposição desnecessária ou excessiva, depure a estabilidade do app. Este guia descreve vários métodos para fazer isso.
Layout Inspector
O Layout Inspector no Android Studio permite conferir quais elementos combináveis estão sendo recompostos no app. Ele mostra quantas vezes o Compose recompos ou ignorou um componente.

Relatórios do compilador do Compose
O compilador do Compose pode gerar os resultados da inferência de estabilidade para inspeção. Usando essa saída, você pode determinar quais elementos combináveis podem ser ignorados e quais não. As subseções a seguir resumem como usar esses relatórios, mas para mais informações, consulte a documentação técnica.
Configuração
Os relatórios do compilador do Compose não são ativados por padrão. É possível ativá-los com uma flag do compilador. A configuração exata varia de acordo com o
projeto, mas, para projetos que usam o plug-in do Gradle do compilador do Compose, você pode
adicionar o seguinte em cada arquivo build.gradle do módulo.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
Os relatórios do compilador do Compose serão gerados ao criar o projeto.
Exemplo de saída
O reportsDestination gera três arquivos. Confira a seguir exemplos de saídas
de JetSnack.
<modulename>-classes.txt: um relatório sobre a estabilidade das classes nesse módulo. Exemplo.<modulename>-composables.txt: um relatório sobre como os elementos combináveis podem ser reiniciados e puláveis no módulo. Exemplo.<modulename>-composables.csv: uma versãoCSVdo relatório de elementos combináveis que pode ser importada para uma planilha ou processada usando um script. Exemplo
Relatório de elementos combináveis
O arquivo composables.txt detalha cada função combinável do módulo especificado, incluindo a estabilidade dos parâmetros e se eles podem ser reiniciados ou ignorados. Confira a seguir um exemplo hipotético do
JetSnack:
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
stable snackCollection: SnackCollection
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
stable index: Int = @static 0
stable highlight: Boolean = @static true
)
Esse elemento combinável SnackCollection pode ser reiniciado, ignorado e é estável. Isso geralmente é preferível, mas não obrigatório.
Como alternativa, considere outro exemplo.
restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
stable index: Int
unstable snacks: List<Snack>
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
)
O elemento combinável HighlightedSnacks não pode ser ignorado. O Compose nunca o ignora durante a recomposição. Isso ocorre mesmo que nenhum dos parâmetros tenha mudado.
O motivo é o parâmetro unstable, snacks.
Relatório de classes
O arquivo classes.txt contém um relatório semelhante sobre as classes no módulo especificado. O snippet a seguir é a saída da classe Snack:
unstable class Snack {
stable val id: Long
stable val name: String
stable val imageUrl: String
stable val price: Long
stable val tagline: String
unstable val tags: Set<String>
<runtime stability> = Unstable
}
Para referência, confira a definição de Snack:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
O compilador do Compose marcou Snack como instável. Isso ocorre porque o tipo do
parâmetro é Set<String>.tags Esse é um tipo imutável, já que não é um MutableSet. No entanto, as classes de coleção padrão, como Set, List e Map, são interfaces. Portanto, a implementação subjacente ainda pode ser mutável.
Por exemplo, você pode escrever val set: Set<String> = mutableSetOf("foo"). A variável é constante e o tipo declarado não é mutável, mas a implementação ainda é mutável. O compilador do Compose não pode ter certeza da imutabilidade dessa classe, já que só vê o tipo declarado. Portanto, ele marca tags como instável.