বেসলাইন প্রোফাইলের সাথে অ্যাপের কর্মক্ষমতা উন্নত করুন

১. শুরু করার আগে

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

আপনার যা যা লাগবে

আপনি যা করবেন

  • বেসলাইন প্রোফাইল জেনারেটর ব্যবহার করার জন্য প্রজেক্টটি সেট আপ করুন।
  • অ্যাপ চালু হওয়া এবং স্ক্রোলিং পারফরম্যান্স অপ্টিমাইজ করতে বেসলাইন প্রোফাইল তৈরি করুন।
  • Jetpack Macrobenchmark লাইব্রেরির সাহায্যে পারফরম্যান্সের উন্নতি যাচাই করুন।

আপনি যা শিখবেন

  • বেসলাইন প্রোফাইল এবং কীভাবে সেগুলো অ্যাপের পারফরম্যান্স উন্নত করতে পারে।
  • বেসলাইন প্রোফাইল কীভাবে তৈরি করবেন।
  • বেসলাইন প্রোফাইলগুলোর কর্মক্ষমতা বৃদ্ধি।

২. প্রস্তুতি গ্রহণ

শুরু করার জন্য, নিম্নলিখিত কমান্ডটি ব্যবহার করে কমান্ড লাইন থেকে গিটহাব রিপোজিটরিটি ক্লোন করুন:

$ git clone https://github.com/android/codelab-android-performance.git

বিকল্পভাবে, আপনি দুটি জিপ ফাইল ডাউনলোড করতে পারেন:

অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্টটি খুলুন

  1. অ্যান্ড্রয়েড স্টুডিও-তে স্বাগতম উইন্ডোতে, নির্বাচন করুন 61d0a4432ef6d396.png একটি বিদ্যমান প্রকল্প খুলুন
  2. [Download Location]/codelab-android-performance/baseline-profiles ফোল্ডারটি নির্বাচন করুন। নিশ্চিত করুন যে আপনি baseline-profiles ডিরেক্টরিটি নির্বাচন করেছেন।
  3. যখন অ্যান্ড্রয়েড স্টুডিও প্রজেক্টটি ইম্পোর্ট করবে, তখন নিশ্চিত করুন যেন আপনি app মডিউলটি রান করতে পারেন, যাতে পরবর্তীতে ব্যবহার করার জন্য স্যাম্পল অ্যাপ্লিকেশনটি বিল্ড করা যায়।

নমুনা অ্যাপটি

এই কোডল্যাবে, আপনি JetSnack স্যাম্পল অ্যাপ্লিকেশনটি নিয়ে কাজ করবেন। এটি একটি ভার্চুয়াল স্ন্যাক অর্ডারিং অ্যাপ যা Jetpack Compose ব্যবহার করে।

অ্যাপ্লিকেশনটির পারফরম্যান্স পরিমাপ করার জন্য, আপনাকে UI-এর গঠন এবং অ্যাপটি কীভাবে কাজ করে তা বুঝতে হবে, যাতে আপনি বেঞ্চমার্ক থেকে UI এলিমেন্টগুলো অ্যাক্সেস করতে পারেন। অ্যাপটি চালান এবং স্ন্যাকস অর্ডার করার মাধ্যমে বেসিক স্ক্রিনগুলোর সাথে পরিচিত হয়ে নিন। অ্যাপটির আর্কিটেকচার কীভাবে করা হয়েছে, তার বিস্তারিত আপনার জানার প্রয়োজন নেই।

23633b02ac7ce1bc.png

৩. বেসলাইন প্রোফাইল বলতে কী বোঝায়

বেসলাইন প্রোফাইল অন্তর্ভুক্ত কোড পাথগুলির জন্য ইন্টারপ্রিটেশন এবং জাস্ট-ইন-টাইম (JIT) কম্পাইলেশন ধাপগুলি এড়িয়ে চলার মাধ্যমে প্রথমবার চালু হওয়া থেকেই কোড এক্সিকিউশনের গতি প্রায় ৩০% বাড়িয়ে দেয়। কোনো অ্যাপ বা লাইব্রেরিতে একটি বেসলাইন প্রোফাইল অন্তর্ভুক্ত করার মাধ্যমে, অ্যান্ড্রয়েড রানটাইম (ART) অ্যাহেড অফ টাইম (AOT) কম্পাইলেশনের মাধ্যমে অন্তর্ভুক্ত কোড পাথগুলিকে অপ্টিমাইজ করতে পারে, যা প্রত্যেক নতুন ব্যবহারকারী এবং প্রতিটি অ্যাপ আপডেটে পারফরম্যান্সের উন্নতি ঘটায়। এই প্রোফাইল-নির্দেশিত অপ্টিমাইজেশন (PGO) অ্যাপগুলিকে স্টার্টআপ অপ্টিমাইজ করতে, ইন্টারঅ্যাকশন জ্যাঙ্ক কমাতে এবং প্রথমবার চালু হওয়া থেকেই ব্যবহারকারীদের জন্য সামগ্রিক রানটাইম পারফরম্যান্স উন্নত করতে সাহায্য করে।

বেসলাইন প্রোফাইলের মাধ্যমে, ব্যবহারকারীর সমস্ত কার্যকলাপ—যেমন অ্যাপ চালু করা, বিভিন্ন স্ক্রিনের মধ্যে যাতায়াত করা বা কন্টেন্ট স্ক্রল করা—প্রথমবার চলার সময় থেকেই আরও সাবলীল হয়। একটি অ্যাপের গতি এবং রেসপন্সিভনেস বৃদ্ধি পেলে তার দৈনিক সক্রিয় ব্যবহারকারীর সংখ্যা বাড়ে এবং পুনরায় ভিজিট করার গড় হারও বৃদ্ধি পায়।

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

বেসলাইন প্রোফাইল ব্যবহার না করলে, ডিভাইস নিষ্ক্রিয় থাকাকালীন অ্যাপের সমস্ত কোড ব্যাকগ্রাউন্ডে ইন্টারপ্রেট বা একটি ওডেক্স ফাইলে JIT কম্পাইল করা হয়। এর ফলে, নতুন পাথগুলো অপ্টিমাইজ হওয়ার আগে, প্রথমবার অ্যাপটি ইনস্টল বা আপডেট করার পর তা চালানোর সময় ব্যবহারকারীরা একটি নিম্নমানের অভিজ্ঞতা পেতে পারেন।

৪. বেসলাইন প্রোফাইল জেনারেটর মডিউলটি সেট আপ করুন।

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

প্রজেক্ট প্যানেলে আপনার প্রজেক্ট বা মডিউলের উপর রাইট-ক্লিক করে New > Module নির্বাচন করে নতুন মডিউল উইজার্ড উইন্ডোটি খুলুন।

232b04efef485e9c.png

খোলা উইন্ডো থেকে, টেমপ্লেট প্যানে থেকে বেসলাইন প্রোফাইল জেনারেটর নির্বাচন করুন।

b191fe07969e8c26.png

মডিউল নেম, প্যাকেজ নেম, ল্যাঙ্গুয়েজ বা বিল্ড কনফিগারেশন ল্যাঙ্গুয়েজের মতো সাধারণ প্যারামিটারগুলো ছাড়াও, দুটি ইনপুট রয়েছে যা একটি নতুন মডিউলের জন্য সাধারণত ব্যবহৃত হয় না: টার্গেট অ্যাপ্লিকেশন এবং ইউজ গ্রেডল ম্যানেজড ডিভাইস

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

‘Use Gradle Managed Device’ চেকবক্সটি মডিউলটিকে বেসলাইন প্রোফাইল জেনারেটরগুলো স্বয়ংক্রিয়ভাবে পরিচালিত অ্যান্ড্রয়েড এমুলেটরগুলোতে চালানোর জন্য সেট করে। আপনি ‘ Scale your tests with Gradle Managed Devices’ অংশে গ্রেডল ম্যানেজড ডিভাইস সম্পর্কে আরও পড়তে পারেন। আপনি যদি এটি আনচেক করেন, তাহলে জেনারেটরগুলো যেকোনো সংযুক্ত ডিভাইস ব্যবহার করবে।

নতুন মডিউলটির সমস্ত বিবরণ নির্ধারণ করার পরে, মডিউল তৈরির প্রক্রিয়াটি এগিয়ে নিতে ফিনিশ-এ ক্লিক করুন।

মডিউল উইজার্ড দ্বারা করা পরিবর্তনসমূহ

মডিউল উইজার্ড আপনার প্রজেক্টে বেশ কিছু পরিবর্তন করে।

এটি baselineprofile নামের অথবা উইজার্ডে আপনার নির্বাচিত নামে একটি গ্রেডল মডিউল যোগ করে।

এই মডিউলটি com.android.test প্লাগইন ব্যবহার করে, যা গ্রেডলকে (Gradle) আপনার অ্যাপ্লিকেশনে এটিকে অন্তর্ভুক্ত না করার নির্দেশ দেয়, ফলে এতে শুধুমাত্র টেস্টিং কোড বা বেঞ্চমার্ক থাকতে পারে। এটি androidx.baselineprofile প্লাগইনটিও প্রয়োগ করে, যা বেসলাইন প্রোফাইল তৈরি করার প্রক্রিয়াকে স্বয়ংক্রিয় করে তোলে।

উইজার্ডটি আপনার নির্বাচিত টার্গেট অ্যাপ্লিকেশন মডিউলেও পরিবর্তন আনে। বিশেষত, এটি নতুন তৈরি হওয়া মডিউলের build.gradle(.kts) ফাইলে androidx.baselineprofile প্লাগইন প্রয়োগ করে, androidx.profileinstaller ডিপেন্ডেন্সি এবং baselineProfile ডিপেন্ডেন্সি যোগ করে।

plugins {
  id("androidx.baselineprofile")
}

dependencies {
  // ...
  implementation("androidx.profileinstaller:profileinstaller:1.3.0")
  "baselineProfile"(project(mapOf("path" to ":baselineprofile")))
}

androidx.profileinstaller ডিপেন্ডেন্সিটি যোগ করলে আপনি নিম্নলিখিত কাজগুলো করতে পারবেন:

  • তৈরি করা বেসলাইন প্রোফাইলগুলোর কর্মক্ষমতার উন্নতি স্থানীয়ভাবে যাচাই করুন।
  • Android 7 (API লেভেল 24) এবং Android 8 (API লেভেল 26)-এ বেসলাইন প্রোফাইল ব্যবহার করুন, যেগুলোতে ক্লাউড প্রোফাইল সাপোর্ট করে না।
  • যেসব ডিভাইসে গুগল প্লে সার্ভিস নেই, সেগুলোতে বেসলাইন প্রোফাইল ব্যবহার করুন।

baselineProfile(project(":baselineprofile")) ডিপেন্ডেন্সিটি গ্রেডলকে জানিয়ে দেয় যে, তৈরি করা বেসলাইন প্রোফাইলগুলো কোন মডিউল থেকে নিতে হবে।

এখন যেহেতু আপনার প্রজেক্টটি প্রস্তুত, একটি বেসলাইন প্রোফাইল জেনারেটর ক্লাস লিখুন।

৫. একটি বেসলাইন প্রোফাইল জেনারেটর লিখুন।

সাধারণত, আপনি আপনার অ্যাপের সাধারণ ব্যবহারকারী যাত্রাপথগুলোর জন্য বেসলাইন প্রোফাইল তৈরি করেন।

মডিউল উইজার্ড একটি মৌলিক BaselineProfileGenerator টেস্ট ক্লাস তৈরি করে, যা আপনার অ্যাপ চালু হওয়ার জন্য বেসলাইন প্রোফাইল তৈরি করতে সক্ষম এবং দেখতে নিম্নরূপ:

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect("com.example.baselineprofiles_codelab") {
            // This block defines the app's critical user journey. This is where you
            // optimize for app startup. You can also navigate and scroll
            // through your most important UI.

            // Start default activity for your app.
            pressHome()
            startActivityAndWait()

            // TODO Write more interactions to optimize advanced journeys of your app.
            // For example:
            // 1. Wait until the content is asynchronously loaded.
            // 2. Scroll the feed content.
            // 3. Navigate to detail screen.

            // Check UiAutomator documentation for more information about how to interact with the app.
            // https://d.android.com/training/testing/other-components/ui-automator
        }
    }
}

এই ক্লাসটি একটি BaselineProfileRule টেস্ট রুল ব্যবহার করে এবং প্রোফাইল তৈরির জন্য এতে একটি টেস্ট মেথড রয়েছে। প্রোফাইল তৈরির এন্ট্রি পয়েন্ট হলো collect() ফাংশন। এর জন্য মাত্র দুটি প্যারামিটার প্রয়োজন:

  • packageName : আপনার অ্যাপের প্যাকেজ।
  • profileBlock : সর্বশেষ ল্যাম্বডা প্যারামিটার।

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

ডিফল্টরূপে, তৈরি করা জেনারেটর ক্লাসটিতে আপনার ডিফল্ট Activity শুরু করার জন্য ইন্টারঅ্যাকশন থাকে এবং startActivityAndWait() মেথড ব্যবহার করে আপনার অ্যাপের প্রথম ফ্রেমটি রেন্ডার হওয়া পর্যন্ত অপেক্ষা করে।

কাস্টম যাত্রা দিয়ে জেনারেটরটি প্রসারিত করুন

আপনি দেখতে পাবেন যে তৈরি হওয়া ক্লাসটিতে আপনার অ্যাপের উন্নত পর্যায়গুলোকে অপ্টিমাইজ করার জন্য আরও ইন্টারঅ্যাকশন লেখার কিছু TODO অন্তর্ভুক্ত রয়েছে। এটি করার পরামর্শ দেওয়া হচ্ছে, যাতে আপনি অ্যাপ চালু হওয়ার পরেও পারফরম্যান্স অপ্টিমাইজ করতে পারেন।

আমাদের নমুনা অ্যাপে, আপনি নিম্নলিখিত কাজগুলো করে এই যাত্রাগুলো শনাক্ত করতে পারেন:

  1. অ্যাপ্লিকেশনটি চালু করুন। তৈরি করা ক্লাসটিতে এই বিষয়টি ইতিমধ্যেই আংশিকভাবে অন্তর্ভুক্ত রয়েছে।
  2. কন্টেন্টটি অ্যাসিঙ্ক্রোনাসভাবে লোড হওয়া পর্যন্ত অপেক্ষা করুন।
  3. খাবারের তালিকাটি স্ক্রোল করুন।
  4. স্ন্যাকের বিবরণে যান।

নিম্নলিখিত কোড স্নিপেটে বর্ণিত সাধারণ যাত্রাপথগুলো অন্তর্ভুক্ত করে এমন ফাংশনগুলো যোগ করার জন্য জেনারেটরটি পরিবর্তন করুন:

// ...
rule.collect("com.example.baselineprofiles_codelab") {
    // This block defines the app's critical user journey. This is where you
    // optimize for app startup. You can also navigate and scroll
    // through your most important UI.

    // Start default activity for your app.
    pressHome()
    startActivityAndWait()

    // TODO Write more interactions to optimize advanced journeys of your app.
    // For example:
    // 1. Wait until the content is asynchronously loaded.
    waitForAsyncContent()
    // 2. Scroll the feed content.
    scrollSnackListJourney()
    // 3. Navigate to detail screen.
    goToSnackDetailJourney()

    // Check UiAutomator documentation for more information about how to interact with the app.
    // https://d.android.com/training/testing/other-components/ui-automator
}
// ...

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

অ্যাসিঙ্ক্রোনাস কন্টেন্টের জন্য অপেক্ষা করুন

অনেক অ্যাপে অ্যাপ চালু হওয়ার সময় এক ধরনের অ্যাসিঙ্ক্রোনাস লোডিং থাকে, যা ‘ সম্পূর্ণ প্রদর্শিত অবস্থা’ (fully displayed state) নামেও পরিচিত। এটি সিস্টেমকে জানিয়ে দেয় কখন কন্টেন্ট লোড ও রেন্ডার হয়েছে এবং ব্যবহারকারী সেটির সাথে ইন্টারঅ্যাক্ট করতে পারবে। জেনারেটরে ( waitForAsyncContent ) এই ইন্টারঅ্যাকশনগুলো ব্যবহার করে স্টেটটির জন্য অপেক্ষা করুন:

  1. ফিড স্ন্যাক তালিকাটি খুঁজুন।
  2. তালিকার কিছু আইটেম স্ক্রিনে দৃশ্যমান হওয়া পর্যন্ত অপেক্ষা করুন।
fun MacrobenchmarkScope.waitForAsyncContent() {
   device.wait(Until.hasObject(By.res("snack_list")), 5_000)
   val contentList = device.findObject(By.res("snack_list"))
   // Wait until a snack collection item within the list is rendered.
   contentList.wait(Until.hasObject(By.res("snack_collection")), 5_000)
}

স্ক্রোলিং তালিকার যাত্রা

স্ক্রোলিং স্ন্যাক লিস্ট জার্নির ( scrollSnackListJourney ) জন্য, আপনি এই ইন্টারঅ্যাকশনগুলো অনুসরণ করতে পারেন:

  1. স্ন্যাক লিস্ট UI এলিমেন্টটি খুঁজুন।
  2. সিস্টেম নেভিগেশন চালু না করার জন্য জেসচার মার্জিন সেট করুন।
  3. তালিকাটি স্ক্রল করুন এবং UI স্থির হওয়া পর্যন্ত অপেক্ষা করুন।
fun MacrobenchmarkScope.scrollSnackListJourney() {
   val snackList = device.findObject(By.res("snack_list"))
   // Set gesture margin to avoid triggering gesture navigation.
   snackList.setGestureMargin(device.displayWidth / 5)
   snackList.fling(Direction.DOWN)
   device.waitForIdle()
}

বিস্তারিত যাত্রায় যান

শেষ যাত্রাটি ( goToSnackDetailJourney ) নিম্নলিখিত মিথস্ক্রিয়াগুলো বাস্তবায়ন করে:

  1. জলখাবারের তালিকা এবং আপনার কাজে লাগতে পারে এমন সমস্ত খাবার খুঁজে বের করুন।
  2. তালিকা থেকে একটি আইটেম নির্বাচন করুন।
  3. আইটেমটিতে ক্লিক করুন এবং বিস্তারিত স্ক্রিনটি লোড হওয়া পর্যন্ত অপেক্ষা করুন। আপনি এই সুযোগটি কাজে লাগাতে পারেন যে স্ন্যাক তালিকাটি আর স্ক্রিনে থাকবে না।
fun MacrobenchmarkScope.goToSnackDetailJourney() {
    val snackList = device.findObject(By.res("snack_list"))
    val snacks = snackList.findObjects(By.res("snack_item"))
    // Select snack from the list based on running iteration.
    val index = (iteration ?: 0) % snacks.size
    snacks[index].click()
    // Wait until the screen is gone = the detail is shown.
    device.wait(Until.gone(By.res("snack_list")), 5_000)
}

আপনার বেসলাইন প্রোফাইল জেনারেটরটি চালানোর জন্য প্রয়োজনীয় সমস্ত ইন্টারঅ্যাকশন নির্ধারণ করার পরে, আপনাকে এটি যে ডিভাইসে চলবে তা নির্ধারণ করতে হবে।

৬. জেনারেটর চালানোর জন্য একটি যন্ত্র প্রস্তুত করুন।

বেসলাইন প্রোফাইল তৈরি করার জন্য, আমরা গ্রেডল ম্যানেজড ডিভাইসের মতো কোনো এমুলেটর অথবা অ্যান্ড্রয়েড ১৩ (এপিআই ৩৩) বা তার উচ্চতর সংস্করণে চালিত কোনো ডিভাইস ব্যবহার করার পরামর্শ দিই।

প্রক্রিয়াটিকে পুনরাবৃত্তিযোগ্য করতে এবং বেসলাইন প্রোফাইল তৈরি স্বয়ংক্রিয় করতে, আপনি গ্রেডল ম্যানেজড ডিভাইস ব্যবহার করতে পারেন। গ্রেডল ম্যানেজড ডিভাইস আপনাকে ম্যানুয়ালি চালু এবং বন্ধ করার প্রয়োজন ছাড়াই একটি অ্যান্ড্রয়েড এমুলেটরে টেস্ট চালাতে দেয়। আপনি "গ্রেডল ম্যানেজড ডিভাইস দিয়ে আপনার টেস্ট স্কেল করুন" অংশে গ্রেডল ম্যানেজড ডিভাইস সম্পর্কে আরও জানতে পারেন।

একটি Gradle Managed Device সংজ্ঞায়িত করতে, নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী এর সংজ্ঞাটি :baselineprofile মডিউলের build.gradle.kts ফাইলে যোগ করুন:

android {
  // ...

  testOptions.managedDevices.devices {
    create<ManagedVirtualDevice>("pixel6Api31") {
        device = "Pixel 6"
        apiLevel = 31
        systemImageSource = "aosp"
    }
  } 
}

এক্ষেত্রে, আমরা অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩১) ব্যবহার করি এবং aosp সিস্টেম ইমেজটি রুটেড অ্যাক্সেসের জন্য সক্ষম।

এরপরে, নির্ধারিত গ্রেডল ম্যানেজড ডিভাইসটি ব্যবহার করার জন্য বেসলাইন প্রোফাইল গ্রেডল প্লাগইনটি কনফিগার করুন। এটি করার জন্য, managedDevices প্রপার্টিতে ডিভাইসটির নাম যোগ করুন এবং নিচের কোড স্নিপেটে দেখানো অনুযায়ী useConnectedDevices নিষ্ক্রিয় করুন:

android {
  // ...
}

baselineProfile {
   managedDevices += "pixel6Api31"
   useConnectedDevices = false
}

dependencies {
  // ...
}

এরপর, বেসলাইন প্রোফাইলটি তৈরি করুন।

৭. বেসলাইন প্রোফাইল তৈরি করুন

ডিভাইসটি প্রস্তুত হয়ে গেলে, আপনি বেসলাইন প্রোফাইল তৈরি করতে পারবেন। বেসলাইন প্রোফাইল গ্র্যাডল প্লাগইনটি জেনারেটর টেস্ট ক্লাস চালানো এবং আপনার অ্যাপে তৈরি করা বেসলাইন প্রোফাইলগুলো প্রয়োগ করার সম্পূর্ণ প্রক্রিয়াটিকে স্বয়ংক্রিয় করতে গ্র্যাডল টাস্ক তৈরি করে।

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

এটি চালানোর জন্য, Generate Baseline Profile রান কনফিগারেশনটি খুঁজুন এবং Run বোতামে ক্লিক করুন। 599be5a3531f863b.png .

6911ecf1307a213f.png

এই টাস্কটি পূর্বে সংজ্ঞায়িত এমুলেটর ইমেজটি চালু করে। BaselineProfileGenerator টেস্ট ক্লাস থেকে ইন্টারঅ্যাকশনগুলো বেশ কয়েকবার চালান, এবং তারপরে এমুলেটরটি বন্ধ করে আউটপুটটি অ্যান্ড্রয়েড স্টুডিওতে প্রদান করুন।

জেনারেটরটি সফলভাবে সম্পন্ন হলে, গ্রেডল প্লাগইনটি স্বয়ংক্রিয়ভাবে তৈরি হওয়া baseline-prof.txt ফাইলটি আপনার টার্গেট অ্যাপ্লিকেশনের ( :app মডিউল) src/release/generated/baselineProfile/ ফোল্ডারে রেখে দেয়।

fa0f52de5d2ce5e8.png

(ঐচ্ছিক) কমান্ড লাইন থেকে জেনারেটরটি চালান।

বিকল্পভাবে, আপনি কমান্ড লাইন থেকে জেনারেটরটি চালাতে পারেন। আপনি গ্রেডল ম্যানেজড ডিভাইস দ্বারা তৈরি টাস্ক— :app:generateBaselineProfile ব্যবহার করতে পারেন। এই কমান্ডটি baselineProfile(project(:baselineProfile)) ডিপেন্ডেন্সি দ্বারা সংজ্ঞায়িত প্রোজেক্টের সমস্ত টেস্ট চালায়। যেহেতু মডিউলটিতে পারফরম্যান্সের উন্নতির পরবর্তী যাচাইয়ের জন্য বেঞ্চমার্কও রয়েছে, তাই এমুলেটরে বেঞ্চমার্ক চালানোর বিরুদ্ধে একটি সতর্কবার্তা সহ সেই টেস্টগুলো ব্যর্থ হয়।

android
   .testInstrumentationRunnerArguments
   .androidx.benchmark.enabledRules=BaselineProfile

এর জন্য, আপনি নিম্নলিখিত ইন্সট্রুমেন্টেশন রানার আর্গুমেন্ট ব্যবহার করে সমস্ত বেসলাইন প্রোফাইল জেনারেটর ফিল্টার করতে পারেন এবং সমস্ত বেঞ্চমার্ক এড়িয়ে যাওয়া হবে:

সম্পূর্ণ কমান্ডটি দেখতে নিম্নরূপ:

./gradlew :app:generateBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile

বেসলাইন প্রোফাইলের সাথে আপনার অ্যাপ বিতরণ করুন

বেসলাইন প্রোফাইল তৈরি হয়ে গেলে এবং আপনার অ্যাপের সোর্স কোডে কপি করার পর, স্বাভাবিকভাবে আপনার অ্যাপের প্রোডাকশন সংস্করণটি বিল্ড করুন। আপনার ব্যবহারকারীদের কাছে বেসলাইন প্রোফাইলগুলো বিতরণ করার জন্য আপনাকে অতিরিক্ত কিছু করতে হবে না। বিল্ড করার সময় অ্যান্ড্রয়েড গ্রেডল প্লাগইন এগুলো সংগ্রহ করে আপনার AAB বা APK-তে অন্তর্ভুক্ত করে নেয়। এরপর, বিল্ডটি গুগল প্লে-তে আপলোড করুন।

যখন ব্যবহারকারীরা অ্যাপটি ইনস্টল করেন বা পূর্ববর্তী সংস্করণ থেকে আপডেট করেন, তখন বেসলাইন প্রোফাইলটিও ইনস্টল হয়ে যায়, ফলে অ্যাপটি প্রথমবার চালু করার সময় থেকেই উন্নত পারফরম্যান্স পাওয়া যায়।

পরবর্তী ধাপে দেখানো হয়েছে কীভাবে বেসলাইন প্রোফাইলের মাধ্যমে অ্যাপের পারফরম্যান্স কতটা উন্নত হয় তা যাচাই করতে হয়।

৮. (ঐচ্ছিক) বেসলাইন প্রোফাইল তৈরির পদ্ধতি কাস্টমাইজ করুন

বেসলাইন প্রোফাইলস গ্রেডল প্লাগইনটিতে আপনার নির্দিষ্ট প্রয়োজন মেটাতে প্রোফাইলগুলো কীভাবে তৈরি হবে তা কাস্টমাইজ করার অপশন রয়েছে। আপনি বিল্ড স্ক্রিপ্টে baselineProfile { } কনফিগারেশন ব্লক ব্যবহার করে এই আচরণ পরিবর্তন করতে পারেন।

:baselineprofile মডিউলের অন্তর্গত কনফিগারেশন ব্লকটি জেনারেটরগুলো কীভাবে চলবে তা প্রভাবিত করে, যার মাধ্যমে managedDevices যোগ করা যায় এবং useConnectedDevices নাকি গ্রেডল ম্যানেজড ডিভাইস ব্যবহার করা হবে, সেই সিদ্ধান্ত নেওয়া যায়।

:app টার্গেট মডিউলের ভেতরের কনফিগারেশন ব্লকটি নির্ধারণ করে যে প্রোফাইলগুলো কোথায় সংরক্ষিত হবে বা কীভাবে তৈরি হবে। আপনি নিম্নলিখিত প্যারামিটারগুলো পরিবর্তন করতে পারেন:

  • automaticGenerationDuringBuild : এটি চালু করা থাকলে, প্রোডাকশন রিলিজ বিল্ড তৈরির সময় বেসলাইন প্রোফাইল তৈরি করা যায়। আপনার অ্যাপ শিপিং করার আগে CI-তে বিল্ড করার সময় এটি সহায়ক।
  • saveInSrc : এটি নির্দিষ্ট করে যে তৈরি করা বেসলাইন প্রোফাইলটি src/ ফোল্ডারে সংরক্ষণ করা হবে কিনা। বিকল্পভাবে, আপনি :baselineprofile বিল্ড ফোল্ডার থেকেও ফাইলটি অ্যাক্সেস করতে পারেন।
  • baselineProfileOutputDir : তৈরি করা বেসলাইন প্রোফাইলগুলো কোথায় সংরক্ষণ করা হবে তা নির্ধারণ করে।
  • mergeIntoMain : ডিফল্টরূপে, বেসলাইন প্রোফাইলগুলি প্রতিটি বিল্ড ভ্যারিয়েন্ট (প্রোডাক্ট ফ্লেভার এবং বিল্ড টাইপ) অনুসারে তৈরি করা হয়। আপনি যদি সমস্ত প্রোফাইল src/main এ মার্জ করতে চান, তাহলে এই ফ্ল্যাগটি সক্রিয় করে তা করতে পারেন।
  • filter : আপনি তৈরি হওয়া বেসলাইন প্রোফাইলগুলিতে কোন ক্লাস বা মেথড অন্তর্ভুক্ত বা বাদ দেবেন তা ফিল্টার করতে পারেন। এটি সেইসব লাইব্রেরি ডেভেলপারদের জন্য সহায়ক হতে পারে যারা শুধুমাত্র তাদের লাইব্রেরির কোড অন্তর্ভুক্ত করতে চান।

৯. স্টার্টআপ পারফরম্যান্সের উন্নতি যাচাই করুন

বেসলাইন প্রোফাইল তৈরি করে আপনার অ্যাপে যোগ করার পর, যাচাই করে দেখুন যে এটি আপনার অ্যাপের পারফরম্যান্সের উপর কাঙ্ক্ষিত প্রভাব ফেলছে কিনা।

নতুন মডিউল উইজার্ডটি StartupBenchmarks নামে একটি বেঞ্চমার্ক ক্লাস তৈরি করে। এতে অ্যাপ চালু হওয়ার সময় পরিমাপ করার জন্য একটি বেঞ্চমার্ক থাকে এবং অ্যাপটি যখন বেসলাইন প্রোফাইল ব্যবহার করে, তখনকার সময়ের সাথে এর তুলনা করা হয়।

শ্রেণীটি দেখতে নিম্নরূপ:

@RunWith(AndroidJUnit4::class)
@LargeTest
class StartupBenchmarks {

    @get:Rule
    val rule = MacrobenchmarkRule()

    @Test
    fun startupCompilationNone() =
        benchmark(CompilationMode.None())

    @Test
    fun startupCompilationBaselineProfiles() =
        benchmark(CompilationMode.Partial(BaselineProfileMode.Require))

    private fun benchmark(compilationMode: CompilationMode) {
        rule.measureRepeated(
            packageName = "com.example.baselineprofiles_codelab",
            metrics = listOf(StartupTimingMetric()),
            compilationMode = compilationMode,
            startupMode = StartupMode.COLD,
            iterations = 10,
            setupBlock = {
                pressHome()
            },
            measureBlock = {
                startActivityAndWait()

                // TODO Add interactions to wait for when your app is fully drawn.
                // The app is fully drawn when Activity.reportFullyDrawn is called.
                // For Jetpack Compose, you can use ReportDrawn, ReportDrawnWhen and ReportDrawnAfter
                // from the AndroidX Activity library.

                // Check the UiAutomator documentation for more information on how to
                // interact with the app.
                // https://d.android.com/training/testing/other-components/ui-automator
            }
        )
    }
}

এটি MacrobenchmarkRule ব্যবহার করে, যা আপনার অ্যাপের জন্য বেঞ্চমার্ক চালাতে এবং পারফরম্যান্স মেট্রিক্স সংগ্রহ করতে সক্ষম। বেঞ্চমার্ক লেখার এন্ট্রি পয়েন্ট হলো রুলটির measureRepeated ফাংশন।

এর জন্য বেশ কয়েকটি প্যারামিটার প্রয়োজন:

  • packageName: কোন অ্যাপ্লিকেশনটি পরিমাপ করতে হবে।
  • metrics : বেঞ্চমার্ক চলাকালীন আপনি কোন ধরনের তথ্য পরিমাপ করতে চান।
  • iterations : বেঞ্চমার্কটি কতবার পুনরাবৃত্তি করবে।
  • startupMode : আপনার বেঞ্চমার্ক শুরু হওয়ার সময় আপনি আপনার অ্যাপ্লিকেশনটি কীভাবে চালু করতে চান।
  • setupBlock : পরিমাপ করার আগে আপনার অ্যাপের সাথে কী কী ইন্টারঅ্যাকশন অবশ্যই সম্পন্ন হতে হবে।
  • measureBlock : বেঞ্চমার্ক চলাকালীন আপনার অ্যাপের সেইসব ইন্টারঅ্যাকশন যা আপনি পরিমাপ করতে চান।

টেস্ট ক্লাসটিতে startupCompilationeNone() এবং startupCompilationBaselineProfiles() নামে দুটি টেস্টও রয়েছে, যেগুলো ভিন্ন ভিন্ন compilationMode ব্যবহার করে benchmark() ফাংশনটিকে কল করে।

সংকলন মোড

CompilationMode প্যারামিটারটি নির্ধারণ করে যে অ্যাপ্লিকেশনটি কীভাবে মেশিন কোডে প্রি-কম্পাইল করা হবে। এর নিম্নলিখিত অপশনগুলো রয়েছে:

  • DEFAULT : উপলব্ধ থাকলে বেসলাইন প্রোফাইল ব্যবহার করে অ্যাপটিকে আংশিকভাবে প্রি-কম্পাইল করে। কোনো compilationMode প্যারামিটার প্রয়োগ করা না হলে এটি ব্যবহৃত হয়।
  • None() : অ্যাপের কম্পাইলেশন অবস্থা রিসেট করে এবং অ্যাপটিকে প্রি-কম্পাইল করে না। অ্যাপটি চলার সময় জাস্ট-ইন-টাইম কম্পাইলেশন (JIT) সক্রিয় থাকে।
  • Partial() : বেসলাইন প্রোফাইল, ওয়ার্ম-আপ রান অথবা উভয়ই ব্যবহার করে অ্যাপটিকে প্রি-কম্পাইল করে।
  • Full() : সম্পূর্ণ অ্যাপ্লিকেশন কোড প্রি-কম্পাইল করে। অ্যান্ড্রয়েড ৬ (এপিআই ২৩) এবং এর নিচের সংস্করণগুলোতে এটিই একমাত্র বিকল্প।

আপনি যদি আপনার অ্যাপ্লিকেশনের পারফরম্যান্স অপ্টিমাইজ করা শুরু করতে চান, তাহলে আপনি DEFAULT কম্পাইলেশন মোড বেছে নিতে পারেন, কারণ এর পারফরম্যান্স গুগল প্লে থেকে অ্যাপটি ইনস্টল করার সময়ের পারফরম্যান্সের মতোই থাকে। আপনি যদি বেসলাইন প্রোফাইল (Baseline Profiles) দ্বারা প্রদত্ত পারফরম্যান্সের সুবিধাগুলো তুলনা করতে চান, তাহলে আপনি None এবং Partial কম্পাইলেশন মোডের ফলাফল তুলনা করে তা করতে পারেন।

কন্টেন্টের জন্য অপেক্ষা করতে বেঞ্চমার্কটি পরিবর্তন করুন।

আপনার অ্যাপের সাথে ইন্টারঅ্যাকশন লেখার মাধ্যমে বেঞ্চমার্কগুলো বেসলাইন প্রোফাইল জেনারেটরগুলোর মতোই লেখা হয়। ডিফল্টরূপে, তৈরি করা বেঞ্চমার্কগুলো শুধুমাত্র প্রথম ফ্রেমটি রেন্ডার হওয়ার জন্য অপেক্ষা করে—যেমনটা BaselineProfileGenerator করত—তাই আমরা অ্যাসিঙ্ক্রোনাস কন্টেন্টের জন্য অপেক্ষা করার জন্য এটিকে উন্নত করার পরামর্শ দিই।

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

// ...
measureBlock = {
   startActivityAndWait()

   // The app is fully drawn when Activity.reportFullyDrawn is called.
   // For Jetpack Compose, you can use ReportDrawn, ReportDrawnWhen and ReportDrawnAfter
   // from the AndroidX Activity library.
   waitForAsyncContent() // <------- Added to wait for async content.

   // Check the UiAutomator documentation for more information on how to
   // interact with the app.
   // https://d.android.com/training/testing/other-components/ui-automator
}

বেঞ্চমার্কগুলো চালান

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

587b04d1a76d1e9d.png

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

94e0da86b6f399d5.png

একবার আপনি বেঞ্চমার্কটি চালালে, আপনার অ্যাপটি পুনর্নির্মিত হয় এবং তারপর বেঞ্চমার্কগুলো চালায়। আপনার সংজ্ঞায়িত iterations উপর ভিত্তি করে বেঞ্চমার্কগুলো শুরু হয়, বন্ধ হয় এবং এমনকি আপনার অ্যাপটি বেশ কয়েকবার পুনরায় ইনস্টলও করে।

বেঞ্চমার্কগুলো সম্পন্ন হওয়ার পর, আপনি অ্যান্ড্রয়েড স্টুডিও আউটপুটে সময়গুলো দেখতে পাবেন, যেমনটি নিচের স্ক্রিনশটে দেখানো হয়েছে:

282f90d5f6ff5196.png

স্ক্রিনশট থেকে আপনি দেখতে পাচ্ছেন যে, প্রতিটি CompilationMode জন্য অ্যাপ চালু হওয়ার সময় ভিন্ন। মধ্যক মানগুলো নিম্নলিখিত সারণিতে দেখানো হলো:

প্রদর্শন শুরু করার সময় [মিলিসেকেন্ড]

সম্পূর্ণ প্রদর্শনে সময় [মিলিসেকেন্ড]

কোনোটিই না

২০২.২

৮১৮.৮

বেসলাইনপ্রোফাইল

১৯৩.৭

৬৩৭.৯

উন্নতি

৪%

২৮%

timeToFullDisplay এর ক্ষেত্রে কম্পাইলেশন মোডগুলোর মধ্যে পার্থক্য হলো ১৮০ms, যা শুধুমাত্র একটি বেসলাইন প্রোফাইল থাকার কারণে প্রায় ২৮% উন্নতি। CompilationNone এর পারফরম্যান্স খারাপ, কারণ অ্যাপটি চালু হওয়ার সময় ডিভাইসটিকে সবচেয়ে বেশি JIT কম্পাইলিং করতে হয়। CompilationBaselineProfiles পারফরম্যান্স ভালো, কারণ বেসলাইন প্রোফাইলের সাথে আংশিক কম্পাইলেশন AOT পদ্ধতিতে সেই কোড কম্পাইল করে যা ব্যবহারকারীর সবচেয়ে বেশি ব্যবহার করার সম্ভাবনা থাকে এবং কম গুরুত্বপূর্ণ কোডকে প্রি-কম্পাইল না করে রেখে দেয়, ফলে সেটিকে সাথে সাথে লোড করতে হয় না।

১০. (ঐচ্ছিক) স্ক্রোলিং পারফরম্যান্সের উন্নতি যাচাই করুন।

পূর্ববর্তী ধাপের মতোই, আপনি স্ক্রলিং পারফরম্যান্স পরিমাপ ও যাচাই করতে পারেন। প্রথমে, বেঞ্চমার্ক রুল এবং ভিন্ন ভিন্ন কম্পাইলেশন মোড ব্যবহারকারী দুটি টেস্ট মেথড সহ একটি ScrollBenchmarks টেস্ট ক্লাস তৈরি করুন:

@LargeTest
@RunWith(AndroidJUnit4::class)
class ScrollBenchmarks {

   @get:Rule
   val rule = MacrobenchmarkRule()

   @Test
   fun scrollCompilationNone() = scroll(CompilationMode.None())

   @Test
   fun scrollCompilationBaselineProfiles() = scroll(CompilationMode.Partial())

   private fun scroll(compilationMode: CompilationMode) {
       // TODO implement
   }
}

scroll মেথডের ভেতর থেকে, প্রয়োজনীয় প্যারামিটারসহ measureRepeated ফাংশনটি ব্যবহার করুন। metrics প্যারামিটারের জন্য FrameTimingMetric ব্যবহার করুন, যা UI ফ্রেম তৈরি হতে কতক্ষণ সময় লাগে তা পরিমাপ করে:

private fun scroll(compilationMode: CompilationMode) {
   rule.measureRepeated(
       packageName = "com.example.baselineprofiles_codelab",
       metrics = listOf(FrameTimingMetric()),
       compilationMode = compilationMode,
       startupMode = StartupMode.WARM,
       iterations = 10,
       setupBlock = {
           // TODO implement
       },
       measureBlock = {
           // TODO implement
       }
   )
}

এবার, শুধুমাত্র প্রথম লেআউট এবং কন্টেন্ট স্ক্রল করার সময়কার ফ্রেমের সময়কাল পরিমাপ করার জন্য আপনাকে setupBlock এবং measureBlock মধ্যে ইন্টারঅ্যাকশনগুলো আরও ভাগ করে দিতে হবে। অতএব, ডিফল্ট স্ক্রিন চালু করার ফাংশনগুলোকে setupBlock এ এবং আগে থেকে তৈরি করা এক্সটেনশন ফাংশন waitForAsyncContent()scrollSnackListJourney() -কে measureBlock এ রাখুন।

private fun scroll(compilationMode: CompilationMode) {
   rule.measureRepeated(
       packageName = "com.example.baselineprofiles_codelab",
       metrics = listOf(FrameTimingMetric()),
       compilationMode = compilationMode,
       startupMode = StartupMode.WARM,
       iterations = 10,
       setupBlock = {
           pressHome()
           startActivityAndWait()
       },
       measureBlock = {
           waitForAsyncContent()
           scrollSnackListJourney()
       }
   )
}

বেঞ্চমার্কটি প্রস্তুত হয়ে গেলে, আপনি আগের মতোই এটি রান করে নিচের স্ক্রিনশটে দেখানো ফলাফলগুলো পেতে পারেন:

84aa99247226fc3a.png

FrameTimingMetric (FrameTimingMetric) ফ্রেমের সময়কাল মিলিসেকেন্ডে ( frameDurationCpuMs ) ৫০তম, ৯০তম, ৯৫তম এবং ৯৯তম পার্সেন্টাইলে আউটপুট দেয়। অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং এর পরবর্তী সংস্করণগুলোতে, এটি আরও দেখায় যে আপনার ফ্রেমগুলো নির্ধারিত সময়ের কত বেশি সময় ধরে চলছে ( frameOverrunMs )। এই মানটি ঋণাত্মকও হতে পারে, যার অর্থ হলো ফ্রেমটি তৈরি করার জন্য অতিরিক্ত সময় বাকি ছিল।

ফলাফল থেকে দেখা যায় যে, CompilationBaselineProfiles ক্ষেত্রে ফ্রেমের সময়কাল গড়ে ২ms কম, যা ব্যবহারকারীদের কাছে হয়তো লক্ষণীয় নাও হতে পারে। তবে, অন্যান্য পার্সেন্টাইলগুলোর ক্ষেত্রে ফলাফল আরও স্পষ্ট। P99-এর জন্য এই পার্থক্য ৪৩.৫ms , যা ৯০ FPS-এ চালিত একটি ডিভাইসে ৩টিরও বেশি ফ্রেম বাদ পড়ার সমান। উদাহরণস্বরূপ, Pixel 6-এর ক্ষেত্রে একটি ফ্রেম রেন্ডার করতে সর্বোচ্চ সময় লাগে ১০০০ms / ৯০ FPS = প্রায় ১১ms।

১১. অভিনন্দন

অভিনন্দন, আপনি সফলভাবে এই কোডল্যাবটি সম্পন্ন করেছেন এবং বেসলাইন প্রোফাইলের সাহায্যে আপনার অ্যাপের পারফরম্যান্স উন্নত করেছেন!

অতিরিক্ত সম্পদ

নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:

রেফারেন্স নথি