Compose-এ স্ট্যাক ট্রেস

Jetpack Compose আপনার কোড একাধিক আলাদা আলাদা ফেজে এক্সিকিউট করে, যার ফলে @Composable ফাংশনের কিছু অংশ একে অপরের থেকে আলাদাভাবে এক্সিকিউট হয়। এইসব ফেজে ক্র্যাশ হলে, স্ট্যাক ট্রেস তৈরি হতে পারে যা বোঝা কঠিন, যার ফলে ক্র্যাশের কারণ হিসেবে সঠিক ফাংশন বা কোডের লাইন চিহ্নিত করা কঠিন হয়ে পড়ে।

স্ট্যাক ট্রেসে সোর্সের তথ্য যোগ করুন

স্ট্যাক ট্রেস রিডেবিলিটি উন্নত করতে, একটি অপ্ট-ইন API আরও সমৃদ্ধ ক্র্যাশ লোকেশন বিবরণ প্রদান করে, যার মধ্যে কম্পোজেবল নাম এবং লোকেশন অন্তর্ভুক্ত থাকে, যা আপনাকে নিম্নলিখিত কাজগুলি করতে সক্ষম করে:

  • ক্র্যাশ সোর্স দক্ষতার সাথে শনাক্ত ও সমাধান করুন
  • রিপ্রোডিউস করা যায় এমন স্যাম্পেলের জন্য ক্র্যাশ আইসোলেট করুন
  • আগে শুধু ইন্টার্নাল স্ট্যাক ফ্রেম দেখানো ক্র্যাশগুলি তদন্ত করুন

Compose রানটাইম কম্পোজিশনে ক্র্যাশ লোকেশন শনাক্ত করতে পারে এবং আপনার @Composable হায়ারার্কির উপর ভিত্তি করে স্ট্যাক ট্রেস পুনর্নির্মাণ করতে পারে। ক্র্যাশের জন্য স্ট্যাক ট্রেস এখানে যোগ করা হয়েছে:

  • রচনা
  • DisposableEffect এবং LaunchedEffect (onDispose বা বাতিল করা ছাড়া)
  • rememberCoroutineScope-এ Coroutines লঞ্চ করা হয়েছে
  • পরিমাপ, লেআউট ও ড্র পাস

এই ফিচার চালু করতে, অ্যাপ্লিকেশন এন্ট্রি পয়েন্টে নিম্নলিখিত লাইনগুলি যোগ করুন:

// 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: ছোট করা অ্যাপের জন্য স্ট্যাক ট্রেস তৈরি করা হয়। ছোট করার পরেও গ্রুপ কী সংক্রান্ত তথ্য রেখে দেওয়া হয় এবং Compose কম্পাইলার ও R8-এর মাধ্যমে নির্গত প্রো-গার্ড ম্যাপিং ফাইলের সাথে একসাথে ব্যবহার করা হয় যাতে @Composable ফাংশনের আনুমানিক লোকেশন আবার তৈরি করা যায়। এই স্ট্যাক ট্রেসগুলি কম সুনির্দিষ্ট এবং রানটাইমে অতিরিক্ত কাজ এড়ানোর জন্য অপ্টিমাইজ করা হয়েছে। Kotlin 2.3.0 থেকে শুরু করে কম্পোজ কম্পাইলার অতিরিক্ত R8 ম্যাপিংয়ের এমিশন সাপোর্ট করে।
  • 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 রানটাইম কম্পোনেন্ট-এ কোনও সাপ্রেসড ক্র্যাশ বা স্ট্যাক ট্রেস অসঙ্গতি রিপোর্ট করুন।