অ্যাপ স্টার্ট-আপের সময়, আপনার অ্যাপ ব্যবহারকারীদের উপর প্রথম ইম্প্রেশন তৈরি করে। অ্যাপ স্টার্টআপ দ্রুত লোড হতে হবে এবং ব্যবহারকারীর আপনার অ্যাপ ব্যবহার করার জন্য প্রয়োজনীয় তথ্য প্রদর্শন করতে হবে। যদি আপনার অ্যাপ চালু হতে অনেক সময় নেয়, তাহলে ব্যবহারকারীরা আপনার অ্যাপ থেকে বেরিয়ে যেতে পারে কারণ তারা অনেকক্ষণ অপেক্ষা করছে।
স্টার্টআপ পরিমাপ করতে আমরা Macrobenchmark লাইব্রেরি ব্যবহার করার সাজেশন দিই। লাইব্রেরিটি একটি ওভারভিউ এবং বিস্তারিত সিস্টেম ট্রেস প্রদান করে যাতে ঠিক কী ঘটছে তা দেখা যায় স্টার্টআপের সময়।
সিস্টেম ট্রেস আপনার ডিভাইসে কী ঘটছে সে সম্পর্কে দরকারী তথ্য প্রদান করে, যা আপনাকে বুঝতে সাহায্য করে যে আপনার অ্যাপ স্টার্টআপের সময় কী করছে এবং অপ্টিমাইজেশনের জন্য সম্ভাব্য ক্ষেত্রগুলি চিহ্নিত করে।
আপনার অ্যাপ স্টার্টআপ বিশ্লেষণ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- অ্যাপ স্টার্টআপের জন্য ট্রেস রেকর্ড করতে একটি এনভায়রনমেন্ট সেট-আপ করুন।
- সিস্টেম ট্রেস সম্পর্কে বোঝা।
- Android Studio Profilers বা Perfetto ব্যবহার করে ট্রেস রিপোর্ট নেভিগেট করুন।
স্টার্টআপ বিশ্লেষণ এবং অপ্টিমাইজ করার ধাপ
অ্যাপ চালু করার সময় প্রায়ই নির্দিষ্ট রিসোর্স লোড করতে হয় যা ব্যবহারকারীর জন্য গুরুত্বপূর্ণ। স্টার্টআপ সম্পূর্ণ না হওয়া পর্যন্ত অপ্রয়োজনীয় রিসোর্স লোড হওয়ার জন্য অপেক্ষা করতে পারে।
পারফর্ম্যান্স ট্রেড-অফ করতে, নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:
প্রতিটি অপারেশন সম্পূর্ণ হতে কত সময় লাগছে তা পরিমাপ করতে Macrobenchmark লাইব্রেরি ব্যবহার করুন, এবং কোন কোন ব্লক সম্পূর্ণ হতে বেশি সময় লাগছে তা শনাক্ত করুন।
অ্যাপ স্টার্টআপের জন্য রিসোর্স-ইনটেনসিভ অপারেশনটি গুরুত্বপূর্ণ কিনা তা কনফার্ম করুন। অ্যাপটি সম্পূর্ণভাবে ড্র করা পর্যন্ত অপারেশনটি অপেক্ষা করতে পারলে, এটি স্টার্টআপে রিসোর্স সংক্রান্ত সীমাবদ্ধতা কমাতে সাহায্য করতে পারে।
অ্যাপ স্টার্টআপে এই অপারেশনটি চলবে বলে আপনি আশা করছেন কিনা তা নিশ্চিত করুন। প্রায়শই, অপ্রয়োজনীয় অপারেশন লিগ্যাসি কোড বা থার্ড-পার্টি লাইব্রেরি থেকে কল করা হতে পারে।
সম্ভব হলে, দীর্ঘ সময় ধরে চলা অপারেশন ব্যাকগ্রাউন্ডে সরান। স্টার্টআপের সময় ব্যাকগ্রাউন্ড প্রসেস এখনও CPU ব্যবহারকে প্রভাবিত করতে পারে।
অপারেশনটি সম্পূর্ণভাবে তদন্ত করার পরে, আপনি লোড হতে যে সময় লাগে এবং অ্যাপ স্টার্টআপে এটি অন্তর্ভুক্ত করার প্রয়োজনীয়তার মধ্যে ট্রেড-অফ সম্পর্কে সিদ্ধান্ত নিতে পারেন। আপনার অ্যাপের ওয়ার্কফ্লো পরিবর্তন করার সময় রিগ্রেশন বা ব্রেকিং পরিবর্তনের সম্ভাবনা অন্তর্ভুক্ত করতে ভুলবেন না।
আপনার অ্যাপের স্টার্ট-আপ টাইম নিয়ে সন্তুষ্ট না হওয়া পর্যন্ত অপ্টিমাইজ ও আবার পরিমাপ করুন। আরও তথ্যের জন্য, সমস্যা শনাক্ত ও ডায়াগনসিস করতে মেট্রিক ব্যবহার করুন দেখুন।
প্রধান অপারেশনগুলিতে ব্যয় করা সময় পরিমাপ এবং বিশ্লেষণ করুন
আপনার কাছে অ্যাপ স্টার্টআপ ট্রেস সম্পূর্ণ থাকলে, ট্রেসটি দেখুন এবং bindApplication বা activityStart-এর মতো প্রধান অপারেশনগুলির জন্য
নেওয়া সময় পরিমাপ করুন। এইসব ট্রেস বিশ্লেষণ করার জন্য আমরা Perfetto বা Android
Studio Profilers ব্যবহার করার সাজেশন দিই।
অ্যাপ স্টার্টআপের সময় সামগ্রিকভাবে কতটা সময় লেগেছে তা দেখুন যাতে নিম্নলিখিত কাজগুলি করে এমন কোনও অপারেশন শনাক্ত করা যায়:
- অনেক সময় নেয় এবং অপ্টিমাইজ করা যায়। পারফর্ম্যান্সের ক্ষেত্রে প্রতিটি মিলিসেকেন্ড
গুরুত্বপূর্ণ। যেমন,
Choreographerড্র টাইম, প্রাথমিক কম্পোজিশন টাইম, লাইব্রেরি লোড টাইম,Binderট্রানজ্যাকশন বা রিসোর্স লোড টাইম খুঁজুন। সাধারণভাবে শুরু করার জন্য, ২০ মিলিসেকেন্ডের বেশি সময় নেয় এমন সব অপারেশন দেখুন। - মূল থ্রেড ব্লক করুন। আরও তথ্যের জন্য, Systrace রিপোর্ট নেভিগেট করুন দেখুন।
- স্টার্টআপের সময় চালানোর প্রয়োজন নেই।
- আপনার প্রথম ফ্রেম আঁকা না হওয়া পর্যন্ত অপেক্ষা করতে পারেন।
পারফর্ম্যান্সের ফাঁক খুঁজে পেতে এই ট্রেসগুলির প্রতিটি আরও তদন্ত করুন।
প্রধান থ্রেডে ব্যয়বহুল অপারেশন শনাক্ত করুন
ফাইল I/O এবং নেটওয়ার্ক অ্যাক্সেসের মতো ব্যয়বহুল অপারেশন মূল থ্রেড থেকে বন্ধ রাখাই
সবচেয়ে ভালো পদ্ধতি। অ্যাপ স্টার্টআপের সময় এটি সমানভাবে গুরুত্বপূর্ণ,
কারণ প্রধান থ্রেডে ব্যয়বহুল অপারেশন অ্যাপটিকে প্রতিক্রিয়াহীন করে তুলতে পারে
এবং অন্যান্য গুরুত্বপূর্ণ অপারেশন বিলম্বিত করতে পারে।
StrictMode.ThreadPolicy-এর সাহায্যে
এমন কেস শনাক্ত করা যায় যেখানে প্রধান থ্রেডে ব্যয়বহুল অপারেশন চলছে।
যত তাড়াতাড়ি সম্ভব সমস্যা শনাক্ত করার জন্য ডিবাগ বিল্ডে StrictMode চালু করা একটি ভালো অভ্যাস, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
...
if (BuildConfig.DEBUG)
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyDeath()
.build()
)
...
}
}
StrictMode.ThreadPolicy ব্যবহার করলে সব ডিবাগ বিল্ডে থ্রেড নীতি চালু হয়
এবং থ্রেড নীতি লঙ্ঘন শনাক্ত করা হলে অ্যাপ ক্র্যাশ করে, যার ফলে
থ্রেড নীতি লঙ্ঘন এড়িয়ে যাওয়া কঠিন হয়ে পড়ে।
TTID এবং TTFD
অ্যাপের প্রথম ফ্রেম তৈরি করতে কত সময় লাগে তা দেখতে, প্রাথমিক ডিসপ্লে দেখাতে সময় (TTID) পরিমাপ করুন। তবে, এই মেট্রিক থেকে ব্যবহারকারী আপনার অ্যাপের সাথে ইন্টার্যাক্ট করা শুরু করতে পারার সময় সম্পর্কে জানা যায় না। সম্পূর্ণ ডিসপ্লে হতে সময় (TTFD) মেট্রিক অ্যাপের সম্পূর্ণ ব্যবহারযোগ্য অবস্থা পেতে প্রয়োজনীয় কোড পাথ পরিমাপ ও অপ্টিমাইজ করার ক্ষেত্রে আরও বেশি উপযোগী।
অ্যাপ UI সম্পূর্ণভাবে ড্র করা হলে, রিপোর্টিং সংক্রান্ত কৌশলের জন্য, স্টার্টআপ টাইমিং সঠিকতা উন্নত করুন দেখুন।
TTID এবং TTFD, দুটির জন্যই অপ্টিমাইজ করুন, কারণ দুটিই নিজ নিজ ক্ষেত্রে গুরুত্বপূর্ণ। একটি ছোট TTID ব্যবহারকারীকে দেখতে সাহায্য করে যে অ্যাপটি আসলে চালু হচ্ছে। ব্যবহারকারী যাতে অ্যাপের সাথে দ্রুত ইন্টার্যাক্ট করা শুরু করতে পারেন তা নিশ্চিত করতে TTFD-এর সময়সীমা কম রাখা গুরুত্বপূর্ণ।
সামগ্রিক থ্রেডের অবস্থা বিশ্লেষণ করুন
অ্যাপ স্টার্টআপের সময় বেছে নিন এবং সামগ্রিক থ্রেড স্লাইস দেখুন। মূল থ্রেডকে সব সময় রেসপন্সিভ হতে হবে।
Android Studio Profiler এবং Perfetto-এর মতো টুল প্রধান থ্রেড এবং প্রতিটি ধাপে কতটা সময় ব্যয় হয় তার একটি বিস্তারিত ওভারভিউ প্রদান করে। Perfetto ট্রেস ভিজ্যুয়ালাইজ করার ব্যাপারে আরও তথ্যের জন্য, Perfetto UI ডকুমেন্টেশন দেখুন।
প্রধান থ্রেড স্লিপিং স্টেটের প্রধান চাঙ্ক শনাক্ত করুন
স্লিপিং মোডে অনেক সময় কাটানো হলে, এটি সম্ভবত আপনার অ্যাপের মূল থ্রেড কাজ সম্পূর্ণ করার জন্য অপেক্ষা করছে। আপনার মাল্টিথ্রেডেড অ্যাপ থাকলে, মূল থ্রেডটি যে থ্রেডের জন্য অপেক্ষা করছে সেটি শনাক্ত করুন এবং এই অপারেশনগুলি অপ্টিমাইজ করার কথা বিবেচনা করুন। এছাড়াও, আপনার ক্রিটিক্যাল পাথে অপ্রয়োজনীয় লক কনটেনশন যাতে দেরি না করায়, তা নিশ্চিত করতে এটি উপযোগী হতে পারে।
মূল থ্রেড ব্লকিং এবং নিরবচ্ছিন্ন স্লিপ কমান
মূল থ্রেড ব্লক করা অবস্থায় চলে যাওয়ার প্রতিটি ঘটনা দেখুন। Perfetto এবং Studio Profiler থ্রেড স্টেট টাইমলাইনে একটি কমলা রঙের ইন্ডিকেটর দিয়ে এটি দেখায়। অপারেশনগুলি শনাক্ত করুন, এগুলি প্রত্যাশিত কিনা বা এড়ানো যায় কিনা তা এক্সপ্লোর করুন এবং যেখানে প্রয়োজন সেখানে অপ্টিমাইজ করুন।
I/O-সম্পর্কিত ইন্টারাপ্টিবেল স্লিপ উন্নত করার জন্য একটি খুব ভালো সুযোগ হতে পারে। I/O করছে এমন অন্যান্য প্রসেস, এমনকি সেগুলি সম্পর্কহীন অ্যাপ হলেও, সেরা অ্যাপটি যে I/O করছে তার সাথে প্রতিদ্বন্দ্বিতা করতে পারে।
স্টার্টআপের সময় উন্নত করুন
অপ্টিমাইজেশনের সুযোগ শনাক্ত করার পরে, স্টার্ট-আপের সময় উন্নত করতে সাহায্য করার জন্য সম্ভাব্য সমাধানগুলি এক্সপ্লোর করুন:
- TTID-এর স্পিড বাড়াতে লেজি ও অ্যাসিঙ্ক্রোনাস পদ্ধতিতে কন্টেন্ট লোড করুন।
- বাইন্ডার কল করে এমন কলিং ফাংশন মিনিমাইজ করুন। যদি সেগুলি এড়ানো না যায়, তাহলে নিশ্চিত করুন যে আপনি কল রিপিট করার পরিবর্তে ভ্যালু ক্যাশে করে অথবা ব্যাকগ্রাউন্ড থ্রেডে নন-ব্লকিং কাজ সরিয়ে সেই কলগুলি অপ্টিমাইজ করছেন।
- আপনার অ্যাপ স্টার্টআপ যাতে আরও দ্রুত দেখায়, তার জন্য আপনি এমন কিছু দেখাতে পারেন যা ব্যবহারকারীকে যত তাড়াতাড়ি সম্ভব ন্যূনতম রেন্ডারিংয়ের প্রয়োজন হয়, যতক্ষণ না স্ক্রিনের বাকি অংশ লোড হওয়া শেষ হয়।
- আপনার অ্যাপে স্টার্টআপ প্রোফাইল তৈরি করে যোগ করুন।
- অ্যাপ স্টার্টআপের সময় কম্পোনেন্টের ইনিশিয়ালাইজেশন স্ট্রিমলাইন করতে Jetpack অ্যাপ স্টার্টআপ লাইব্রেরি ব্যবহার করুন।
UI পারফর্ম্যান্স বিশ্লেষণ করুন
অ্যাপ স্টার্টআপের মধ্যে স্প্ল্যাশ স্ক্রিন ও আপনার হোম পেজের লোডিং টাইম অন্তর্ভুক্ত। অ্যাপ স্টার্টআপ অপ্টিমাইজ করতে, আপনার UI আঁকতে কত সময় লেগেছে তা বুঝতে ট্রেস চেক করুন।
ইনিশিয়ালাইজেশনের সময় কাজ সীমিত করুন
কিছু ফ্রেম লোড হতে অন্যদের চেয়ে বেশি সময় লাগতে পারে। এগুলি অ্যাপের জন্য ব্যয়বহুল ড্র হিসেবে বিবেচিত হয়।
ইনিশিয়ালাইজেশন অপ্টিমাইজ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- ধীর কম্পোজিশন ও লেআউট ফেজকে অগ্রাধিকার দিন এবং উন্নতির জন্য এগুলি বেছে নিন।
- Perfetto থেকে পাওয়া প্রতিটি সতর্কতা এবং Systrace থেকে পাওয়া অ্যালার্ট কাস্টম ট্রেস ইভেন্ট যোগ করে তদন্ত করুন যাতে অতিরিক্ত ড্র এবং বিলম্ব কমানো যায়।
ফ্রেম ডেটা পরিমাপ করুন
ফ্রেম ডেটা পরিমাপ করার একাধিক উপায় আছে। সংগ্রহের পাঁচটি প্রধান পদ্ধতি নিম্নলিখিত:
dumpsys gfxinfoব্যবহার করে স্থানীয় সংগ্রহ: dumpsys ডেটাতে দেখা সব ফ্রেম আপনার অ্যাপের ধীরে রেন্ডারিংয়ের জন্য দায়ী নয় অথবা ব্যবহারকারীর উপর কোনও প্রভাব ফেলে না। তবে, পারফর্ম্যান্সের সাধারণ ট্রেন্ড বোঝার জন্য বিভিন্ন রিলিজ সাইকেল জুড়ে এটি দেখার জন্য একটি ভালো পরিমাপ। আপনার পরীক্ষা করার পদ্ধতিতে UI পারফর্ম্যান্স পরিমাপ ইন্টিগ্রেট করতেgfxinfoএবংframestatsব্যবহার করার বিষয়ে আরও জানতে, Android অ্যাপ পরীক্ষা করার প্রাথমিক বিষয় দেখুন।- JankStats ব্যবহার করে ফিল্ড কালেকশন: JankStats লাইব্রেরি ব্যবহার করে আপনার অ্যাপের নির্দিষ্ট অংশ থেকে ফ্রেম রেন্ডার করার মোট সময় সংগ্রহ করুন এবং ডেটা রেকর্ড ও বিশ্লেষণ করুন।
- Macrobenchmark (Perfetto-র সাহায্যে) ব্যবহার করে টেস্ট করার সময়
- Perfetto FrameTimeline: Android 12 (API লেভেল ৩১) বা তার পরবর্তী ভার্সনে, কোন কাজের জন্য ফ্রেম ড্রপ হচ্ছে তা শনাক্ত করতে, আপনি Perfetto ট্রেস থেকে ফ্রেম টাইমলাইন মেট্রিক সংগ্রহ করতে পারবেন। ফ্রেম কেন ড্রপ হচ্ছে তা ডায়াগনসিস করার প্রথম ধাপ এটি হতে পারে।
- জ্যাঙ্ক শনাক্ত করার জন্য Android Studio Profiler
প্রধান অ্যাক্টিভিটি লোড হওয়ার সময় চেক করুন
আপনার অ্যাপের মূল অ্যাক্টিভিটিতে একাধিক সোর্স থেকে লোড করা প্রচুর পরিমাণে তথ্য থাকতে পারে। হোম Activity UI চেক করুন এবং বিশেষ করে
Choreographer#doFrame ইভেন্ট দেখুন।
- অপ্টিমাইজেশনের উদ্দেশ্যে আপনার অ্যাপ এখন সম্পূর্ণভাবে ড্র করা হয়েছে তা সিস্টেমকে জানাতে
reportFullyDrawnব্যবহার করুন। - Macrobenchmark লাইব্রেরির সাহায্যে
StartupTimingMetricব্যবহার করে অ্যাক্টিভিটি ও অ্যাপ লঞ্চ পরিমাপ করুন। - ফ্রেম ড্রপ দেখুন।
- রেন্ডার বা পরিমাপ করতে অনেক সময় নিচ্ছে এমন লেআউট শনাক্ত করুন।
- লোড হতে অনেক সময় নিচ্ছে এমন অ্যাসেট শনাক্ত করুন।
- প্রাথমিক কম্পোজিশনে অন্তর্ভুক্ত অপ্রয়োজনীয় UI এলিমেন্ট শনাক্ত করুন।
প্রধান অ্যাক্টিভিটি লোড হওয়ার সময় অপ্টিমাইজ করার জন্য এইসব সম্ভাব্য সমাধান বিবেচনা করুন:
- আপনার প্রাথমিক কম্পোজিশন যতটা সম্ভব লাইটওয়েট করুন। আরও তথ্যের জন্য, Jetpack Compose পারফর্ম্যান্স দেখুন।
- ড্রপ করা ফ্রেম এবং জটিল লেআউট সম্পর্কে আরও তথ্য প্রদান করতে কাস্টম ট্রেসপয়েন্ট যোগ করুন।
- স্টার্টআপের সময় লোড হওয়া বিটম্যাপ রিসোর্সের সংখ্যা ও সাইজ কমান। আরও তথ্যের জন্য, বিটম্যাপ ছবি অপ্টিমাইজ করা দেখুন।
আপনি Jetpack Compose ব্যবহার করলে, আপনার UI-এর যেসব অংশ লঞ্চ করার সাথে সাথেই দেখা যায় না, যেমন, সমস্যার স্ক্রিন, ঐচ্ছিক বিবরণ বা সেকেন্ডারি ট্যাব, সেগুলি লোড করার কাজ পিছিয়ে দিতে কন্ডিশনাল কম্পোজিশন ব্যবহার করার কথা বিবেচনা করুন। একটি সাধারণ স্টেট চেকের মধ্যে ভারী কম্পোনেন্টগুলি র্যাপ করে, আপনি গুরুত্বপূর্ণ স্টার্টআপ উইন্ডো চলাকালীন তাদের কম্পোজিশন লজিক কার্যকর করা এড়ান, আপনার প্রাথমিক লেআউট হালকা রেখে।
var shouldLoad by remember {mutableStateOf(false)} if (shouldLoad) { MyComposable() }shouldLoadপরিবর্তন করে কন্ডিশনাল ব্লকের মধ্যে কম্পোজেবল লোড করুন:LaunchedEffect(Unit) { shouldLoad = true }এটি একটি রিকম্পোজিশন ট্রিগার করে যার মধ্যে প্রথম স্নিপেটের কন্ডিশনাল ব্লকের কোড অন্তর্ভুক্ত থাকে।
Compose-এর পারফর্ম্যান্স অপ্টিমাইজ করার ব্যাপারে আরও তথ্যের জন্য, পেশাদার পদ্ধতি দেখুন।
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- Macrobenchmark মেট্রিক ক্যাপচার করা
- অ্যাপের পারফর্ম্যান্স পরিমাপ করার ওভারভিউ * ফ্রোজেন ফ্রেম