১. শুরু করার আগে
এই কোডল্যাবটি দেখায় যে কীভাবে আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা অপ্টিমাইজ করার জন্য বেসলাইন প্রোফাইল তৈরি করবেন এবং বেসলাইন প্রোফাইল ব্যবহারের কর্মক্ষমতা সুবিধাগুলি কীভাবে যাচাই করবেন।
তোমার যা লাগবে
- অ্যান্ড্রয়েড স্টুডিও হেজহগ (২০২৩.১.১) বা তার পরবর্তী
- অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৮.০ বা তার বেশি
- জেটপ্যাক ম্যাক্রোবেঞ্চমার্কের প্রাথমিক ধারণা
- Android 7 (API লেভেল 24) বা তার বেশি ভার্সন সহ একটি ফিজিক্যাল Android ডিভাইস
তুমি কি করবে
- বেসলাইন প্রোফাইল জেনারেটর ব্যবহার করার জন্য প্রকল্পটি সেট আপ করুন।
- অ্যাপ স্টার্টআপ এবং স্ক্রলিং কর্মক্ষমতা অপ্টিমাইজ করতে বেসলাইন প্রোফাইল তৈরি করুন।
- Jetpack Macrobenchmark লাইব্রেরি দিয়ে কর্মক্ষমতা বৃদ্ধি যাচাই করুন।
তুমি কি শিখবে
- বেসলাইন প্রোফাইল এবং কীভাবে তারা অ্যাপের কর্মক্ষমতা উন্নত করতে পারে।
- কিভাবে বেসলাইন প্রোফাইল তৈরি করবেন।
- বেসলাইন প্রোফাইলের কর্মক্ষমতা লাভ।
2. সেট আপ করা
শুরু করতে, নিম্নলিখিত কমান্ডটি ব্যবহার করে কমান্ড লাইন থেকে Github সংগ্রহস্থলটি ক্লোন করুন:
$ git clone https://github.com/android/codelab-android-performance.git
অন্যথায়, আপনি দুটি জিপ ফাইল ডাউনলোড করতে পারেন:
অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্ট খুলুন
- "অ্যান্ড্রয়েড স্টুডিওতে স্বাগতম" উইন্ডোতে, নির্বাচন করুন
একটি বিদ্যমান প্রকল্প খুলুন । -
[Download Location]/codelab-android-performance/baseline-profilesফোল্ডারটি নির্বাচন করুন। নিশ্চিত করুন যে আপনিbaseline-profilesডিরেক্টরিটি নির্বাচন করেছেন। - যখন অ্যান্ড্রয়েড স্টুডিও প্রকল্পটি আমদানি করে, তখন নিশ্চিত করুন যে আপনি পরবর্তীতে যে নমুনা অ্যাপ্লিকেশনটি ব্যবহার করবেন তা তৈরি করতে
appমডিউলটি চালাতে পারেন।
নমুনা অ্যাপ
এই কোডল্যাবে, আপনি JetSnack নমুনা অ্যাপ্লিকেশনের সাথে কাজ করেন। এটি একটি ভার্চুয়াল স্ন্যাক অর্ডারিং অ্যাপ যা Jetpack Compose ব্যবহার করে।
অ্যাপ্লিকেশনটির কর্মক্ষমতা পরিমাপ করার জন্য, আপনাকে UI এর কাঠামো এবং অ্যাপটি কীভাবে আচরণ করে তা বুঝতে হবে, যাতে আপনি বেঞ্চমার্ক থেকে UI উপাদানগুলি অ্যাক্সেস করতে পারেন। অ্যাপটি চালান এবং স্ন্যাকস অর্ডার করে মৌলিক স্ক্রিনগুলির সাথে পরিচিত হন। অ্যাপটি কীভাবে তৈরি করা হয়েছে তার বিশদ জানতে হবে না।

৩. বেসলাইন প্রোফাইল কি?
বেসলাইন প্রোফাইলগুলি প্রথম লঞ্চ থেকে কোড এক্সিকিউশনের গতি প্রায় 30% উন্নত করে, অন্তর্ভুক্ত কোড পাথের জন্য ব্যাখ্যা এবং জাস্ট-ইন-টাইম (JIT) সংকলন পদক্ষেপগুলি এড়িয়ে। একটি অ্যাপ বা লাইব্রেরিতে একটি বেসলাইন প্রোফাইল প্রেরণ করে, অ্যান্ড্রয়েড রানটাইম (ART) Ahead of Time (AOT) সংকলনের মাধ্যমে অন্তর্ভুক্ত কোড পাথগুলি অপ্টিমাইজ করতে পারে, প্রতিটি নতুন ব্যবহারকারীর জন্য এবং প্রতিটি অ্যাপ আপডেটে কর্মক্ষমতা বৃদ্ধি প্রদান করে। এই প্রোফাইল-নির্দেশিত অপ্টিমাইজেশন (PGO) অ্যাপগুলিকে প্রথম লঞ্চ থেকে স্টার্টআপ অপ্টিমাইজ করতে, ইন্টারঅ্যাকশন জ্যাঙ্ক কমাতে এবং শেষ ব্যবহারকারীদের জন্য সামগ্রিক রানটাইম কর্মক্ষমতা উন্নত করতে দেয়।
একটি বেসলাইন প্রোফাইলের মাধ্যমে, সমস্ত ব্যবহারকারীর মিথস্ক্রিয়া - যেমন অ্যাপ স্টার্টআপ, স্ক্রিনের মধ্যে নেভিগেট করা, বা কন্টেন্ট স্ক্রোল করা - প্রথমবার চালানোর সময় থেকে আরও মসৃণ হয়। একটি অ্যাপের গতি এবং প্রতিক্রিয়াশীলতা বৃদ্ধির ফলে দৈনিক সক্রিয় ব্যবহারকারীর সংখ্যা বৃদ্ধি পায় এবং গড় রিটার্ন ভিজিটের হারও বৃদ্ধি পায়।
বেসলাইন প্রোফাইলগুলি অ্যাপ স্টার্টআপের বাইরেও অপ্টিমাইজেশন পরিচালনা করতে সাহায্য করে, যা প্রথম লঞ্চ থেকে অ্যাপ রানটাইম উন্নত করে এমন সাধারণ ব্যবহারকারীর ইন্টারঅ্যাকশন প্রদান করে। গাইডেড AOT সংকলন ব্যবহারকারীর ডিভাইসের উপর নির্ভর করে না এবং মোবাইল ডিভাইসের পরিবর্তে ডেভেলপমেন্ট মেশিনে প্রতি রিলিজে একবার করা যেতে পারে। বেসলাইন প্রোফাইল সহ রিলিজ পাঠানোর মাধ্যমে, অ্যাপ অপ্টিমাইজেশনগুলি কেবল ক্লাউড প্রোফাইলের উপর নির্ভর করার চেয়ে অনেক দ্রুত উপলব্ধ হয়।
যখন বেসলাইন প্রোফাইল ব্যবহার করা হয় না, তখন সমস্ত অ্যাপ কোড JIT-তে মেমোরিতে সংকলিত হয় অথবা ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থায় ব্যাকগ্রাউন্ডে একটি odex ফাইলে সংকলিত হয়। নতুন পাথগুলি অপ্টিমাইজ করার আগে প্রথমবারের মতো কোনও অ্যাপ ইনস্টল বা আপডেট করার পরে এটি চালানোর সময় ব্যবহারকারীরা একটি সাবঅপ্টিমাল অভিজ্ঞতা পেতে পারেন।
৪. বেসলাইন প্রোফাইল জেনারেটর মডিউল সেট আপ করুন
আপনি একটি ইন্সট্রুমেন্টেশন টেস্ট ক্লাস ব্যবহার করে বেসলাইন প্রোফাইল তৈরি করতে পারেন যার জন্য আপনার প্রোজেক্টে একটি নতুন গ্রেডল মডিউল যোগ করতে হবে। আপনার প্রোজেক্টে এটি যোগ করার সবচেয়ে সহজ উপায় হল অ্যান্ড্রয়েড স্টুডিও মডিউল উইজার্ড ব্যবহার করা যা অ্যান্ড্রয়েড স্টুডিও হেজহগ বা উচ্চতর সংস্করণের সাথে আসে।
প্রজেক্ট প্যানেলে আপনার প্রজেক্ট বা মডিউলে ডান ক্লিক করে নতুন মডিউল উইজার্ড উইন্ডোটি খুলুন এবং নতুন > মডিউল নির্বাচন করুন।

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

মডিউলের নাম, প্যাকেজের নাম, ভাষা, বা বিল্ড কনফিগারেশন ভাষার মতো সাধারণ প্যারামিটারগুলি ছাড়াও, দুটি ইনপুট রয়েছে যা একটি নতুন মডিউলের জন্য স্বাভাবিক নয়: টার্গেট অ্যাপ্লিকেশন এবং ইউজ গ্র্যাডল পরিচালিত ডিভাইস ।
টার্গেট অ্যাপ্লিকেশন হল সেই অ্যাপ মডিউল যা বেসলাইন প্রোফাইল তৈরি করতে ব্যবহৃত হয়। যদি আপনার প্রোজেক্টে একাধিক অ্যাপ মডিউল থাকে, তাহলে আপনি কোনটির জন্য জেনারেটর চালাতে চান তা নির্বাচন করুন।
"Use Gradle Managed Device" চেকবক্সটি স্বয়ংক্রিয়ভাবে পরিচালিত অ্যান্ড্রয়েড এমুলেটরগুলিতে বেসলাইন প্রোফাইল জেনারেটর চালানোর জন্য মডিউলটি সেট করে। আপনি " Scale your tests with Gradle Managed Devices" বিভাগে Gradle Managed Devices সম্পর্কে আরও পড়তে পারেন। যদি আপনি এটি আনচেক করেন, তাহলে জেনারেটরগুলি যেকোনো সংযুক্ত ডিভাইস ব্যবহার করবে।
নতুন মডিউল সম্পর্কে সমস্ত বিবরণ সংজ্ঞায়িত করার পরে, মডিউল তৈরির সাথে এগিয়ে যেতে Finish এ ক্লিক করুন।
মডিউল উইজার্ড দ্বারা করা পরিবর্তনগুলি
মডিউল উইজার্ড আপনার প্রকল্পে বেশ কিছু পরিবর্তন করে।
এটি baselineprofile নামে একটি Gradle মডিউল যোগ করে অথবা উইজার্ডে আপনার নির্বাচিত নাম।
এই মডিউলটি com.android.test প্লাগইন ব্যবহার করে, যা Gradle কে আপনার অ্যাপ্লিকেশনে এটি অন্তর্ভুক্ত না করতে বলে, তাই এতে কেবল পরীক্ষার কোড বা বেঞ্চমার্ক থাকতে পারে। এটি androidx.baselineprofile প্লাগইনও প্রয়োগ করে, যা বেসলাইন প্রোফাইল তৈরির স্বয়ংক্রিয়করণের অনুমতি দেয়।
উইজার্ডটি আপনার নির্বাচিত টার্গেট অ্যাপ্লিকেশন মডিউলেও পরিবর্তন আনে। বিশেষ করে, এটি androidx.baselineprofile প্লাগইন প্রয়োগ করে, androidx.profileinstaller নির্ভরতা যোগ করে এবং নতুন তৈরি মডিউল build.gradle(.kts) তে baselineProfile নির্ভরতা যোগ করে:
plugins {
id("androidx.baselineprofile")
}
dependencies {
// ...
implementation("androidx.profileinstaller:profileinstaller:1.3.0")
"baselineProfile"(project(mapOf("path" to ":baselineprofile")))
}
androidx.profileinstaller নির্ভরতা যোগ করলে আপনি নিম্নলিখিতগুলি করতে পারবেন:
- জেনারেট করা বেসলাইন প্রোফাইলের কর্মক্ষমতা লাভ স্থানীয়ভাবে যাচাই করুন।
- অ্যান্ড্রয়েড ৭ (এপিআই লেভেল ২৪) এবং অ্যান্ড্রয়েড ৮ (এপিআই লেভেল ২৬) তে বেসলাইন প্রোফাইল ব্যবহার করুন, যেগুলো ক্লাউড প্রোফাইল সমর্থন করে না।
- যেসব ডিভাইসে Google Play পরিষেবা নেই, সেখানে বেসলাইন প্রোফাইল ব্যবহার করুন।
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 অন্তর্ভুক্ত রয়েছে। এটি সুপারিশ করা হয় যাতে আপনি অ্যাপ শুরুর পরেও কর্মক্ষমতা অপ্টিমাইজ করতে পারেন।
আমাদের নমুনা অ্যাপে, আপনি নিম্নলিখিতগুলি করে এই যাত্রাগুলি সনাক্ত করতে পারেন:
- অ্যাপ্লিকেশনটি শুরু করুন। এটি ইতিমধ্যেই আংশিকভাবে জেনারেটেড ক্লাস দ্বারা আচ্ছাদিত।
- কন্টেন্টটি অ্যাসিঙ্ক্রোনাসভাবে লোড না হওয়া পর্যন্ত অপেক্ষা করুন।
- খাবারের তালিকা স্ক্রোল করুন।
- জলখাবারের বিবরণে যান।
নিম্নলিখিত স্নিপেটে সাধারণ ভ্রমণগুলি কভার করে এমন রূপরেখাযুক্ত ফাংশনগুলি ধারণ করতে জেনারেটরটি পরিবর্তন করুন:
// ...
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 এর এক্সটেনশন ফাংশন হিসেবে লিখতে পারেন যাতে আপনি এটি প্রদত্ত প্যারামিটার এবং ফাংশনগুলিতে অ্যাক্সেস পেতে পারেন। এইভাবে এটি লেখার মাধ্যমে আপনি পারফরম্যান্স লাভ যাচাই করার জন্য বেঞ্চমার্কের সাথে ইন্টারঅ্যাকশনগুলি পুনরায় ব্যবহার করতে পারবেন।
অ্যাসিঙ্ক্রোনাস কন্টেন্টের জন্য অপেক্ষা করুন
অনেক অ্যাপের অ্যাপ স্টার্টআপে এক ধরণের অ্যাসিঙ্ক্রোনাস লোডিং থাকে, যা সম্পূর্ণরূপে প্রদর্শিত অবস্থা নামেও পরিচিত, যা সিস্টেমকে জানায় কখন কন্টেন্ট লোড এবং রেন্ডার করা হয় এবং ব্যবহারকারী এটির সাথে ইন্টারঅ্যাক্ট করতে পারে। এই ইন্টারঅ্যাকশনগুলির সাথে জেনারেটরে ( waitForAsyncContent ) অবস্থার জন্য অপেক্ষা করুন:
- খাবারের তালিকা খুঁজুন।
- তালিকার কিছু আইটেম স্ক্রিনে দৃশ্যমান না হওয়া পর্যন্ত অপেক্ষা করুন।
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 ), আপনি এই ইন্টারঅ্যাকশনগুলি অনুসরণ করতে পারেন:
- স্ন্যাক লিস্টের UI উপাদানটি খুঁজুন।
- সিস্টেম নেভিগেশন ট্রিগার না করার জন্য অঙ্গভঙ্গি মার্জিন সেট করুন।
- তালিকাটি স্ক্রোল করুন এবং 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 ) এই ইন্টারঅ্যাকশনগুলি বাস্তবায়ন করে:
- নাস্তার তালিকা এবং আপনার সাথে কাজ করতে পারেন এমন সমস্ত নাস্তার আইটেম খুঁজুন।
- তালিকা থেকে একটি আইটেম নির্বাচন করুন।
- আইটেমটিতে ক্লিক করুন এবং বিস্তারিত স্ক্রিন লোড না হওয়া পর্যন্ত অপেক্ষা করুন। আপনি এই সত্যটি কাজে লাগাতে পারেন যে স্ন্যাক তালিকাটি আর স্ক্রিনে থাকবে না।
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 Devices ব্যবহার করতে পারেন। Gradle Managed Devices আপনাকে একটি Android এমুলেটরে ম্যানুয়ালি চালু বা ভেঙে ফেলার প্রয়োজন ছাড়াই পরীক্ষা চালাতে দেয়। আপনি Gradle Managed Devices সম্পর্কে আরও জানতে Scale your tests with Gradle Managed Devices এ যেতে পারেন।
একটি Gradle Managed Device সংজ্ঞায়িত করতে, নিম্নলিখিত স্নিপেটে দেখানো হিসাবে :baselineprofile মডিউল build.gradle.kts ফাইলে এর সংজ্ঞা যোগ করুন:
android {
// ...
testOptions.managedDevices.devices {
create<ManagedVirtualDevice>("pixel6Api31") {
device = "Pixel 6"
apiLevel = 31
systemImageSource = "aosp"
}
}
}
এই ক্ষেত্রে, আমরা অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩১) ব্যবহার করি এবং aosp সিস্টেম ইমেজ রুটেড অ্যাক্সেসে সক্ষম।
এরপর, নির্ধারিত Gradle Managed Device ব্যবহার করার জন্য Baseline Profile Gradle Plugin কনফিগার করুন। এটি করার জন্য, managedDevices প্রোপার্টিতে ডিভাইসের নাম যোগ করুন এবং নিম্নলিখিত স্নিপেটে দেখানো useConnectedDevices অক্ষম করুন:
android {
// ...
}
baselineProfile {
managedDevices += "pixel6Api31"
useConnectedDevices = false
}
dependencies {
// ...
}
এরপর, বেসলাইন প্রোফাইল তৈরি করুন।
৭. বেসলাইন প্রোফাইল তৈরি করুন
ডিভাইসটি প্রস্তুত হয়ে গেলে, আপনি বেসলাইন প্রোফাইল তৈরি করতে পারেন। বেসলাইন প্রোফাইল গ্রেডল প্লাগইনটি জেনারেটর টেস্ট ক্লাস চালানোর এবং আপনার অ্যাপে জেনারেট করা বেসলাইন প্রোফাইল প্রয়োগ করার পুরো প্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য গ্রেডল টাস্ক তৈরি করে।
নতুন মডিউল উইজার্ডটি রান কনফিগারেশন তৈরি করেছে যাতে টার্মিনাল এবং অ্যান্ড্রয়েড স্টুডিওর মধ্যে স্যুইচ করার প্রয়োজন ছাড়াই সমস্ত প্রয়োজনীয় প্যারামিটার সহ গ্রেডল টাস্ক দ্রুত চালানো যায়।
এটি চালানোর জন্য, Generate Baseline Profile রান কনফিগারেশনটি সনাক্ত করুন এবং রান বোতামে ক্লিক করুন।
.

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

(ঐচ্ছিক) কমান্ড লাইন থেকে জেনারেটর চালান
বিকল্পভাবে, আপনি কমান্ড লাইন থেকে জেনারেটরটি চালাতে পারেন। আপনি Gradle Managed Device— :app:generateBaselineProfile দ্বারা তৈরি টাস্কটি ব্যবহার করতে পারেন। এই কমান্ডটি baselineProfile(project(:baselineProfile)) নির্ভরতা দ্বারা সংজ্ঞায়িত প্রকল্পের সমস্ত পরীক্ষা চালায়। যেহেতু মডিউলটিতে কর্মক্ষমতা লাভের পরে যাচাইয়ের জন্য বেঞ্চমার্কও রয়েছে, সেই পরীক্ষাগুলি একটি এমুলেটরে বেঞ্চমার্ক চালানোর বিরুদ্ধে সতর্কতা সহ ব্যর্থ হয়।
android .testInstrumentationRunnerArguments .androidx.benchmark.enabledRules=BaselineProfile
এর জন্য, আপনি নিম্নলিখিত ইন্সট্রুমেন্টেশন রানার আর্গুমেন্ট ব্যবহার করে সমস্ত বেসলাইন প্রোফাইল জেনারেটর ফিল্টার করতে পারেন এবং সমস্ত বেঞ্চমার্ক এড়িয়ে যায়:
পুরো কমান্ডটি দেখতে এরকম দেখাচ্ছে:
./gradlew :app:generateBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
বেসলাইন প্রোফাইলের মাধ্যমে আপনার অ্যাপ বিতরণ করুন
একবার বেসলাইন প্রোফাইল তৈরি হয়ে গেলে এবং আপনার অ্যাপের সোর্স কোডে কপি করা হয়ে গেলে, আপনার অ্যাপের প্রোডাকশন ভার্সনটি স্বাভাবিকভাবে তৈরি করুন। আপনার ব্যবহারকারীদের কাছে বেসলাইন প্রোফাইল বিতরণ করার জন্য আপনাকে অতিরিক্ত কিছু করতে হবে না। এগুলি তৈরির সময় অ্যান্ড্রয়েড গ্রেডল প্লাগইন দ্বারা বাছাই করা হয় এবং আপনার AAB বা APK-তে অন্তর্ভুক্ত করা হয়। এরপর, বিল্ডটি Google Play-তে আপলোড করুন।
যখন ব্যবহারকারীরা অ্যাপটি ইনস্টল করেন বা পূর্ববর্তী সংস্করণ থেকে অ্যাপটি আপডেট করেন, তখন বেসলাইন প্রোফাইলটিও ইনস্টল করা হয়, যার ফলে অ্যাপটির প্রথম রান থেকে আরও ভালো পারফরম্যান্স পাওয়া যায়।
পরবর্তী ধাপে দেখানো হবে কিভাবে বেসলাইন প্রোফাইল ব্যবহার করে অ্যাপের কর্মক্ষমতা কতটা উন্নত হয় তা যাচাই করা যায়।
৮. (ঐচ্ছিক) বেসলাইন প্রোফাইল তৈরি করা কাস্টমাইজ করুন
বেসলাইন প্রোফাইল গ্রেডল প্লাগইনটিতে আপনার নির্দিষ্ট চাহিদা পূরণের জন্য প্রোফাইলগুলি কীভাবে তৈরি করা হয় তা কাস্টমাইজ করার বিকল্প রয়েছে। আপনি বিল্ড স্ক্রিপ্টগুলিতে baselineProfile { } কনফিগারেশন ব্লক দিয়ে আচরণ পরিবর্তন করতে পারেন।
:baselineprofile মডিউলের মধ্যে কনফিগারেশন ব্লকটি জেনারেটরগুলি কীভাবে চালানো হবে তা প্রভাবিত করে, যার মাধ্যমে managedDevices যোগ করা যায় এবং useConnectedDevices নাকি Gradle Managed ডিভাইস ব্যবহার করা হবে তা সিদ্ধান্ত নেওয়া যায়।
: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 ফাংশন from the rule.
এর জন্য বেশ কয়েকটি পরামিতি প্রয়োজন:
-
packageName:কোন অ্যাপ্লিকেশনটি পরিমাপ করতে হবে। -
metrics: বেঞ্চমার্কের সময় আপনি কোন ধরণের তথ্য পরিমাপ করতে চান। -
iterations: বেঞ্চমার্কটি কতবার পুনরাবৃত্তি হয়। -
startupMode: আপনার বেঞ্চমার্ক শুরু হওয়ার পর আপনি কীভাবে আপনার অ্যাপ্লিকেশনটি শুরু করতে চান। -
setupBlock: পরিমাপ করার আগে আপনার অ্যাপের সাথে কোন ইন্টারঅ্যাকশনগুলি ঘটতে হবে। -
measureBlock: বেঞ্চমার্কের সময় আপনার অ্যাপের সাথে যে ইন্টারঅ্যাকশনগুলি পরিমাপ করতে চান।
টেস্ট ক্লাসে দুটি পরীক্ষাও রয়েছে: startupCompilationeNone() এবং startupCompilationBaselineProfiles() , যা বিভিন্ন compilationMode সহ benchmark() ফাংশনকে কল করে।
সংকলনমোড
CompilationMode প্যারামিটারটি নির্ধারণ করে কিভাবে অ্যাপ্লিকেশনটি মেশিন কোডে প্রাক-কম্পাইল করা হয়। এতে নিম্নলিখিত বিকল্পগুলি রয়েছে:
-
DEFAULT: যদি উপলব্ধ থাকে তবে বেসলাইন প্রোফাইল ব্যবহার করে অ্যাপটিকে আংশিকভাবে প্রাক-কম্পাইল করে। যদি কোনওcompilationModeপ্যারামিটার প্রয়োগ না করা হয় তবে এটি ব্যবহার করা হয়। -
None(): অ্যাপ কম্পাইলেশন অবস্থা রিসেট করে এবং অ্যাপটিকে প্রি-কম্পাইল করে না। অ্যাপটি কার্যকর করার সময় জাস্ট-ইন-টাইম কম্পাইলেশন (JIT) এখনও সক্রিয় থাকে। -
Partial(): বেসলাইন প্রোফাইল বা ওয়ার্ম আপ রান, অথবা উভয়ের সাথে অ্যাপটিকে প্রাক-কম্পাইল করে। -
Full(): সম্পূর্ণ অ্যাপ্লিকেশন কোডটি আগে থেকে কম্পাইল করে। এটি অ্যান্ড্রয়েড 6 (API 23) এবং তার নিচের সংস্করণগুলিতে একমাত্র বিকল্প।
আপনি যদি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা অপ্টিমাইজ করতে চান, তাহলে আপনি DEFAULT কম্পাইলেশন মোড বেছে নিতে পারেন, কারণ গুগল প্লে থেকে অ্যাপটি ইনস্টল করার সময় পারফরম্যান্স একই রকম। আপনি যদি বেসলাইন প্রোফাইল দ্বারা প্রদত্ত কর্মক্ষমতা সুবিধাগুলির তুলনা করতে চান, তাহলে আপনি কম্পাইলেশন মোড 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
}
বেঞ্চমার্কগুলি চালান
আপনি যেভাবে ইন্সট্রুমেন্টেড টেস্ট চালান, ঠিক সেভাবেই বেঞ্চমার্ক চালাতে পারেন। আপনি টেস্ট ফাংশনটি চালাতে পারেন, অথবা পুরো ক্লাসটি তার পাশে থাকা গটার আইকনটি দিয়ে চালাতে পারেন।

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

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

স্ক্রিনশট থেকে, আপনি দেখতে পাচ্ছেন যে প্রতিটি CompilationMode এর জন্য অ্যাপ শুরু হওয়ার সময় আলাদা। মধ্যমা মানগুলি নিম্নলিখিত টেবিলে দেখানো হয়েছে:
টাইমটুইনিশিয়ালডিসপ্লে [ms] | টাইমটুফুলডিসপ্লে [ms] | |
কোনটিই নয় | ২০২.২ | ৮১৮.৮ |
বেসলাইন প্রোফাইল | ১৯৩.৭ | ৬৩৭.৯ |
উন্নতি | ৪% | ২৮% |
timeToFullDisplay এর জন্য কম্পাইলেশন মোডের মধ্যে পার্থক্য হল 180ms, যা শুধুমাত্র একটি বেসলাইন প্রোফাইল থাকলে ~28% উন্নতি। 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()
}
)
}
একবার বেঞ্চমার্ক প্রস্তুত হয়ে গেলে, আপনি এটি আগের মতো চালাতে পারেন এবং নিম্নলিখিত স্ক্রিনশটে দেখানো ফলাফল পেতে পারেন:

FrameTimingMetric ৫০তম, ৯০তম, ৯৫তম এবং ৯৯তম পার্সেন্টাইলে ফ্রেমের সময়কাল মিলিসেকেন্ডে ( frameDurationCpuMs ) আউটপুট করে। Android 12 (API লেভেল ৩১) এবং তার বেশি সংস্করণে, এটি আপনার ফ্রেমগুলি সীমা অতিক্রম করার সময় কতক্ষণ সময় নেয় তাও ফেরত দেয় ( frameOverrunMs )। মানটি নেতিবাচক হতে পারে, যার অর্থ ফ্রেম তৈরি করতে অতিরিক্ত সময় বাকি ছিল।
ফলাফল থেকে, আপনি দেখতে পাচ্ছেন যে CompilationBaselineProfiles ফ্রেমের সময়কাল গড়ে 2ms কম, যা ব্যবহারকারীদের কাছে লক্ষণীয় নাও হতে পারে। তবে, অন্যান্য শতাংশের ক্ষেত্রে ফলাফল আরও স্পষ্ট। P99-এর ক্ষেত্রে, পার্থক্য হল 43.5ms , যা 90 FPS-এ অপারেটিং ডিভাইসে 3 বার স্কিপ করা ফ্রেমের বেশি। উদাহরণস্বরূপ, Pixel 6-এর ক্ষেত্রে এটি 1000ms / 90 FPS = ~11ms সর্বোচ্চ সময় একটি ফ্রেম রেন্ডার করতে।
১১. অভিনন্দন
অভিনন্দন, আপনি এই কোডল্যাবটি সফলভাবে সম্পন্ন করেছেন এবং বেসলাইন প্রোফাইলের সাহায্যে আপনার অ্যাপের কর্মক্ষমতা উন্নত করেছেন!
অতিরিক্ত সম্পদ
নিম্নলিখিত অতিরিক্ত সম্পদগুলি দেখুন:
- Macrobenchmark: কোডল্যাব ব্যবহার করে অ্যাপের কর্মক্ষমতা পরীক্ষা করুন যা বেঞ্চমার্কিংয়ের সাথে আরও গভীরভাবে সম্পর্কিত।
- পারফরম্যান্স নমুনা : ম্যাক্রোবেঞ্চমার্ক এবং অন্যান্য পারফরম্যান্স নমুনা ধারণকারী সংগ্রহস্থল।
- এখন অ্যান্ড্রয়েড নমুনা অ্যাপে : একটি বাস্তব-বিশ্ব অ্যাপ্লিকেশন যা কর্মক্ষমতা উন্নত করতে বেঞ্চমার্কিং এবং বেসলাইন প্রোফাইল ব্যবহার করে।