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

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

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

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

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

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

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