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

Jetpack Compose-এর পারফর্ম্যান্স সর্বাধিক করার জন্য বেসলাইন প্রোফাইল অপরিহার্য। আপনার ক্রিটিকাল ইউজার জার্নি প্রি-কম্পাইল করলে তা আপনার Compose UI স্মুথভাবে রেন্ডার করতে সাহায্য করে।

Jetpack Macrobenchmark লাইব্রেরি ও BaselineProfileRule ব্যবহার করে প্রতিটি অ্যাপ রিলিজের জন্য অটোমেটিক প্রোফাইল তৈরি করুন। বেসলাইন প্রোফাইল ব্যবহার করার সময় বিল্ডের উন্নতির সুবিধা নিতে আমরা আপনাকে com.android.tools.build:gradle:8.0.0 বা তার চেয়ে উন্নত ভার্সন ব্যবহার করার সাজেশন দিই।

নতুন বেসলাইন প্রোফাইল তৈরি করার সাধারণ ধাপগুলি এখানে দেওয়া হল:

  1. বেসলাইন প্রোফাইল মডিউল সেট-আপ করুন।
  2. JUnit টেস্টকে সংজ্ঞায়িত করুন যা বেসলাইন প্রোফাইল তৈরি করতে সাহায্য করে।
  3. আপনি যে ক্রিটিকাল ইউজার জার্নি (CUJ) অপ্টিমাইজ করতে চান সেটি যোগ করুন।
  4. বেসলাইন প্রোফাইল তৈরি করুন।

বেসলাইন প্রোফাইল তৈরি করার পরে, স্পিড কতটা উন্নত হয়েছে তা পরিমাপ করতে ফিজিক্যাল ডিভাইস ব্যবহার করে বেঞ্চমার্ক করুন।

AGP 8.2 বা তার চেয়ে উন্নত ভার্সন ব্যবহার করে নতুন বেসলাইন প্রোফাইল তৈরি করা

নতুন বেসলাইন প্রোফাইল তৈরি করার সবচেয়ে সহজ উপায় হল বেসলাইন প্রোফাইল মডিউল টেমপ্লেট ব্যবহার করা, যা Android Studio Iguana এবং Android Gradle প্লাগ-ইন (AGP) 8.2 থেকে শুরু করে উপলভ্য।

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

বেসলাইন প্রোফাইল মডিউল সেট-আপ করা

বেসলাইন প্রোফাইল মডিউল টেমপ্লেট রান করতে, এই ধাপগুলি অনুসরণ করুন:

  1. ফাইল > নতুন > নতুন মডিউল বিকল্প বেছে নিন।
  2. টেমপ্লেট প্যানেলে Baseline Profile Generator টেমপ্লেট বেছে নিন এবং এটি কনফিগার করুন:
    ছবি ১. বেসলাইন প্রোফাইল জেনারেটর মডিউল টেমপ্লেট।
    টেমপ্লেটে নিম্নলিখিত ফিল্ডগুলি রয়েছে:
    • টার্গেট অ্যাপ্লিকেশন: যে অ্যাপের জন্য বেসলাইন প্রোফাইল তৈরি করা হয়েছে। আপনার প্রোজেক্টে শুধুমাত্র একটি অ্যাপ মডিউল থাকলে, এই তালিকায় শুধুমাত্র একটি আইটেম থাকে।
    • মডিউলের নাম: বেসলাইন প্রোফাইল মডিউল তৈরি করার সময় আপনি যে নাম দিতে চান।
    • প্যাকেজের নাম: Baseline Profile মডিউলের জন্য আপনি যে প্যাকেজের নাম চান।
    • ভাষা: আপনি Kotlin নাকি Java-তে কোড জেনারেট করতে চান।
    • বিল্ড কনফিগারেশন ভাষা: আপনি বিল্ড কনফিগারেশন স্ক্রিপ্টের জন্য Kotlin Script (KTS) নাকি Groovy ব্যবহার করতে চান।
    • Gradle-এর ম্যানেজ করা ডিভাইস ব্যবহার করা: আপনি অ্যাপ পরীক্ষা করার জন্য Gradle-এর ম্যানেজ করা ডিভাইস ব্যবহার করছেন কিনা।
  3. শেষ করুন বিকল্পে ক্লিক করুন এবং নতুন মডিউল তৈরি হয়ে যাবে। আপনি সোর্স কন্ট্রোল ব্যবহার করলে, আপনাকে সোর্স কন্ট্রোলে নতুন তৈরি করা মডিউল ফাইল যোগ করার জন্য প্রম্পট করা হতে পারে।

বেসলাইন প্রোফাইল জেনারেটর নির্ধারণ করুন

নতুন তৈরি করা মডিউলে বেসলাইন প্রোফাইল তৈরি ও বেঞ্চমার্ক করা এবং শুধুমাত্র বেসিক অ্যাপ স্টার্ট-আপ টেস্ট করার জন্য টেস্ট অন্তর্ভুক্ত থাকে। আমরা সাজেস্ট করি যে আপনি এগুলি CUJ এবং উন্নত স্টার্টআপ ওয়ার্কফ্লো অন্তর্ভুক্ত করার জন্য বৃদ্ধি করুন। অ্যাপ স্টার্ট-আপ সম্পর্কিত যেকোনও পরীক্ষা rule ব্লকে আছে কিনা তা নিশ্চিত করুন, যেখানে includeInStartupProfile-কে true-এ সেট করা আছে; অন্যদিকে, সেরা পারফর্ম্যান্সের জন্য নিশ্চিত করুন যে অ্যাপ স্টার্ট-আপের সাথে সম্পর্কিত নয় এমন কোনও পরীক্ষা স্টার্ট-আপ প্রোফাইলে অন্তর্ভুক্ত করা হয়নি। অ্যাপ স্টার্টআপ অপ্টিমাইজেশন ব্যবহার করে বেসলাইন প্রোফাইলের একটি বিশেষ অংশকে সংজ্ঞায়িত করা হয়, যাকে স্টার্টআপ প্রোফাইল বলা হয়।

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

বেসলাইন প্রোফাইল জেনারেট ও ইনস্টল করা

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

বেসলাইন প্রোফাইল রান কনফিগারেশন তৈরি করুন।
ছবি ২. এই কনফিগারেশন রান করলে বেসলাইন প্রোফাইল তৈরি হয়।

বেসলাইন প্রোফাইল তৈরি করুন রান কনফিগারেশন সম্পূর্ণ হলে, এটি তৈরি করা বেসলাইন প্রোফাইলটি প্রোফাইল করা হচ্ছে এমন মডিউলের src/variant/generated/baselineProfiles/baseline-prof.txt ফাইলে কপি করে। ভ্যারিয়েন্ট বিকল্পগুলি হয় রিলিজ বিল্ড টাইপ অথবা রিলিজ বিল্ড টাইপ সহ বিল্ড ভ্যারিয়েন্ট।

জেনারেট করা বেসলাইন প্রোফাইলটি আসলে build/outputs-এ তৈরি করা হয়েছে। সম্পূর্ণ পাথ প্রোফাইল করা অ্যাপের ভ্যারিয়েন্ট বা ফ্লেভার এবং প্রোফাইলিংয়ের জন্য আপনি Gradle-এর ম্যানেজ করা ডিভাইস বা কানেক্ট করা ডিভাইস ব্যবহার করেন কিনা তার উপর নির্ভর করে। আপনি যদি কোড দ্বারা ব্যবহৃত নাম ব্যবহার করেন এবং টেমপ্লেট দ্বারা তৈরি কনফিগারেশন তৈরি করেন, তাহলে বেসলাইন প্রোফাইলটি build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt ফাইলে তৈরি হয়। আপনি ম্যানুয়ালি টার্গেট মডিউলে কপি না করলে (সাজেস্ট করা হয় না), তৈরি করা বেসলাইন প্রোফাইলের এই ভার্সনের সাথে সরাসরি ইন্টার‍্যাক্ট করতে হবে না।

AGP 8.1-এর সাহায্যে নতুন বেসলাইন প্রোফাইল তৈরি করা

আপনি বেসলাইন প্রোফাইল মডিউল টেমপ্লেট ব্যবহার করতে না পারলে, নতুন বেসলাইন প্রোফাইল তৈরি করতে Macrobenchmark মডিউল টেমপ্লেট এবং বেসলাইন প্রোফাইল Gradle প্লাগ-ইন ব্যবহার করুন। আমরা সাজেস্ট করি যে আপনি Android Studio Giraffe এবং AGP 8.1 থেকে শুরু করে এইসব টুল ব্যবহার করুন।

Macrobenchmark মডিউল টেমপ্লেট এবং বেসলাইন প্রোফাইল Gradle প্লাগ-ইন ব্যবহার করে নতুন বেসলাইন প্রোফাইল তৈরি করার ধাপগুলি এখানে দেওয়া হল:

  1. আপনার Gradle প্রোজেক্টে Macrobenchmark মডিউল সেট-আপ করুন।
  2. BaselineProfileGenerator নামে একটি নতুন ক্লাস সংজ্ঞায়িত করুন:

    class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                startActivityAndWait()
            }
        )
    }
    

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

  3. Baseline Profile Gradle প্লাগ-ইন যোগ করুন (libs.plugins.androidx.baselineprofile)। প্লাগ-ইনটি Baseline Profile তৈরি করা এবং ভবিষ্যতে সেগুলি বজায় রাখা সহজ করে তোলে।

  4. বেসলাইন প্রোফাইল তৈরি করতে, টার্মিনালে :app:generateBaselineProfile বা :app:generateVariantBaselineProfile Gradle টাস্ক রান করুন।

    রুট করা ফিজিক্যাল ডিভাইস, এমুলেটর বা Gradle-এর ম্যানেজ করা ডিভাইসে ইনস্ট্রুমেন্টেড টেস্ট হিসেবে জেনারেটর চালান। আপনি Gradle-এর ম্যানেজ করা ডিভাইস ব্যবহার করলে, aosp-কে systemImageSource হিসেবে সেট করুন, কারণ বেসলাইন প্রোফাইল জেনারেটরের জন্য আপনার রুট অ্যাক্সেস প্রয়োজন।

    জেনারেট করার টাস্কের শেষে, বেসলাইন প্রোফাইল app/src//generated/baselineProfiles-এ কপি করা হয়।

টেমপ্লেট ছাড়াই নতুন বেসলাইন প্রোফাইল তৈরি করুন

আমরা Android Studio বেসলাইন প্রোফাইল মডিউল টেমপ্লেট (পছন্দসই) বা Macrobenchmark টেমপ্লেট ব্যবহার করে বেসলাইন প্রোফাইল তৈরি করার সাজেশন দিই, তবে আপনি বেসলাইন প্রোফাইল Gradle প্লাগ-ইনও ব্যবহার করতে পারেন। বেসলাইন প্রোফাইল Gradle প্লাগ-ইন সম্পর্কে আরও জানতে, বেসলাইন প্রোফাইল জেনারেশন কনফিগার করুন দেখুন।

বেসলাইন প্রোফাইল গ্রেডেল প্লাগ-ইন সরাসরি ব্যবহার করে কীভাবে বেসলাইন প্রোফাইল তৈরি করবেন তা এখানে দেওয়া হল:

  1. নতুন com.android.test মডিউল তৈরি করুন—যেমন, :baseline-profile।
  2. :baseline-profile-এর জন্য build.gradle.kts ফাইল কনফিগার করুন:

    1. androidx.baselineprofile প্লাগ-ইন প্রয়োগ করুন।
    2. targetProjectPath যেন :app মডিউলের দিকে পয়েন্ট করে তা নিশ্চিত করুন।
    3. বিকল্প হিসেবে, Gradle-এর ম্যানেজ করা ডিভাইস (GMD) যোগ করুন। নিম্নলিখিত উদাহরণে, এটি হল pixel6Api31। নির্দিষ্ট করা না থাকলে, প্লাগ-ইনটি একটি কানেক্ট করা ডিভাইস ব্যবহার করে, সেটি এমুলেট করা বা ফিজিক্যাল হতে পারে।
    4. নিচের উদাহরণে যেভাবে দেখানো হয়েছে সেই হিসেবে আপনি যে কনফিগারেশন চান তা প্রয়োগ করুন।

    Kotlin

    plugins {
        id("com.android.test")
        id("androidx.baselineprofile")
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath = ":app"
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device = "Pixel 6"
                apiLevel = 31
                systemImageSource = "aosp"
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices += "pixel6Api31"
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices = false
    }

    গ্ৰুভি

    plugins {
        id 'com.android.test'
        id 'androidx.baselineprofile'
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath ':app'
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device 'Pixel 6'
                apiLevel 31
                systemImageSource 'aosp'
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices ['pixel6Api31']
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices false
    }
  3. :baseline-profile টেস্ট মডিউলে বেসলাইন প্রোফাইল টেস্ট তৈরি করুন। নিম্নলিখিত উদাহরণটি হল একটি পরীক্ষা যা অ্যাপ স্টার্টআপের জন্য একটি বেসলাইন প্রোফাইল জেনারেট করে।

        class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                uiAutomator { startApp(PACKAGE_NAME) }
            }
        )
    }
    
  4. অ্যাপ মডিউলে build.gradle.kts ফাইল আপডেট করুন, যেমন :app।

    1. androidx.baselineprofile প্লাগ-ইন প্রয়োগ করুন।
    2. :baseline-profile মডিউলে baselineProfile ডিপেন্ডেন্সি যোগ করুন।

    Kotlin

    plugins {
        id("com.android.application")
        id("androidx.baselineprofile")
    }
    
    android {
        // There are no changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile(project(":baseline-profile"))
    }

    গ্ৰুভি

    plugins {
        id 'com.android.application'
        id 'androidx.baselineprofile'
    }
    
    android {
        // No changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile ':baseline-profile'
    }
  5. :app:generateBaselineProfile বা :app:generateVariantBaselineProfile Gradle টাস্ক রান করে প্রোফাইল জেনারেট করুন।

  6. জেনারেট করার টাস্কের শেষে, বেসলাইন প্রোফাইল app/src/variant/generated/baselineProfiles-এ কপি করা হয়।

বেসলাইন প্রোফাইল বেঞ্চমার্ক করা

আপনার বেসলাইন প্রোফাইল বেঞ্চমার্ক করতে, গাটার অ্যাকশন থেকে একটি নতুন Android ইন্সট্রুমেন্টেড টেস্ট রান কনফিগারেশন তৈরি করুন যা StartupBenchmarks.kt ফাইলে সংজ্ঞায়িত বেঞ্চমার্কগুলি কার্যকর করে। বেঞ্চমার্ক টেস্টিং সম্পর্কে আরও জানতে, Macrobenchmark ক্লাস তৈরি করুন এবং Macrobenchmark লাইব্রেরির সাথে বেঞ্চমার্ক বেসলাইন প্রোফাইল দেখুন।

ছবি ৩. গাটার থেকে Android টেস্ট রান করুন action.

আপনি Android Studio-তে এটি রান করলে, বিল্ড আউটপুটে বেসলাইন প্রোফাইলের মাধ্যমে স্পিড উন্নত করার বিবরণ থাকে:

StartupBenchmarks_startupCompilationBaselineProfiles
timeToInitialDisplayMs   min 161.8,   median 178.9,   max 194.6
StartupBenchmarks_startupCompilationNone
timeToInitialDisplayMs   min 184.7,   median 196.9,   max 202.9

প্রয়োজনীয় সব কোড পাথ ক্যাপচার করুন

অ্যাপ স্টার্টআপের সময় পরিমাপ করার জন্য দুটি গুরুত্বপূর্ণ মেট্রিক হল:

ComponentActivity-এর reportFullyDrawn পদ্ধতি কল করা হলে TTFD রিপোর্ট করা হয়। reportFullyDrawn কখনও কল করা না হলে, পরিবর্তে TTID রিপোর্ট করা হয়। অ্যাসিঙ্ক্রোনাস লোডিং সম্পূর্ণ না হওয়া পর্যন্ত reportFullyDrawn কল করার সময় আপনাকে দেরি করতে হতে পারে। যেমন, UI-তে যদি কোনও ডায়নামিক লেজি লিস্ট থাকে, তাহলে লিস্টটি ব্যাকগ্রাউন্ড টাস্কের মাধ্যমে পপুলেট করা হতে পারে যা লিস্টটি প্রথমবার ড্র করার পরে সম্পূর্ণ হয় এবং তাই UI-কে সম্পূর্ণভাবে ড্র করা হিসেবে চিহ্নিত করার পরে হয়। এই ধরনের ক্ষেত্রে, UI সম্পূর্ণভাবে আঁকা অবস্থায় পৌঁছানোর পরে যে কোডটি চলে তা বেসলাইন প্রোফাইলে অন্তর্ভুক্ত করা হয় না।

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

সম্পূর্ণভাবে আঁকা অবস্থা নির্দেশ করতে, নিম্নলিখিত Compose API ব্যবহার করুন:

  • ReportDrawn থেকে বোঝা যায় যে আপনার কম্পোজেবল ইন্টার‍্যাকশনের জন্য তৎক্ষণাৎ রেডি।
  • আপনার কম্পোজেবল কখন ইন্টার‍্যাকশনের জন্য রেডি তা নির্দেশ করতে, ReportDrawnWhen একটি প্রেডিকেট নেয়, যেমন list.count > 0।
  • ReportDrawnAfter একটি সাসপেন্ডিং পদ্ধতি গ্রহণ করে, যা সম্পূর্ণ হলে, ইঙ্গিত করে যে আপনার কম্পোজ করার উপযুক্ত আইটেম ইন্টার‍্যাকশনের জন্য প্রস্তুত।