জ্যাঙ্কস্ট্যাটস লাইব্রেরি

JankStats লাইব্রেরি আপনাকে আপনার অ্যাপ্লিকেশনে কর্মক্ষমতা সমস্যা ট্র্যাক এবং বিশ্লেষণ করতে সাহায্য করে। জ্যাঙ্ক এমন অ্যাপ্লিকেশন ফ্রেমগুলিকে বোঝায় যেগুলি রেন্ডার করতে খুব বেশি সময় নেয় এবং JankStats লাইব্রেরি আপনার অ্যাপের জ্যাঙ্ক পরিসংখ্যানের রিপোর্ট প্রদান করে৷

ক্ষমতা

JankStats Android 7 (API স্তর 24) এর FrameMetrics API এবং পূর্ববর্তী সংস্করণগুলিতে উচ্চতর বা OnPreDrawListener সহ বিদ্যমান অ্যান্ড্রয়েড প্ল্যাটফর্ম সক্ষমতার উপরে তৈরি করে। এই প্রক্রিয়াগুলি অ্যাপ্লিকেশনগুলিকে ফ্রেমগুলি সম্পূর্ণ হতে কতক্ষণ সময় নেয় তা ট্র্যাক করতে সহায়তা করতে পারে। JanksStats লাইব্রেরি দুটি অতিরিক্ত ক্ষমতা অফার করে যা এটিকে আরও গতিশীল এবং ব্যবহার করা সহজ করে তোলে: জ্যাঙ্ক হিউরিস্টিকস এবং UI স্টেট।

জ্যাঙ্ক হিউরিস্টিকস

আপনি ফ্রেমের সময়কাল ট্র্যাক করতে FrameMetrics ব্যবহার করতে পারলেও, FrameMetrics প্রকৃত জ্যাঙ্ক নির্ধারণে কোনো সহায়তা প্রদান করে না। JankStats, যাইহোক, জ্যাঙ্ক কখন ঘটবে তা নির্ধারণ করার জন্য কনফিগারযোগ্য, অভ্যন্তরীণ প্রক্রিয়া রয়েছে, যা প্রতিবেদনগুলিকে আরও অবিলম্বে উপযোগী করে তোলে।

UI অবস্থা

আপনার অ্যাপে পারফরম্যান্স সমস্যার প্রেক্ষাপট জানা প্রায়ই প্রয়োজন। উদাহরণ স্বরূপ, আপনি যদি ফ্রেমমেট্রিক্স ব্যবহার করে এমন একটি জটিল, মাল্টি-স্ক্রিন অ্যাপ তৈরি করেন এবং আপনি আবিষ্কার করেন যে আপনার অ্যাপে প্রায়শই অত্যন্ত ঝাঁকুনিযুক্ত ফ্রেম রয়েছে, তাহলে সমস্যাটি কোথায় ঘটেছে, ব্যবহারকারী কী করছেন এবং কী করছেন তা জেনে আপনি সেই তথ্যটিকে প্রাসঙ্গিক করতে চাইবেন। কিভাবে এটি প্রতিলিপি করা.

JankStats একটি state API প্রবর্তন করে এই সমস্যার সমাধান করে যা আপনাকে অ্যাপের কার্যকলাপ সম্পর্কে তথ্য প্রদানের জন্য লাইব্রেরির সাথে যোগাযোগ করতে দেয়। যখন JankStats একটি জ্যাঙ্কি ফ্রেম সম্পর্কে তথ্য লগ করে, তখন এটি জ্যাঙ্ক রিপোর্টে অ্যাপ্লিকেশনটির বর্তমান অবস্থা অন্তর্ভুক্ত করে।

ব্যবহার

JankStats ব্যবহার করা শুরু করতে, প্রতিটি Window জন্য লাইব্রেরি চালু করুন এবং সক্রিয় করুন। প্রতিটি JankStats অবজেক্ট শুধুমাত্র একটি Window মধ্যে ডেটা ট্র্যাক করে। লাইব্রেরি চালু করার জন্য একটি OnFrameListener লিসেনারের সাথে একটি Window ইন্সট্যান্স প্রয়োজন, উভয়ই ক্লায়েন্টকে মেট্রিক্স পাঠাতে ব্যবহৃত হয়। শ্রোতাকে প্রতিটি ফ্রেমে FrameData দিয়ে ডাকা হয় এবং বিশদ বিবরণ দেওয়া হয়:

  • ফ্রেম শুরুর সময়
  • সময়কাল মান
  • ফ্রেমটি জ্যাঙ্ক হিসাবে বিবেচনা করা উচিত কি না
  • ফ্রেমের সময় অ্যাপ্লিকেশন অবস্থা সম্পর্কে তথ্য ধারণকারী স্ট্রিং জোড়ার একটি সেট

JankStatsকে আরও উপযোগী করে তুলতে, অ্যাপ্লিকেশনগুলিকে ফ্রেমডেটাতে রিপোর্ট করার জন্য প্রাসঙ্গিক UI রাজ্যের তথ্য সহ লাইব্রেরি পূরণ করা উচিত। আপনি PerformanceMetricsState API (সরাসরি JankStats নয়) এর মাধ্যমে এটি করতে পারেন, যেখানে সমস্ত স্টেট ম্যানেজমেন্ট লজিক এবং API থাকে।

আরম্ভ

JankStats লাইব্রেরি ব্যবহার শুরু করতে, প্রথমে আপনার Gradle ফাইলে JankStats নির্ভরতা যোগ করুন:

implementation "androidx.metrics:metrics-performance:1.0.0-beta01"

এরপরে, প্রতিটি Window জন্য JankStats শুরু এবং সক্ষম করুন। কোনো অ্যাক্টিভিটি ব্যাকগ্রাউন্ডে গেলে আপনাকে JankStats ট্র্যাকিংও থামাতে হবে। আপনার কার্যকলাপ ওভাররাইডে JankStats অবজেক্ট তৈরি এবং সক্ষম করুন:

class JankLoggingActivity : AppCompatActivity() {

    private lateinit var jankStats: JankStats


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        // metrics state holder can be retrieved regardless of JankStats initialization
        val metricsStateHolder = PerformanceMetricsState.getHolderForHierarchy(binding.root)

        // initialize JankStats for current window
        jankStats = JankStats.createAndTrack(window, jankFrameListener)

        // add activity name as state
        metricsStateHolder.state?.putState("Activity", javaClass.simpleName)
        // ...
    }

উপরের উদাহরণটি JankStats অবজেক্ট তৈরি করার পরে বর্তমান কার্যকলাপ সম্পর্কে রাষ্ট্রীয় তথ্য ইনজেক্ট করে। এই JankStats অবজেক্টের জন্য তৈরি করা সমস্ত ভবিষ্যত ফ্রেমডেটা রিপোর্টে এখন কার্যকলাপের তথ্যও অন্তর্ভুক্ত রয়েছে।

JankStats.createAndTrack পদ্ধতিটি একটি Window অবজেক্টের একটি রেফারেন্স নেয়, যা সেই Window ভিতরের ভিউ হায়ারার্কি এবং সেই সাথে Window জন্য একটি প্রক্সি। jankFrameListener একই থ্রেডে কল করা হয় যা প্ল্যাটফর্ম থেকে JankStats-এ অভ্যন্তরীণভাবে তথ্য সরবরাহ করতে ব্যবহৃত হয়।

যেকোনো JankStats অবজেক্টে ট্র্যাকিং এবং রিপোর্টিং সক্ষম করতে, isTrackingEnabled = true কল করুন। যদিও এটি ডিফল্টরূপে সক্রিয় থাকে, কোনো কার্যকলাপকে বিরতি দিলে তা ট্র্যাকিং অক্ষম করে। এই ক্ষেত্রে, এগিয়ে যাওয়ার আগে ট্র্যাকিং পুনরায় সক্ষম করতে ভুলবেন না। ট্র্যাকিং বন্ধ করতে, isTrackingEnabled = false কল করুন।

override fun onResume() {
    super.onResume()
    jankStats.isTrackingEnabled = true
}

override fun onPause() {
    super.onPause()
    jankStats.isTrackingEnabled = false
}

রিপোর্টিং

JankStats লাইব্রেরি আপনার সমস্ত ডেটা ট্র্যাকিং রিপোর্ট করে, প্রতিটি ফ্রেমের জন্য, সক্রিয় JankStats অবজেক্টের জন্য OnFrameListener কে। অ্যাপগুলি পরবর্তী সময়ে আপলোড করার জন্য এই ডেটা সংরক্ষণ এবং একত্রিত করতে পারে। আরও তথ্যের জন্য, সমষ্টি বিভাগে দেওয়া উদাহরণগুলি দেখুন।

প্রতি-ফ্রেম প্রতিবেদনগুলি পেতে আপনার অ্যাপের জন্য আপনাকে OnFrameListener তৈরি এবং সরবরাহ করতে হবে। অ্যাপগুলিতে চলমান জ্যাঙ্ক ডেটা সরবরাহ করার জন্য এই শ্রোতাকে প্রতিটি ফ্রেমে ডাকা হয়।

private val jankFrameListener = JankStats.OnFrameListener { frameData ->
    // A real app could do something more interesting, like writing the info to local storage and later on report it.
    Log.v("JankStatsSample", frameData.toString())
}

শ্রোতা FrameData অবজেক্টের সাথে জ্যাঙ্ক সম্পর্কে প্রতি-ফ্রেম তথ্য প্রদান করে। এতে অনুরোধ করা ফ্রেম সম্পর্কে নিম্নলিখিত তথ্য রয়েছে:

  • isjank : একটি বুলিয়ান পতাকা যা নির্দেশ করে যে ফ্রেমে জ্যাঙ্ক ঘটেছে কিনা।
  • frameDurationUiNanos : ফ্রেমের সময়কাল (ন্যানোসেকেন্ডে)।
  • frameStartNanos : ফ্রেম শুরু হওয়ার সময় (ন্যানোসেকেন্ডে)।
  • states : ফ্রেমের সময় আপনার অ্যাপের অবস্থা।

আপনি যদি অ্যান্ড্রয়েড 12 (এপিআই লেভেল 31) বা উচ্চতর ব্যবহার করেন, আপনি ফ্রেমের সময়কাল সম্পর্কে আরও ডেটা প্রকাশ করতে নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

  • FrameDataApi24 ফ্রেমের নন-GPU অংশগুলিতে ব্যয় করা সময় প্রদর্শন করতে frameDurationCpuNanos প্রদান করে।
  • FrameDataApi31 ফ্রেমটি সম্পূর্ণ করতে যে ফ্রেমের সময়সীমা অতিক্রম করেছে তা প্রদর্শন করার জন্য frameOverrunNanos প্রদান করে।

অ্যাপ্লিকেশন অবস্থা সম্পর্কে তথ্য সঞ্চয় করতে শ্রোতার মধ্যে StateInfo ব্যবহার করুন।

মনে রাখবেন যে OnFrameListener একই থ্রেডে কল করা হয় যা অভ্যন্তরীণভাবে JankStats-এ প্রতি-ফ্রেম তথ্য সরবরাহ করতে ব্যবহৃত হয়। অ্যান্ড্রয়েড সংস্করণ 6 (এপিআই স্তর 23) এবং নীচে, এটি প্রধান (UI) থ্রেড। অ্যান্ড্রয়েড সংস্করণ 7 (এপিআই স্তর 24) এবং উচ্চতর, এটি ফ্রেমমেট্রিক্সের জন্য তৈরি এবং ব্যবহৃত থ্রেড। উভয় ক্ষেত্রেই, কলব্যাক পরিচালনা করা এবং সেই থ্রেডে কর্মক্ষমতা সমস্যা প্রতিরোধ করতে দ্রুত ফিরে আসা গুরুত্বপূর্ণ।

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

সমষ্টি

আপনি সম্ভবত আপনার অ্যাপ কোড প্রতি-ফ্রেম ডেটা একত্রিত করতে চাইবেন, যা আপনাকে আপনার নিজস্ব বিবেচনার ভিত্তিতে তথ্য সংরক্ষণ এবং আপলোড করতে দেয়। যদিও সংরক্ষণ এবং আপলোডের বিশদ বিবরণ আলফা JankStats API প্রকাশের সুযোগের বাইরে, আপনি আমাদের GitHub সংগ্রহস্থলে উপলব্ধ JankAggregatorActivity ব্যবহার করে একটি বড় সংগ্রহে প্রতি-ফ্রেম ডেটা একত্রিত করার জন্য একটি প্রাথমিক কার্যকলাপ দেখতে পারেন।

JankAggregatorActivity JankStatsAggregator ক্লাস ব্যবহার করে JankStats OnFrameListener মেকানিজমের উপরে তার নিজস্ব রিপোর্টিং মেকানিজম লেয়ার করার জন্য শুধুমাত্র অনেকগুলি ফ্রেমে বিস্তৃত তথ্যের একটি সংগ্রহ রিপোর্ট করার জন্য একটি উচ্চ স্তরের বিমূর্ততা প্রদান করে।

সরাসরি একটি JankStats অবজেক্ট তৈরি করার পরিবর্তে, JankAggregatorActivity একটি JankStatsAggregator অবজেক্ট তৈরি করে, যা অভ্যন্তরীণভাবে নিজস্ব JankStats অবজেক্ট তৈরি করে:

class JankAggregatorActivity : AppCompatActivity() {

    private lateinit var jankStatsAggregator: JankStatsAggregator


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        // Metrics state holder can be retrieved regardless of JankStats initialization.
        val metricsStateHolder = PerformanceMetricsState.getHolderForHierarchy(binding.root)

        // Initialize JankStats with an aggregator for the current window.
        jankStatsAggregator = JankStatsAggregator(window, jankReportListener)

        // Add the Activity name as state.
        metricsStateHolder.state?.putState("Activity", javaClass.simpleName)
    }

একই ধরনের পদ্ধতি JankAggregatorActivity এ পজ এবং ট্র্যাকিং পুনরায় শুরু করার জন্য ব্যবহার করা হয়, যার সংকেত হিসাবে pause() ইভেন্ট যোগ করা হয় issueJankReport() এ কল সহ একটি রিপোর্ট জারি করার জন্য, কারণ জীবনচক্র পরিবর্তনগুলি অবস্থা ক্যাপচার করার জন্য উপযুক্ত সময় বলে মনে হয় অ্যাপ্লিকেশনে জ্যাঙ্ক:

override fun onResume() {
    super.onResume()
    jankStatsAggregator.jankStats.isTrackingEnabled = true
}

override fun onPause() {
    super.onPause()
    // Before disabling tracking, issue the report with (optionally) specified reason.
    jankStatsAggregator.issueJankReport("Activity paused")
    jankStatsAggregator.jankStats.isTrackingEnabled = false
}

উপরের উদাহরণ কোডটি হল একটি অ্যাপকে JankStats সক্ষম করতে এবং ফ্রেম ডেটা গ্রহণ করতে হবে।

রাষ্ট্র পরিচালনা করুন

এটা সম্ভব যে আপনি JankStats কাস্টমাইজ করতে অন্য API কল করতে চাইতে পারেন। উদাহরণ স্বরূপ, অ্যাপ স্টেট ইনফরমেশন ইনজেকশন করা ফ্রেম ডেটাকে আরও সহায়ক করে তোলে সেই ফ্রেমের জন্য প্রসঙ্গ প্রদান করে যেখানে জ্যাঙ্ক ঘটে।

এই স্ট্যাটিক পদ্ধতিটি একটি প্রদত্ত ভিউ হায়ারার্কির জন্য বর্তমান MetricsStateHolder অবজেক্টটি পুনরুদ্ধার করে।

PerformanceMetricsState.getHolderForHierarchy(view: View): MetricsStateHolder

একটি সক্রিয় অনুক্রমের যেকোনো দৃশ্য ব্যবহার করা যেতে পারে। অভ্যন্তরীণভাবে, এই ভিউ হায়ারার্কির সাথে যুক্ত একটি বিদ্যমান Holder অবজেক্ট আছে কিনা তা পরীক্ষা করে। এই তথ্যটি সেই শ্রেণিবিন্যাসের শীর্ষে একটি ভিউতে ক্যাশে করা হয়েছে। যদি এই ধরনের কোন বস্তু বিদ্যমান না থাকে, getHolderForHierarchy() একটি তৈরি করে।

স্ট্যাটিক getHolderForHierarchy() পদ্ধতি আপনাকে পরবর্তীতে পুনরুদ্ধারের জন্য হোল্ডার ইন্সট্যান্সকে কোথাও ক্যাশে করা এড়াতে দেয় এবং কোডের (বা এমনকি লাইব্রেরি কোড, যা অন্যথায় অ্যাক্সেস করতে পারে না) যেকোন জায়গা থেকে একটি বিদ্যমান স্টেট অবজেক্ট পুনরুদ্ধার করা সহজ করে তোলে। মূল উদাহরণ)।

নোট করুন যে রিটার্ন মান একটি ধারক বস্তু, রাষ্ট্র বস্তু নিজেই নয়। ধারকের ভিতরের রাষ্ট্রীয় বস্তুর মান শুধুমাত্র JankStats দ্বারা সেট করা হয়। অর্থাৎ, যদি একটি অ্যাপ্লিকেশন সেই ভিউ হায়ারার্কি ধারণকারী উইন্ডোর জন্য একটি JankStats অবজেক্ট তৈরি করে, তাহলে স্টেট অবজেক্ট তৈরি এবং সেট করা হয়। অন্যথায়, JankStats ব্যতীত তথ্য ট্র্যাক করে, স্টেট অবজেক্টের কোন প্রয়োজন নেই, এবং অ্যাপ বা লাইব্রেরি কোডের জন্য স্টেট ইনজেক্ট করার প্রয়োজন নেই।

এই পন্থাটি এমন একটি ধারককে পুনরুদ্ধার করা সম্ভব করে যা JankStats তখন পপুলেট করতে পারে। বাহ্যিক কোড যে কোনো সময় ধারককে জিজ্ঞাসা করতে পারে। কলাররা লাইটওয়েট Holder অবজেক্টকে ক্যাশে করতে পারে এবং যেকোনো সময় স্টেট সেট করতে এটি ব্যবহার করতে পারে, তার অভ্যন্তরীণ state প্রপার্টির মানের উপর নির্ভর করে, যেমন নিচের উদাহরণ কোডে, যেখানে স্টেট শুধুমাত্র তখনই সেট করা হয় যখন হোল্ডারের অভ্যন্তরীণ স্টেট প্রোপার্টি অ-নাল থাকে:

val metricsStateHolder = PerformanceMetricsState.getHolderForHierarchy(binding.root)
// ...
metricsStateHolder.state?.putState("Activity", javaClass.simpleName)

UI/অ্যাপ অবস্থা নিয়ন্ত্রণ করতে, একটি অ্যাপ putState এবং removeState পদ্ধতির সাহায্যে একটি স্টেটকে ইনজেকশন (বা অপসারণ) করতে পারে। JankStats এই কলগুলির জন্য টাইমস্ট্যাম্প লগ করে। যদি একটি ফ্রেম রাজ্যের শুরু এবং শেষের সময়কে ওভারল্যাপ করে, JankStats রিপোর্ট করে যে ফ্রেমের সময় ডেটা সহ রাজ্যের তথ্য।

যেকোনো রাজ্যের জন্য, তথ্যের দুটি টুকরো যোগ করুন: key (রাজ্যের একটি বিভাগ, যেমন "রিসাইক্লারভিউ") এবং value (সেই সময়ে কী ঘটছিল সে সম্পর্কে তথ্য, যেমন "স্ক্রলিং")।

রিমুভ স্টেট removeState() মেথড ব্যবহার করে স্টেট রিমুভ করুন যখন সেই স্টেট আর বৈধ থাকে না, যাতে ফ্রেম ডেটা দিয়ে ভুল বা বিভ্রান্তিকর তথ্য রিপোর্ট করা না হয় তা নিশ্চিত করতে।

putState() কে পূর্বে যোগ করা একটি key দিয়ে কল করলে সেই স্টেটের বিদ্যমান value নতুনটির সাথে প্রতিস্থাপন করা হয়।

স্টেট এপিআই-এর putSingleFrameState() সংস্করণ একটি স্টেট যোগ করে যা পরবর্তী রিপোর্ট করা ফ্রেমে শুধুমাত্র একবার লগ করা হয়। সিস্টেম স্বয়ংক্রিয়ভাবে এর পরে এটিকে সরিয়ে দেয়, নিশ্চিত করে যে আপনার কোডে ভুলবশত অপ্রচলিত অবস্থা নেই। মনে রাখবেন যে removeState() এর কোনো একক ফ্রেম সমতুল্য নেই, যেহেতু JankStats একক-ফ্রেম অবস্থা স্বয়ংক্রিয়ভাবে সরিয়ে দেয়।

private val scrollListener = object : RecyclerView.OnScrollListener() {
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        // check if JankStats is initialized and skip adding state if not
        val metricsState = metricsStateHolder?.state ?: return

        when (newState) {
            RecyclerView.SCROLL_STATE_DRAGGING -> {
                metricsState.putState("RecyclerView", "Dragging")
            }
            RecyclerView.SCROLL_STATE_SETTLING -> {
                metricsState.putState("RecyclerView", "Settling")
            }
            else -> {
                metricsState.removeState("RecyclerView")
            }
        }
    }
}

নোট করুন যে রাজ্যগুলির জন্য ব্যবহৃত কীটি পরবর্তী বিশ্লেষণের জন্য যথেষ্ট অর্থপূর্ণ হওয়া উচিত। বিশেষ করে, যেহেতু পূর্বে যোগ করা একই key সহ একটি রাজ্য সেই আগের মানটিকে প্রতিস্থাপন করবে, তাই আপনার অ্যাপ বা লাইব্রেরিতে ভিন্ন উদাহরণ থাকতে পারে এমন বস্তুর জন্য অনন্য key নাম ব্যবহার করার চেষ্টা করা উচিত। উদাহরণস্বরূপ, পাঁচটি ভিন্ন RecyclerViews সহ একটি অ্যাপ তাদের প্রত্যেকের জন্য শুধুমাত্র RecyclerView ব্যবহার করার পরিবর্তে তাদের প্রত্যেকের জন্য শনাক্তযোগ্য কী প্রদান করতে চাইতে পারে এবং তারপরে ফ্রেম ডেটা বোঝায় এমন উদাহরণের ফলাফলে সহজে বলতে পারবে না।

জ্যাঙ্ক হিউরিস্টিকস

জ্যাঙ্ক হিসাবে বিবেচিত হয় তা নির্ধারণের জন্য অভ্যন্তরীণ অ্যালগরিদম সামঞ্জস্য করতে, jankHeuristicMultiplier বৈশিষ্ট্য ব্যবহার করুন।

ডিফল্টরূপে, সিস্টেম জ্যাঙ্ককে একটি ফ্রেম হিসাবে সংজ্ঞায়িত করে যা বর্তমান রিফ্রেশ রেট হিসাবে রেন্ডার করতে দ্বিগুণ সময় নেয়। এটি রিফ্রেশ হারের উপরে জ্যাঙ্ককে কিছু হিসাবে বিবেচনা করে না কারণ অ্যাপ রেন্ডারিং সময় সম্পর্কে তথ্য সম্পূর্ণরূপে পরিষ্কার নয়। অতএব, একটি বাফার যোগ করা এবং শুধুমাত্র যখন তারা লক্ষণীয় কর্মক্ষমতা সমস্যা সৃষ্টি করে তখনই সমস্যার রিপোর্ট করা ভাল বলে মনে করা হয়।

অ্যাপের পরিস্থিতির সাথে আরও ঘনিষ্ঠভাবে মানানসই করার জন্য এই পদ্ধতিগুলির মাধ্যমে এই দুটি মানই পরিবর্তন করা যেতে পারে, বা পরীক্ষার জন্য প্রয়োজন অনুযায়ী জ্যাঙ্ক ঘটতে বা না ঘটতে বাধ্য করার জন্য পরীক্ষায়।

জেটপ্যাক রচনায় ব্যবহার

বর্তমানে কম্পোজে JankStats ব্যবহার করার জন্য খুব কম সেটআপ প্রয়োজন। কনফিগারেশন পরিবর্তন জুড়ে PerformanceMetricsState ধরে রাখতে, এটিকে এভাবে মনে রাখুন:

/**
 * Retrieve MetricsStateHolder from compose and remember until the current view changes.
 */
@Composable
fun rememberMetricsStateHolder(): PerformanceMetricsState.Holder {
    val view = LocalView.current
    return remember(view) { PerformanceMetricsState.getHolderForHierarchy(view) }
}

এবং JankStats ব্যবহার করতে, এখানে দেখানো হিসাবে stateHolder এ বর্তমান অবস্থা যোগ করুন:

val metricsStateHolder = rememberMetricsStateHolder()

// Reporting scrolling state from compose should be done from side effect to prevent recomposition.
LaunchedEffect(metricsStateHolder, listState) {
    snapshotFlow { listState.isScrollInProgress }.collect { isScrolling ->
        if (isScrolling) {
            metricsStateHolder.state?.putState("LazyList", "Scrolling")
        } else {
            metricsStateHolder.state?.removeState("LazyList")
        }
    }
}

আপনার জেটপ্যাক কম্পোজ অ্যাপ্লিকেশনে JankStats ব্যবহার করার সম্পূর্ণ বিবরণের জন্য, আমাদের কর্মক্ষমতা নমুনা অ্যাপটি দেখুন।

মতামত প্রদান করুন

এই সম্পদগুলির মাধ্যমে আমাদের সাথে আপনার প্রতিক্রিয়া এবং ধারণা শেয়ার করুন:

সমস্যা অনুসরণকারী
সমস্যাগুলি রিপোর্ট করুন যাতে আমরা বাগগুলি ঠিক করতে পারি৷
{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}