কম্পোজে স্ট্যাক ট্রেস

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

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

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

  • ক্র্যাশ উৎসগুলি দক্ষতার সাথে সনাক্ত করুন এবং সমাধান করুন
  • পুনরুৎপাদনযোগ্য নমুনার জন্য ক্র্যাশগুলি আলাদা করুন
  • যেসব ক্র্যাশ আগে শুধুমাত্র অভ্যন্তরীণ স্ট্যাক ফ্রেম দেখিয়েছিল সেগুলি তদন্ত করুন

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

যেকোনো চাপা ক্র্যাশ বা স্ট্যাক ট্রেস অসঙ্গতি কম্পোজ রানটাইম কম্পোনেন্টে রিপোর্ট করুন।