1. আপনি শুরু করার আগে
এই কোডল্যাব দেখায় কিভাবে আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা অপ্টিমাইজ করতে বেসলাইন প্রোফাইল তৈরি করতে হয় এবং কিভাবে বেসলাইন প্রোফাইল ব্যবহার করে কর্মক্ষমতা সুবিধা যাচাই করতে হয়।
আপনি কি প্রয়োজন হবে
- Android Studio Hedgehog (2023.1.1) বা নতুন
- Android Gradle Plugin 8.0 বা উচ্চতর
- জেটপ্যাক ম্যাক্রোবেঞ্চমার্কের প্রাথমিক ধারণা
- Android 7 (API লেভেল 24) বা উচ্চতর সহ একটি ফিজিক্যাল অ্যান্ড্রয়েড ডিভাইস
আপনি কি করবেন
- বেসলাইন প্রোফাইল জেনারেটর ব্যবহার করার জন্য প্রকল্প সেট আপ করুন।
- অ্যাপ স্টার্টআপ এবং স্ক্রলিং কর্মক্ষমতা অপ্টিমাইজ করতে বেসলাইন প্রোফাইল তৈরি করুন।
- জেটপ্যাক ম্যাক্রোবেঞ্চমার্ক লাইব্রেরির সাথে পারফরম্যান্স লাভ যাচাই করুন।
আপনি কি শিখবেন
- বেসলাইন প্রোফাইল এবং কিভাবে তারা অ্যাপের কর্মক্ষমতা উন্নত করতে পারে।
- কিভাবে বেসলাইন প্রোফাইল তৈরি করতে হয়।
- বেসলাইন প্রোফাইলের কর্মক্ষমতা লাভ।
2. সেট আপ করা হচ্ছে
শুরু করতে, নিম্নলিখিত কমান্ডটি ব্যবহার করে কমান্ড লাইন থেকে গিথুব সংগ্রহস্থল ক্লোন করুন:
$ git clone https://github.com/android/codelab-android-performance.git
বিকল্পভাবে, আপনি দুটি জিপ ফাইল ডাউনলোড করতে পারেন:
অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্ট খুলুন
- অ্যান্ড্রয়েড স্টুডিওতে স্বাগতম উইন্ডোতে, নির্বাচন করুন একটি বিদ্যমান প্রকল্প খুলুন ।
- ফোল্ডারটি নির্বাচন করুন
[Download Location]/codelab-android-performance/baseline-profiles
নিশ্চিত করুন যে আপনিbaseline-profiles
ডিরেক্টরি নির্বাচন করেছেন। - অ্যান্ড্রয়েড স্টুডিও যখন প্রোজেক্ট আমদানি করে, তখন নিশ্চিত করুন যে আপনি যে নমুনা অ্যাপ্লিকেশনটির সাথে পরে কাজ করবেন সেটি তৈরি করতে আপনি
app
মডিউলটি চালাতে পারেন।
নমুনা অ্যাপ
এই কোডল্যাবে, আপনি JetSnack নমুনা অ্যাপ্লিকেশনের সাথে কাজ করেন। এটি একটি ভার্চুয়াল স্ন্যাক অর্ডারিং অ্যাপ যা জেটপ্যাক কম্পোজ ব্যবহার করে।
অ্যাপ্লিকেশনটির কার্যকারিতা পরিমাপ করার জন্য, আপনাকে UI এর কাঠামো এবং অ্যাপ্লিকেশনটি কীভাবে আচরণ করে তা বুঝতে হবে, যাতে আপনি বেঞ্চমার্ক থেকে UI উপাদানগুলি অ্যাক্সেস করতে পারেন। অ্যাপটি চালান এবং স্ন্যাকস অর্ডার করে মৌলিক স্ক্রীনগুলির সাথে পরিচিত হন। অ্যাপটি কিভাবে আর্কিটেক্ট করা হয় তার বিস্তারিত জানার দরকার নেই।
3. বেসলাইন প্রোফাইল কি
বেসলাইন প্রোফাইলগুলি অন্তর্ভুক্ত কোড পাথগুলির জন্য ব্যাখ্যা এবং জাস্ট-ইন-টাইম (JIT) সংকলন পদক্ষেপগুলি এড়িয়ে প্রথম প্রবর্তন থেকে কোড সম্পাদনের গতি প্রায় 30% উন্নত করে। একটি অ্যাপ বা লাইব্রেরিতে একটি বেসলাইন প্রোফাইল পাঠানোর মাধ্যমে, অ্যান্ড্রয়েড রানটাইম (এআরটি) এহেড অফ টাইম (AOT) সংকলনের মাধ্যমে অন্তর্ভুক্ত কোড পাথগুলিকে অপ্টিমাইজ করতে পারে, প্রতিটি নতুন ব্যবহারকারীর জন্য এবং প্রতিটি অ্যাপ আপডেটে কর্মক্ষমতা বৃদ্ধি প্রদান করে৷ এই প্রোফাইল-গাইডেড অপ্টিমাইজেশান (PGO) অ্যাপগুলিকে স্টার্টআপ অপ্টিমাইজ করতে, ইন্টারঅ্যাকশন জ্যাঙ্ক কমাতে এবং প্রথম লঞ্চ থেকে শেষ ব্যবহারকারীদের জন্য সামগ্রিক রানটাইম কর্মক্ষমতা উন্নত করতে দেয়।
একটি বেসলাইন প্রোফাইলের সাথে, সমস্ত ব্যবহারকারীর ইন্টারঅ্যাকশন-যেমন অ্যাপ স্টার্টআপ, স্ক্রিনগুলির মধ্যে নেভিগেট করা, বা বিষয়বস্তুর মাধ্যমে স্ক্রোল করা—প্রথমবার চালানোর পর থেকে মসৃণ হয়৷ একটি অ্যাপের গতি এবং প্রতিক্রিয়াশীলতা বৃদ্ধির ফলে প্রতিদিনের সক্রিয় ব্যবহারকারীরা আরও বেশি এবং একটি উচ্চ গড় রিটার্ন ভিজিট হারের দিকে নিয়ে যায়।
বেসলাইন প্রোফাইলগুলি প্রথম লঞ্চ থেকে অ্যাপ রানটাইম উন্নত করে এমন সাধারণ ব্যবহারকারীর মিথস্ক্রিয়া প্রদান করে অ্যাপ স্টার্টআপের বাইরে অপ্টিমাইজেশান গাইড করতে সহায়তা করে। গাইডেড AOT সংকলন ব্যবহারকারীর ডিভাইসের উপর নির্ভর করে না এবং মোবাইল ডিভাইসের পরিবর্তে একটি ডেভেলপমেন্ট মেশিনে রিলিজ প্রতি একবার করা যেতে পারে। একটি বেসলাইন প্রোফাইলের সাথে রিলিজ পাঠানোর মাধ্যমে, শুধুমাত্র ক্লাউড প্রোফাইলের উপর নির্ভর করার চেয়ে অ্যাপ অপ্টিমাইজেশানগুলি অনেক দ্রুত উপলব্ধ হয়৷
বেসলাইন প্রোফাইল ব্যবহার না করার সময়, ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থায় সমস্ত অ্যাপ কোড ব্যাখ্যা করার পরে মেমরিতে বা পটভূমিতে একটি ওডেক্স ফাইলে JIT সংকলিত হয়। নতুন পাথগুলি অপ্টিমাইজ করার আগে প্রথমবার এটি ইনস্টল বা আপডেট করার পরে একটি অ্যাপ চালানোর সময় ব্যবহারকারীদের একটি সাবঅপ্টিমাল অভিজ্ঞতা থাকতে পারে।
4. বেসলাইন প্রোফাইল জেনারেটর মডিউল সেট আপ করুন
আপনি একটি ইন্সট্রুমেন্টেশন পরীক্ষার ক্লাসের সাথে বেসলাইন প্রোফাইল তৈরি করতে পারেন যার জন্য আপনার প্রকল্পে একটি নতুন গ্রেডল মডিউল যোগ করা প্রয়োজন। আপনার প্রোজেক্টে এটি যোগ করার সবচেয়ে সহজ উপায় হল অ্যান্ড্রয়েড স্টুডিও মডিউল উইজার্ড যা অ্যান্ড্রয়েড স্টুডিও হেজহগ বা উচ্চতর সংস্করণের সাথে আসে।
প্রজেক্ট প্যানেলে আপনার প্রোজেক্ট বা মডিউলে ডান-ক্লিক করে নতুন মডিউল উইজার্ড উইন্ডো খুলুন এবং নতুন > মডিউল নির্বাচন করুন।
খোলা উইন্ডো থেকে, টেমপ্লেট ফলক থেকে বেসলাইন প্রোফাইল জেনারেটর নির্বাচন করুন।
মডিউলের নাম, প্যাকেজের নাম, ভাষা বা বিল্ড কনফিগারেশন ভাষার মতো সাধারণ পরামিতিগুলি ছাড়াও, দুটি ইনপুট রয়েছে যা একটি নতুন মডিউলের জন্য স্বাভাবিক নয়: লক্ষ্য অ্যাপ্লিকেশন এবং গ্রেডল ম্যানেজড ডিভাইস ব্যবহার করুন ।
লক্ষ্য অ্যাপ্লিকেশন হল অ্যাপ মডিউল যা বেসলাইন প্রোফাইল তৈরি করতে ব্যবহৃত হয়। আপনার প্রোজেক্টে একাধিক অ্যাপ মডিউল থাকলে, আপনি কোনটির জন্য জেনারেটর চালাতে চান তা নির্বাচন করুন।
ইউজ গ্রেডল ম্যানেজড ডিভাইস চেকবক্স স্বয়ংক্রিয়ভাবে পরিচালিত অ্যান্ড্রয়েড এমুলেটরগুলিতে বেসলাইন প্রোফাইল জেনারেটর চালানোর জন্য মডিউল সেট করে। আপনি Gradle পরিচালিত ডিভাইসগুলির সাথে আপনার পরীক্ষাগুলি স্কেলে গ্রেডল ম্যানেজড ডিভাইস সম্পর্কে আরও পড়তে পারেন। যদি আপনি এটি আনচেক করেন, জেনারেটরগুলি যেকোনো সংযুক্ত ডিভাইস ব্যবহার করে।
একবার আপনি নতুন মডিউল সম্পর্কে সমস্ত বিবরণ সংজ্ঞায়িত করলে, মডিউল তৈরির সাথে এগিয়ে যেতে Finish এ ক্লিক করুন।
মডিউল উইজার্ড দ্বারা করা পরিবর্তন
মডিউল উইজার্ড আপনার প্রকল্পে বেশ কিছু পরিবর্তন করে।
এটি baselineprofile
নামে একটি গ্রেডল মডিউল বা উইজার্ডে আপনার নির্বাচন করা নাম যোগ করে।
এই মডিউলটি 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
নির্ভরতা যোগ করা আপনাকে নিম্নলিখিতগুলি করতে দেয়:
- স্থানীয়ভাবে উৎপন্ন বেসলাইন প্রোফাইলের কর্মক্ষমতা লাভ যাচাই করুন।
- অ্যান্ড্রয়েড 7 (এপিআই লেভেল 24) এবং অ্যান্ড্রয়েড 8 (এপিআই লেভেল 26) এ বেসলাইন প্রোফাইল ব্যবহার করুন, যা ক্লাউড প্রোফাইল সমর্থন করে না।
- Google Play পরিষেবা নেই এমন ডিভাইসগুলিতে বেসলাইন প্রোফাইলগুলি ব্যবহার করুন৷
baselineProfile(project(":baselineprofile"))
নির্ভরতা গ্রেডলকে জানতে দেয় যে কোন মডিউল থেকে এটি তৈরি করা বেসলাইন প্রোফাইলগুলি নিতে হবে।
এখন আপনার কাছে প্রজেক্ট সেট আছে, একটি বেসলাইন প্রোফাইল জেনারেটর ক্লাস লিখুন।
5. একটি বেসলাইন প্রোফাইল জেনারেটর লিখুন
সাধারণত, আপনি আপনার অ্যাপের সাধারণ ব্যবহারকারী ভ্রমণের জন্য বেসলাইন প্রোফাইল তৈরি করেন।
মডিউল উইজার্ড একটি বেসিক 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)
}
আপনার বেসলাইন প্রোফাইল জেনারেটর চালানোর জন্য প্রস্তুত হওয়ার জন্য প্রয়োজনীয় সমস্ত মিথস্ক্রিয়া সংজ্ঞায়িত করার পরে, এটি যে ডিভাইসে চলে তা আপনাকে সংজ্ঞায়িত করতে হবে।
6. জেনারেটর চালানোর জন্য একটি ডিভাইস প্রস্তুত করুন
বেসলাইন প্রোফাইল তৈরি করতে, আমরা গ্রেডল ম্যানেজড ডিভাইস বা Android 13 (API 33) বা উচ্চতর চলমান ডিভাইসের মতো এমুলেটর ব্যবহার করার পরামর্শ দিই।
প্রক্রিয়াটিকে পুনরুত্পাদনযোগ্য করতে এবং স্বয়ংক্রিয়ভাবে বেসলাইন প্রোফাইল তৈরি করতে, আপনি গ্র্যাডল ম্যানেজড ডিভাইসগুলি ব্যবহার করতে পারেন। গ্র্যাডল ম্যানেজড ডিভাইস আপনাকে ম্যানুয়ালি লঞ্চ করার এবং ছিঁড়ে ফেলার প্রয়োজন ছাড়াই একটি অ্যান্ড্রয়েড এমুলেটরে পরীক্ষা চালাতে দেয়। আপনি Gradle Managed Devices- এর মাধ্যমে আপনার পরীক্ষাগুলি স্কেলে গ্রেডল ম্যানেজড ডিভাইস সম্পর্কে আরও জানতে পারবেন।
একটি Gradle পরিচালিত ডিভাইস সংজ্ঞায়িত করতে, নিম্নলিখিত স্নিপেটে দেখানো হিসাবে : :baselineprofile
মডিউল build.gradle.kts
ফাইলে এর সংজ্ঞা যোগ করুন:
android {
// ...
testOptions.managedDevices.devices {
create<ManagedVirtualDevice>("pixel6Api31") {
device = "Pixel 6"
apiLevel = 31
systemImageSource = "aosp"
}
}
}
এই ক্ষেত্রে, আমরা অ্যান্ড্রয়েড 11 (API স্তর 31) ব্যবহার করি এবং aosp
সিস্টেমের চিত্রটি রুটেড অ্যাক্সেস করতে সক্ষম।
এরপরে, সংজ্ঞায়িত গ্রেডল ম্যানেজড ডিভাইস ব্যবহার করতে বেসলাইন প্রোফাইল গ্রেডল প্লাগইন কনফিগার করুন। এটি করার জন্য, managedDevices
বৈশিষ্ট্যে ডিভাইসের নাম যোগ করুন এবং নিম্নলিখিত স্নিপেটে দেখানো হিসাবে useConnectedDevices
অক্ষম করুন:
android {
// ...
}
baselineProfile {
managedDevices += "pixel6Api31"
useConnectedDevices = false
}
dependencies {
// ...
}
এরপরে, বেসলাইন প্রোফাইল তৈরি করুন।
7. বেসলাইন প্রোফাইল তৈরি করুন
ডিভাইসটি প্রস্তুত হয়ে গেলে, আপনি বেসলাইন প্রোফাইল তৈরি করতে পারেন। বেসলাইন প্রোফাইল গ্রেডল প্লাগইন জেনারেটর টেস্ট ক্লাস চালানোর পুরো প্রক্রিয়াটিকে স্বয়ংক্রিয় করতে এবং জেনারেট করা বেসলাইন প্রোফাইলগুলিকে আপনার অ্যাপে প্রয়োগ করার জন্য গ্রেডল টাস্ক তৈরি করে।
নতুন মডিউল উইজার্ড রান কনফিগারেশন তৈরি করেছে যাতে টার্মিনাল এবং অ্যান্ড্রয়েড স্টুডিওর মধ্যে স্যুইচ করার প্রয়োজন ছাড়াই চালানোর জন্য প্রয়োজনীয় সমস্ত প্যারামিটার সহ গ্রেডল টাস্ক দ্রুত চালাতে সক্ষম হয়।
এটি চালানোর জন্য, Generate Baseline Profile
এবং রান বোতামে ক্লিক করুন .
কাজটি আগে সংজ্ঞায়িত এমুলেটর ইমেজ শুরু করে। BaselineProfileGenerator
পরীক্ষার ক্লাস থেকে ইন্টারঅ্যাকশনগুলি বেশ কয়েকবার চালান এবং তারপরে এমুলেটরটি ছিঁড়ে ফেলুন এবং অ্যান্ড্রয়েড স্টুডিওতে আউটপুট সরবরাহ করুন।
জেনারেটরটি সফলতার সাথে শেষ হয়ে গেলে, গ্রেডল প্লাগইন স্বয়ংক্রিয়ভাবে জেনারেট করা baseline-prof.txt
আপনার লক্ষ্য অ্যাপ্লিকেশনে ( :app
মডিউল) src/release/generated/baselineProfile/
ফোল্ডারে রাখে।
(ঐচ্ছিক) কমান্ড লাইন থেকে জেনারেটর চালান
বিকল্পভাবে, আপনি কমান্ড লাইন থেকে জেনারেটর চালাতে পারেন। আপনি গ্র্যাডল ম্যানেজড ডিভাইস— :app:generateBaselineProfile
দ্বারা তৈরি করা টাস্কের সুবিধা নিতে পারেন। এই কমান্ডটি baselineProfile(project(:baselineProfile))
নির্ভরতা দ্বারা সংজ্ঞায়িত প্রকল্পের সমস্ত পরীক্ষা চালায়। কারণ মডিউলটিতে কর্মক্ষমতা লাভের পরবর্তী যাচাইয়ের জন্য মানদণ্ডও রয়েছে, এই পরীক্ষাগুলি একটি এমুলেটরে বেঞ্চমার্ক চালানোর বিরুদ্ধে সতর্কতা সহ ব্যর্থ হয়।
android .testInstrumentationRunnerArguments .androidx.benchmark.enabledRules=BaselineProfile
এর জন্য, আপনি নিম্নোক্ত ইন্সট্রুমেন্টেশন রানার আর্গুমেন্ট সহ সমস্ত বেসলাইন প্রোফাইল জেনারেটর ফিল্টার করতে পারেন এবং সমস্ত বেঞ্চমার্ক বাদ দেওয়া হয়েছে:
পুরো কমান্ডটি নিম্নরূপ দেখায়:
./gradlew :app:generateBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
বেসলাইন প্রোফাইলের সাথে আপনার অ্যাপ বিতরণ করুন
একবার বেসলাইন প্রোফাইল তৈরি হয়ে গেলে এবং আপনার অ্যাপের সোর্স কোডে কপি হয়ে গেলে, আপনার অ্যাপের প্রোডাকশন ভার্সন তৈরি করুন যেমন আপনি সাধারণত করেন। আপনার ব্যবহারকারীদের কাছে বেসলাইন প্রোফাইলগুলি বিতরণ করার জন্য আপনাকে অতিরিক্ত কিছু করতে হবে না। এগুলি তৈরি করার সময় Android Gradle Plugin দ্বারা বাছাই করা হয় এবং আপনার AAB বা APK-এ অন্তর্ভুক্ত করা হয়। এরপরে, Google Play-এ বিল্ড আপলোড করুন।
যখন ব্যবহারকারীরা অ্যাপটি ইনস্টল করেন বা পূর্ববর্তী সংস্করণ থেকে অ্যাপটি আপডেট করেন, তখন বেসলাইন প্রোফাইলটিও ইনস্টল করা হয়, যার ফলে অ্যাপটির প্রথম রান থেকে আরও ভাল পারফরম্যান্স পাওয়া যায়।
বেসলাইন প্রোফাইলের মাধ্যমে অ্যাপের কার্যক্ষমতা কতটা উন্নত হয় তা যাচাই করার পদ্ধতিটি পরবর্তী ধাপে দেখানো হয়েছে।
8. (ঐচ্ছিক) বেসলাইন প্রোফাইল তৈরি করা কাস্টমাইজ করুন
বেসলাইন প্রোফাইল গ্রেডল প্লাগইনে আপনার নির্দিষ্ট চাহিদা পূরণের জন্য প্রোফাইলগুলি কীভাবে তৈরি করা হয় তা কাস্টমাইজ করার বিকল্পগুলি অন্তর্ভুক্ত করে। আপনি বিল্ড স্ক্রিপ্টে baselineProfile { }
কনফিগারেশন ব্লক দিয়ে আচরণ পরিবর্তন করতে পারেন।
:baselineprofile
মডিউলের মধ্যে থাকা কনফিগারেশন ব্লক দ্বারা পরিচালিত managedDevices
যুক্ত করার সম্ভাবনা সহ জেনারেটরগুলি চালানোর এবং useConnectedDevices
বা Gradle পরিচালিত ডিভাইসগুলি ব্যবহার করার সিদ্ধান্ত নেওয়ার উপর প্রভাব ফেলে।
:app
টার্গেট মডিউলের মধ্যে থাকা কনফিগারেশন ব্লক প্রোফাইলগুলি কোথায় সংরক্ষণ করা হবে বা কীভাবে সেগুলি তৈরি করা হবে তা নির্ধারণ করে। আপনি নিম্নলিখিত পরামিতি পরিবর্তন করতে পারেন:
-
automaticGenerationDuringBuild
: যদি সক্রিয় থাকে, আপনি উৎপাদন রিলিজ বিল্ড তৈরি করার সময় বেসলাইন প্রোফাইল তৈরি করতে পারেন। আপনার অ্যাপ শিপিংয়ের আগে CI তৈরি করার সময় এটি সহায়ক। -
saveInSrc
: উত্পন্ন বেসলাইন প্রোফাইলগুলিsrc/
ফোল্ডারে সংরক্ষণ করা হয়েছে কিনা তা নির্দিষ্ট করে। বিকল্পভাবে, আপনি:baselineprofile
বিল্ড ফোল্ডার থেকে ফাইলটি অ্যাক্সেস করতে পারেন। -
baselineProfileOutputDir
: উৎপন্ন বেসলাইন প্রোফাইল কোথায় সংরক্ষণ করতে হবে তা নির্ধারণ করে। -
mergeIntoMain
: ডিফল্টরূপে, বেসলাইন প্রোফাইলগুলি প্রতি বিল্ড বৈকল্পিক (পণ্যের স্বাদ এবং বিল্ড টাইপ) তৈরি করা হয়। আপনি যদি সমস্ত প্রোফাইলকেsrc/main
এ মার্জ করতে চান, তাহলে আপনি এই পতাকাটি সক্রিয় করে এটি করতে পারেন। -
filter
: আপনি উৎপন্ন বেসলাইন প্রোফাইল থেকে কোন ক্লাস বা পদ্ধতিগুলি অন্তর্ভুক্ত বা বাদ দিতে হবে তা ফিল্টার করতে পারেন। এটি লাইব্রেরি ডেভেলপারদের জন্য সহায়ক হতে পারে যারা লাইব্রেরি থেকে শুধুমাত্র কোড অন্তর্ভুক্ত করতে চান।
9. স্টার্টআপ কর্মক্ষমতা উন্নতি যাচাই করুন
আপনি বেসলাইন প্রোফাইল জেনারেট করার পরে এবং এটিকে আপনার অ্যাপে যুক্ত করার পরে, আপনার অ্যাপের কর্মক্ষমতাতে এটির প্রভাব রয়েছে কিনা তা যাচাই করুন।
নতুন মডিউল উইজার্ড 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()
, যা benchmark()
ফাংশনকে বিভিন্ন compilationMode
সহ কল করে।
কম্পাইলেশন মোড
CompilationMode
প্যারামিটার সংজ্ঞায়িত করে কিভাবে অ্যাপ্লিকেশনটি মেশিন কোডে প্রাক-কম্পাইল করা হয়। এটিতে নিম্নলিখিত বিকল্প রয়েছে:
-
DEFAULT
: উপলব্ধ থাকলে বেসলাইন প্রোফাইল ব্যবহার করে অ্যাপটিকে আংশিকভাবে প্রাক-কম্পাইল করে। কোনcompilationMode
প্যারামিটার প্রয়োগ করা না হলে এটি ব্যবহার করা হয়। -
None()
: অ্যাপ কম্পাইলেশন স্টেট রিসেট করে এবং অ্যাপটিকে প্রাক-কম্পাইল করে না। জাস্ট-ইন-টাইম কম্পাইলেশন (JIT) অ্যাপটি কার্যকর করার সময় এখনও সক্ষম করা আছে। -
Partial()
: বেসলাইন প্রোফাইল বা ওয়ার্ম আপ রান, বা উভয়ের সাথে অ্যাপটিকে প্রাক-কম্পাইল করে। -
Full()
: সম্পূর্ণ অ্যাপ্লিকেশন কোড প্রাক-কম্পাইল করে। অ্যান্ড্রয়েড 6 (এপিআই 23) এবং তার নিচের ক্ষেত্রে এটিই একমাত্র বিকল্প।
আপনি যদি আপনার অ্যাপ্লিকেশন কর্মক্ষমতা অপ্টিমাইজ করা শুরু করতে চান, আপনি DEFAULT
সংকলন মোড চয়ন করতে পারেন, কারণ কর্মক্ষমতা যখন Google Play থেকে অ্যাপটি ইনস্টল করা হয় তখন অনুরূপ। আপনি যদি বেসলাইন প্রোফাইল দ্বারা প্রদত্ত কর্মক্ষমতা সুবিধাগুলির তুলনা করতে চান, তাহলে আপনি সংকলন মোড 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 স্টুডিও আউটপুটে সময় দেখতে পারেন:
স্ক্রিনশট থেকে, আপনি দেখতে পাচ্ছেন যে প্রতিটি CompilationMode
জন্য অ্যাপ স্টার্টআপের সময় আলাদা। মাঝারি মানগুলি নিম্নলিখিত টেবিলে দেখানো হয়েছে:
timeToInitialDisplay [ms] | TimeToFullDisplay [ms] | |
কোনোটিই নয় | 202.2 | 818.8 |
বেসলাইন প্রোফাইল | 193.7 | 637.9 |
উন্নতি | 4% | 28% |
timeToFullDisplay
এর জন্য সংকলন মোডের মধ্যে পার্থক্য হল 180ms, যা শুধুমাত্র একটি বেসলাইন প্রোফাইল থাকার মাধ্যমে ~28% উন্নতি। CompilationNone
আরও খারাপ কাজ করে, কারণ অ্যাপ শুরু করার সময় ডিভাইসটিকে সবচেয়ে বেশি JIT কম্পাইল করতে হয়। CompilationBaselineProfiles
ভাল পারফর্ম করে কারণ বেসলাইন প্রোফাইল AOT-এর সাথে আংশিক সংকলন ব্যবহারকারীর সবচেয়ে বেশি ব্যবহার করা কোড কম্পাইল করে এবং নন-ক্রিটিকাল কোডটিকে আগে থেকে কম্পাইল করা হয় না তাই অবিলম্বে লোড করতে হয় না।
10. (ঐচ্ছিক) স্ক্রলিং কর্মক্ষমতা উন্নতি যাচাই করুন
একইভাবে পূর্ববর্তী ধাপে, আপনি স্ক্রলিং কর্মক্ষমতা পরিমাপ এবং যাচাই করতে পারেন। প্রথমে, বেঞ্চমার্ক নিয়ম এবং দুটি পরীক্ষা পদ্ধতি সহ একটি 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
) 50, 90, 95, এবং 99 তম পার্সেন্টাইলে আউটপুট করে। অ্যান্ড্রয়েড 12 (এপিআই লেভেল 31) এবং উচ্চতর তে, এটি আপনার ফ্রেমগুলি কত সময় সীমা অতিক্রম করেছে তাও প্রদান করে ( frameOverrunMs
)। মান ঋণাত্মক হতে পারে, যার অর্থ ফ্রেম তৈরি করতে অতিরিক্ত সময় বাকি ছিল।
ফলাফলগুলি থেকে, আপনি দেখতে পাচ্ছেন যে CompilationBaselineProfiles
এর গড় সময়কাল 2ms কম, যা ব্যবহারকারীদের জন্য লক্ষণীয় নাও হতে পারে। যাইহোক, অন্যান্য শতাংশের জন্য ফলাফল আরও সুস্পষ্ট। P99-এর জন্য, পার্থক্য হল 43.5ms , যা 90 FPS-এ অপারেটিং ডিভাইসে 3টির বেশি এড়িয়ে যাওয়া ফ্রেম। উদাহরণস্বরূপ, Pixel 6 এর জন্য এটি 1000ms / 90 FPS = ~11ms সর্বাধিক সময় একটি ফ্রেম রেন্ডার করতে।
11. অভিনন্দন
অভিনন্দন, আপনি সফলভাবে এই কোডল্যাবটি সম্পূর্ণ করেছেন এবং বেসলাইন প্রোফাইলগুলির সাথে আপনার অ্যাপের কর্মক্ষমতা উন্নত করেছেন!
অতিরিক্ত সম্পদ
নিম্নলিখিত অতিরিক্ত সম্পদ দেখুন:
- ম্যাক্রোবেঞ্চমার্কের সাথে অ্যাপের কার্যকারিতা পরিদর্শন করুন : কোডল্যাব যা বেঞ্চমার্কিংয়ের সাথে আরও গভীরে যায়।
- পারফরম্যান্সের নমুনা : সংগ্রহস্থল যাতে ম্যাক্রোবেঞ্চমার্ক এবং অন্যান্য কর্মক্ষমতা নমুনা থাকে।
- এখন অ্যান্ড্রয়েড নমুনা অ্যাপে : একটি বাস্তব-বিশ্বের অ্যাপ্লিকেশন যা কর্মক্ষমতা উন্নত করতে বেঞ্চমার্কিং এবং বেসলাইন প্রোফাইল ব্যবহার করে।