Compose'da yığın izleme

Jetpack Compose, kodunuzu birden fazla farklı aşamada yürütür. Bu durum, @Composable işlevinin bazı bölümlerinin birbirinden ayrı olarak yürütülmesine neden olur. Bu aşamalardaki kilitlenmeler, çözülmesi zor olan yığın izlerine neden olabilir. Bu da kilitlenmeye neden olan tam işlevi veya kod satırını belirlemeyi zorlaştırır.

Yığın izlemelerine kaynak bilgisi ekleme

Yığın izleme okunabilirliğini artırmak için isteğe bağlı bir API, birleştirilebilir adlar ve konumlar da dahil olmak üzere daha ayrıntılı kilitlenme konumu bilgileri sağlar. Bu sayede:

  • Kilitlenme kaynaklarını verimli bir şekilde belirleme ve çözme
  • Yeniden üretilebilir örnekler için kilitlenmeleri izole etme
  • Daha önce yalnızca dahili yığın çerçevelerini gösteren kilitlenmeleri inceleme

Compose çalışma zamanı, oluşturma sırasında kilitlenme konumunu algılayabilir ve @Composable hiyerarşinize göre bir yığın izi yeniden oluşturabilir. Yığın izleme, aşağıdaki durumlarda çökmeler için eklenir:

  • Beste
  • DisposableEffect ve LaunchedEffect (onDispose veya iptal hariç)
  • Coroutines, rememberCoroutineScope sürümünde kullanıma sunuldu.
  • Ölçme, düzenleme ve geçiş çizme

Bu özelliği etkinleştirmek için uygulama giriş noktasına aşağıdaki satırları ekleyin:

// Enable stack traces at application level: onCreate
class SampleStackTracesEnabledApp : Application() {

    override fun onCreate() {
        super.onCreate()
        // Enable Compose stack traces for minified builds only.
        Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto)

        // Alternatively:
        // Enable verbose Compose stack traces for local debugging
        Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation)
    }
}

İdeal olarak, yığın izi bilgilerinin doğru şekilde toplandığını doğrulamak için bu yapılandırmayı herhangi bir beste oluşturmadan önce yapın.

ComposeStackTraceMode için dört seçenek vardır:

  • Auto: Uygulama küçültülmüşse GroupKeys, aksi takdirde None kullanıldığından önerilen seçenektir.
  • GroupKeys: Yığın izlemeler, küçültülmüş uygulamalar için oluşturulur. Grup anahtarı bilgileri, sadeleştirme işleminden sonra bile korunur ve @Composable işlevlerinin kabaca konumunu yeniden oluşturmak için Compose derleyicisi ve R8 tarafından verilen proguard eşleme dosyasıyla birlikte kullanılır. Bu yığın izlemeler daha az hassastır ve çalışma zamanında ek iş yapılmasını önlemek için optimize edilmiştir. Compose derleyicisi, Kotlin 2.3.0'dan itibaren ek R8 eşlemelerinin yayınlanmasını destekler.
  • SourceInformation: Küçültülmemiş derlemeler için yararlıdır. Kaynak bilgilerini toplar ve yığın izlemeye ekler. Sonuçlar daha doğrudur ancak düzen denetçisini eklemeye benzer şekilde önemli bir performans maliyetine neden olur. Konumu hakkında daha fazla bilgi gerektiren bir kaza ile ilgili doğru okumalar elde etmek için uygulamaların hata ayıklama sürümlerinde kullanılmak üzere oluşturulur. Kaynak bilgileri, ikili boyut ve performansı optimize etmek için küçültülmüş uygulamalardan kaldırılır.
  • None: Ek yığın izleme ayrıntısı eklenmedi.

SourceInformation seçeneği kullanıldığında yığın izleme, bastırılmış istisna listesinde DiagnosticComposeException olarak görünür:

java.lang.IllegalStateException: Test layout error
    at <original trace>
Suppressed: androidx.compose.runtime.DiagnosticComposeException:
Composition stack when thrown:
    at ReusableComposeNode(Composables.kt:<unknown line>)
    at Layout(Layout.kt:79)
    at <lambda>(TempErrorsTest.kt:164)
    at <lambda>(BoxWithConstraints.kt:66)
    at ReusableContentHost(Composables.kt:164)
    at <lambda>(SubcomposeLayout.kt:514)
    at SubcomposeLayout(SubcomposeLayout.kt:114)
    at SubcomposeLayout(SubcomposeLayout.kt:80)
    at BoxWithConstraints(BoxWithConstraints.kt:64)
    at SubcomposeLayoutErrorComposable(TempErrorsTest.kt:164)
    at <lambda>(TempErrorsTest.kt:86)
    at Content(ComposeView.android.kt:430)
    at <lambda>(ComposeView.android.kt:249)
    at CompositionLocalProvider(CompositionLocal.kt:364)
    at ProvideCommonCompositionLocals(CompositionLocals.kt:193)
    at <lambda>(AndroidCompositionLocals.android.kt:113)
    at CompositionLocalProvider(CompositionLocal.kt:364)
    at ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:102)
    at <lambda>(Wrapper.android.kt:141)
    at CompositionLocalProvider(CompositionLocal.kt:384)
    at <lambda>(Wrapper.android.kt:140)

Bilinen sınırlamalar

Yığın izi çerçeveleriyle ilgili bilinen birkaç sorun vardır:

Kaynak bilgisi yığın izleri

Bileşimdeki kilitlenmeler için ilk yığın çerçevesinde satır numaraları (<unknown line>) eksik. Kaynak bilgileri incelemesi kilitlenmeden sonra yapıldığından yuva tablosu verileri eksik olabilir ve satır numarası düşebilir. ReusableComposeNode ve remember kaynak bilgisi üretmediğinden bu işlevlerin yığın çerçevelerinde <unknown line> görürsünüz.

Grup anahtarları yığın izleri

GroupKeys tabanlı yığın izlemeler, tasarım gereği yalnızca @Composable işlevinin ilk satırını gösterebilir. Ayrıca, grup oluşturmayan işlevler (ör. satır içi veya birim döndürmeyen işlevler) için herhangi bir veri içermezler.

Yığın izleme toplama kilitlenmeleri

Yığın izleme toplama işlemi herhangi bir nedenle çökerse bu istisna, DiagnosticComposeException yerine bastırılmış bir istisna olarak eklenir.

Bastırılmış kilitlenmeleri veya yığın izi tutarsızlıklarını Compose Runtime bileşenine bildirin.