Se riscontri problemi di prestazioni dovuti a una ricomposizione non necessaria o eccessiva, devi eseguire il debug della stabilità della tua app. Questa guida descrive diversi metodi per farlo.
Layout Inspector
Layout Inspector in Android Studio ti consente di vedere quali composable vengono ricomposti nella tua app. Mostra il numero di volte in cui Compose ha ricomposto o ignorato un componente.
Comporre report del compilatore
Il compilatore Compose può restituire i risultati della sua inferenza di stabilità per l'ispezione. Utilizzando questo output, puoi determinare quali composable sono ignorabili e quali no. Le sottosezioni seguenti riepilogano come utilizzare questi report, ma per informazioni più dettagliate consulta la documentazione tecnica.
Configura
I report del compilatore Compose non sono abilitati per impostazione predefinita. Puoi attivarli con
un flag del compilatore. La configurazione esatta varia a seconda del progetto, ma per i progetti che utilizzano il plug-in Gradle del compilatore Compose puoi aggiungere quanto segue nel file build.gradle
di ogni modulo.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
I report del compilatore Compose verranno ora generati durante la creazione del progetto.
Output di esempio
reportsDestination
genera tre file. Di seguito sono riportati alcuni output di esempio
di JetSnack�.
<modulename>-classes.txt
: un report sulla stabilità delle classi in questo modulo. Esempio.<modulename>-composables.txt
: un report su quanto sono riavviabili e ignorabili i componenti componibili nel modulo. Esempio.<modulename>-composables.csv
: una versioneCSV
del report sui componenti componibili che puoi importare in un foglio di lavoro o elaborare utilizzando uno script. Esempio
Report sui componenti componibili
Il file composables.txt
descrive in dettaglio ogni funzione componibile per il modulo specificato, inclusa la stabilità dei relativi parametri e se sono riavviabili o ignorabili. Di seguito è riportato un esempio ipotetico di
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
)
Questo componente componibile SnackCollection
è completamente riavviabile, ignorabile e
stabile. In genere è preferibile, anche se non è obbligatorio.
D'altra parte, diamo un'occhiata a un altro esempio.
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
)
Il composable HighlightedSnacks
non è ignorabile. Compose non lo salta mai
durante la ricomposizione. Ciò si verifica anche se nessuno dei suoi parametri è cambiato.
Il motivo è il parametro unstable
, snacks
.
Report Corsi
Il file classes.txt
contiene un report simile sulle classi nel modulo
specificato. Il seguente snippet è l'output per la 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
}
Per riferimento, di seguito è riportata la definizione di Snack
:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
Il compilatore Compose ha contrassegnato Snack
come instabile. Ciò è dovuto al fatto che il tipo di
parametro tags
è Set<String>
. Si tratta di un tipo immutabile, dato che
non è un MutableSet
. Tuttavia, le classi di raccolta standard come Set
,
List
e Map
sono in definitiva interfacce. Pertanto, l'implementazione
sottostante potrebbe essere ancora modificabile.
Ad esempio, potresti scrivere val set: Set<String> = mutableSetOf("foo")
. La
variabile è costante e il suo tipo dichiarato non è modificabile, ma la sua
implementazione è comunque modificabile. Il compilatore Compose non può essere certo dell'immutabilità di questa classe perché vede solo il tipo dichiarato. Pertanto, contrassegna
tags
come instabile.