ردیابی پشته در نوشتن

Jetpack Compose کد شما را در چندین مرحله مختلف اجرا می‌کند، که باعث می‌شود برخی از بخش‌های تابع @Composable جدا از یکدیگر اجرا شوند. خرابی‌ها در این مراحل می‌تواند منجر به ردیابی پشته شود که رمزگشایی آن دشوار است و تشخیص دقیق عملکرد یا خط کدی که باعث خرابی شده است را دشوار می‌کند.

اطلاعات منبع را به ردپاهای پشته اضافه کنید

برای بهبود خوانایی ردیابی پشته، یک API انتخابی جزئیات غنی‌تری از مکان‌های خرابی، از جمله نام‌ها و مکان‌های قابل ترکیب، ارائه می‌دهد و شما را قادر می‌سازد تا:

  • منابع خرابی را به طور موثر شناسایی و برطرف کنید
  • تصادفات ایزوله برای نمونه‌های قابل تکرار
  • بررسی کرش‌هایی که قبلاً فقط فریم‌های پشته داخلی را نشان می‌دادند

زمان اجرای Compose می‌تواند محل خرابی را در ترکیب تشخیص دهد و بر اساس سلسله مراتب @Composable شما، یک رد پشته (stack trace) بازسازی کند. رد پشته برای خرابی‌ها در موارد زیر اضافه می‌شود:

  • ترکیب
  • DisposableEffect و LaunchedEffect (به جز onDispose یا cancel)
  • کوروتین‌ها در rememberCoroutineScope راه‌اندازی شدند
  • اندازه‌گیری، طرح‌بندی و رسم مسیرها

برای فعال کردن این ویژگی، خطوط زیر را به نقطه ورود برنامه اضافه کنید:

// 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)
    }
}

در حالت ایده‌آل، این پیکربندی را قبل از ایجاد هرگونه ترکیب انجام دهید تا تأیید شود که اطلاعات ردیابی پشته به درستی جمع‌آوری شده است.

چهار گزینه برای ComposeStackTraceMode وجود دارد:

  • Auto : گزینه پیشنهادی، زیرا در صورت کوچک‌سازی برنامه GroupKeys و در غیر این صورت None استفاده می‌کند.
  • GroupKeys : ردپاهای پشته برای برنامه‌های کوچک‌سازی‌شده ایجاد می‌شوند. اطلاعات کلید گروه حتی پس از کوچک‌سازی نیز حفظ می‌شود و همراه با فایل نگاشت proguard که توسط کامپایلر Compose و R8 منتشر می‌شود، برای بازسازی مکان تقریبی توابع @Composable استفاده می‌شود. این ردپاهای پشته دقت کمتری دارند و برای جلوگیری از انجام کار اضافی در زمان اجرا بهینه‌سازی شده‌اند. کامپایلر Compose از انتشار نگاشت‌های اضافی R8 که از Kotlin 2.3.0 شروع می‌شود، پشتیبانی می‌کند.
  • SourceInformation : برای ساخت‌های غیرکوچک‌شده مفید است، اطلاعات منبع را جمع‌آوری کرده و آن را به ردیابی پشته اضافه می‌کند. نتایج دقیق‌تر هستند، اما هزینه عملکرد قابل توجهی را متحمل می‌شوند که مشابه اتصال بازرس طرح‌بندی است. آن‌ها برای استفاده در نسخه‌های اشکال‌زدایی برنامه‌ها ایجاد شده‌اند تا خوانش‌های دقیقی از خرابی که به اطلاعات بیشتری در مورد مکان آن نیاز دارد، به دست آورند. اطلاعات منبع از برنامه‌های کوچک‌شده حذف می‌شود تا اندازه باینری و عملکرد بهینه شود.
  • None : هیچ جزئیات ردیابی پشته اضافی اضافه نشده است.

هنگام استفاده از گزینه SourceInformation ، رد پشته به عنوان یک DiagnosticComposeException در لیست استثناهای سرکوب شده ظاهر می‌شود:

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)

محدودیت‌های شناخته‌شده

چند مشکل شناخته شده در مورد فریم‌های ردیابی پشته وجود دارد:

ردیابی پشته اطلاعات منبع

شماره خطوط ( <unknown line> ) در اولین فریم پشته برای خرابی در ترکیب وجود ندارد. از آنجایی که درون‌نگری اطلاعات منبع پس از خرابی اتفاق می‌افتد، داده‌های جدول اسلات می‌توانند ناقص باشند و شماره خط را حذف کنند. ReusableComposeNode و remember اطلاعات منبع را تولید نمی‌کنند، بنابراین <unknown line> در فریم‌های پشته برای آن توابع مشاهده خواهید کرد.

کلیدهای گروهی، ردپاهای پشته

ردیابی‌های پشته‌ای مبتنی بر GroupKeys ، طبق طراحی، فقط می‌توانند به خط اول تابع @Composable اشاره کنند. آن‌ها همچنین هیچ داده‌ای برای توابعی که گروهی تولید نمی‌کنند (مانند توابع درون‌خطی یا توابع غیر واحدی) ندارند.

خرابی‌های جمع‌آوری رد پشته

اگر مجموعه ردیابی پشته به هر دلیلی از کار بیفتد، آن استثنا به عنوان یک استثنای سرکوب‌شده به جای DiagnosticComposeException اضافه می‌شود.

هرگونه خرابی سرکوب‌شده یا ناهماهنگی در ردیابی پشته را به مؤلفه Compose Runtime گزارش دهید.