অ্যাপ স্টার্টআপ বিশ্লেষণ এবং অপ্টিমাইজেশান

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

স্টার্টআপ পরিমাপ করার জন্য আমরা ম্যাক্রোবেঞ্চমার্ক লাইব্রেরি ব্যবহার করার পরামর্শ দিই। এই লাইব্রেরিটি একটি সার্বিক ধারণা এবং বিস্তারিত সিস্টেম ট্রেস প্রদান করে, যার মাধ্যমে স্টার্টআপের সময় ঠিক কী ঘটছে তা দেখা যায়।

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

আপনার অ্যাপের স্টার্টআপ বিশ্লেষণ করতে, নিম্নলিখিতগুলি করুন:

স্টার্টআপ বিশ্লেষণ ও অপ্টিমাইজ করার পদক্ষেপ

অ্যাপ চালু হওয়ার সময় প্রায়শই এমন কিছু নির্দিষ্ট রিসোর্স লোড করার প্রয়োজন হয় যা ব্যবহারকারীদের জন্য অত্যন্ত গুরুত্বপূর্ণ। অপ্রয়োজনীয় রিসোর্সগুলো চালু হওয়ার প্রক্রিয়া সম্পন্ন হওয়া পর্যন্ত লোড হওয়ার জন্য অপেক্ষা করতে পারে।

পারফরম্যান্সের ক্ষেত্রে আপস করার জন্য নিম্নলিখিত বিষয়গুলো বিবেচনা করুন:

  • প্রতিটি অপারেশনের সময় পরিমাপ করতে এবং যে ব্লকগুলো সম্পন্ন হতে বেশি সময় নেয়, সেগুলো শনাক্ত করতে ম্যাক্রোবেঞ্চমার্ক লাইব্রেরি ব্যবহার করুন।

  • নিশ্চিত করুন যে রিসোর্স-নিবিড় অপারেশনটি অ্যাপ চালুর জন্য অপরিহার্য। যদি অপারেশনটি অ্যাপটি সম্পূর্ণরূপে ড্র না হওয়া পর্যন্ত অপেক্ষা করতে পারে, তবে এটি স্টার্টআপের সময় রিসোর্সের সীমাবদ্ধতা কমাতে সাহায্য করতে পারে।

  • নিশ্চিত করুন যে এই অপারেশনটি অ্যাপ চালু হওয়ার সময় চলবে। প্রায়শই, লিগ্যাসি কোড বা থার্ড-পার্টি লাইব্রেরি থেকে অপ্রয়োজনীয় অপারেশন কল করা হতে পারে।

  • সম্ভব হলে, দীর্ঘ সময় ধরে চলা অপারেশনগুলোকে ব্যাকগ্রাউন্ডে সরিয়ে দিন। ব্যাকগ্রাউন্ড প্রসেসগুলো স্টার্টআপের সময়ও সিপিইউ ব্যবহারে প্রভাব ফেলতে পারে।

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

আপনার অ্যাপের স্টার্টআপ টাইম নিয়ে সন্তুষ্ট না হওয়া পর্যন্ত অপ্টিমাইজ করুন এবং পুনরায় পরিমাপ করুন। আরও তথ্যের জন্য, ‘সমস্যা শনাক্ত ও নির্ণয় করতে মেট্রিক্সের ব্যবহার’ দেখুন।

প্রধান কার্যক্রমগুলিতে ব্যয়িত সময় পরিমাপ ও বিশ্লেষণ করুন।

যখন আপনার কাছে অ্যাপ চালুর একটি সম্পূর্ণ ট্রেস থাকবে, তখন ট্রেসটি দেখুন এবং bindApplication বা activityStart মতো প্রধান অপারেশনগুলোর জন্য নেওয়া সময় পরিমাপ করুন। এই ট্রেসগুলো বিশ্লেষণ করার জন্য আমরা Perfetto অথবা Android Studio Profilers ব্যবহার করার পরামর্শ দিই।

অ্যাপ চালু হওয়ার সময় ব্যয়িত মোট সময় পর্যালোচনা করে নিম্নলিখিত কাজগুলো করে এমন অপারেশনগুলো শনাক্ত করুন:

  • এতে অনেক সময় লাগে এবং এটিকে অপ্টিমাইজ করা যায়। পারফরম্যান্সের ক্ষেত্রে প্রতিটি মিলিসেকেন্ড গুরুত্বপূর্ণ। উদাহরণস্বরূপ, Choreographer ড্র টাইম, প্রাথমিক কম্পোজিশন টাইম, লাইব্রেরি লোড টাইম, Binder ট্রানজ্যাকশন বা রিসোর্স লোড টাইমের দিকে নজর দিন। সাধারণভাবে শুরু করার জন্য, ২০ মিলিসেকেন্ডের বেশি সময় নেয় এমন সমস্ত অপারেশনগুলো দেখুন।
  • প্রধান থ্রেডটি ব্লক করুন। আরও তথ্যের জন্য, ‘একটি সিস্ট্রেস রিপোর্ট নেভিগেট করুন’ দেখুন।
  • স্টার্টআপের সময় চালানোর প্রয়োজন নেই।
  • আপনার প্রথম ফ্রেমটি আঁকা হয়ে গেলে অপেক্ষা করা যেতে পারে।

কর্মক্ষমতার ঘাটতি খুঁজে বের করতে এই প্রতিটি সূত্র আরও বিশদভাবে তদন্ত করুন।

প্রধান থ্রেডে ব্যয়বহুল অপারেশনগুলি সনাক্ত করুন

ফাইল 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) মেট্রিকটি বেশি উপযোগী।

অ্যাপের UI সম্পূর্ণরূপে আঁকা হলে কীভাবে রিপোর্ট করতে হয়, সেই কৌশল জানতে “স্টার্টআপ টাইমিংয়ের নির্ভুলতা উন্নত করুন” দেখুন।

TTID এবং TTFD উভয়কেই অপ্টিমাইজ করুন, কারণ উভয়ই নিজ নিজ ক্ষেত্রে গুরুত্বপূর্ণ। একটি সংক্ষিপ্ত TTID ব্যবহারকারীকে বুঝতে সাহায্য করে যে অ্যাপটি আসলেই চালু হচ্ছে। TTFD সংক্ষিপ্ত রাখাটা জরুরি, যাতে ব্যবহারকারী দ্রুত অ্যাপটির সাথে ইন্টারঅ্যাকশন শুরু করতে পারেন।

সামগ্রিক থ্রেডের অবস্থা বিশ্লেষণ করুন

অ্যাপটি চালু হওয়ার সময় নির্বাচন করুন এবং সামগ্রিক থ্রেড স্লাইসগুলো দেখুন। প্রধান থ্রেডটিকে সব সময় সক্রিয় থাকতে হবে।

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

প্রধান থ্রেডের স্লিপিং অবস্থার প্রধান অংশগুলো শনাক্ত করুন

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

প্রধান থ্রেড ব্লকিং এবং নিরবচ্ছিন্ন ঘুম কমানো

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

ইনপুট/আউটপুট (I/O) সম্পর্কিত বাধাযোগ্য স্লিপ মোড উন্নতির জন্য একটি দারুণ সুযোগ হতে পারে। ইনপুট/আউটপুট করা অন্যান্য প্রসেসগুলো, এমনকি সেগুলো সম্পর্কহীন অ্যাপ হলেও, শীর্ষ অ্যাপটির ইনপুট/আউটপুটের সাথে প্রতিদ্বন্দ্বিতা করতে পারে।

স্টার্টআপ সময় উন্নত করুন

অপ্টিমাইজেশনের সুযোগ শনাক্ত করার পর, স্টার্টআপের সময় উন্নত করতে সাহায্য করতে পারে এমন সম্ভাব্য সমাধানগুলো অন্বেষণ করুন:

  • TTID-এর গতি বাড়াতে কন্টেন্ট লেজিলি এবং অ্যাসিঙ্ক্রোনাসলি লোড করুন।
  • যেসব ফাংশন বাইন্ডার কল করে, সেগুলোর ব্যবহার কমিয়ে আনুন। যদি তা অপরিহার্য হয়, তবে বারবার কল না করে ভ্যালু ক্যাশ করার মাধ্যমে অথবা নন-ব্লকিং কাজ ব্যাকগ্রাউন্ড থ্রেডে সরিয়ে নিয়ে সেই কলগুলোকে অপ্টিমাইজ করা নিশ্চিত করুন।
  • আপনার অ্যাপ চালু হওয়া আরও দ্রুত করার জন্য, স্ক্রিনের বাকি অংশ লোড হওয়া শেষ না হওয়া পর্যন্ত আপনি ব্যবহারকারীকে এমন কিছু যত দ্রুত সম্ভব দেখাতে পারেন যার জন্য খুব কম রেন্ডারিং প্রয়োজন।
  • আপনার অ্যাপে একটি স্টার্টআপ প্রোফাইল তৈরি করে যোগ করুন।
  • অ্যাপ চালুর সময় কম্পোনেন্টগুলোর প্রারম্ভিক প্রক্রিয়াকে সুবিন্যস্ত করতে Jetpack App Startup লাইব্রেরি ব্যবহার করুন।

UI পারফরম্যান্স বিশ্লেষণ করুন

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

প্রারম্ভিককরণে কাজ সীমিত করুন

কিছু ফ্রেম লোড হতে অন্যগুলোর চেয়ে বেশি সময় নিতে পারে। এগুলোকে অ্যাপের জন্য ব্যয়বহুল ড্র হিসেবে বিবেচনা করা হয়।

প্রারম্ভিক প্রক্রিয়াকে সর্বোত্তম করতে, নিম্নলিখিতগুলি করুন:

  • ধীরগতির কম্পোজিশন এবং লেআউট পর্যায়গুলোকে অগ্রাধিকার দিন এবং উন্নতির জন্য এগুলো বেছে নিন।
  • ব্যয়বহুল ডেটা খরচ ও বিলম্ব কমাতে কাস্টম ট্রেস ইভেন্ট যোগ করে পারফেট্টো (Perfetto) থেকে আসা প্রতিটি সতর্কতা এবং সিস্ট্রেস (Systrace) থেকে আসা অ্যালার্ট তদন্ত করুন।

ফ্রেম ডেটা পরিমাপ করুন

ফ্রেম ডেটা পরিমাপ করার একাধিক উপায় রয়েছে। প্রধান পাঁচটি সংগ্রহ পদ্ধতি নিম্নরূপ:

  • dumpsys gfxinfo ব্যবহার করে স্থানীয় ডেটা সংগ্রহ: dumpsys ডেটাতে পর্যবেক্ষণ করা সমস্ত ফ্রেমই আপনার অ্যাপের ধীর রেন্ডারিংয়ের জন্য দায়ী নয় বা শেষ ব্যবহারকারীদের উপর কোনো প্রভাব ফেলে না। তবে, পারফরম্যান্সের সাধারণ প্রবণতা বোঝার জন্য বিভিন্ন রিলিজ চক্র জুড়ে এটি খতিয়ে দেখা একটি ভালো উপায়। আপনার টেস্টিং পদ্ধতিতে UI পারফরম্যান্স পরিমাপকে অন্তর্ভুক্ত করতে gfxinfo এবং framestats ব্যবহার সম্পর্কে আরও জানতে, "অ্যান্ড্রয়েড অ্যাপ টেস্টিংয়ের মৌলিক বিষয়সমূহ" দেখুন।
  • JankStats ব্যবহার করে ফিল্ড ডেটা সংগ্রহ: JankStats লাইব্রেরি দিয়ে আপনার অ্যাপের নির্দিষ্ট অংশ থেকে ফ্রেম রেন্ডার হওয়ার সময় সংগ্রহ করুন এবং ডেটা রেকর্ড ও বিশ্লেষণ করুন।
  • ম্যাক্রোবেঞ্চমার্ক ব্যবহার করে পরীক্ষায় (আড়ালে পারফেট্টো)
  • পারফেটটো ফ্রেমটাইমলাইন : অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণে, কোন কাজটি ফ্রেম ড্রপের কারণ হচ্ছে তা শনাক্ত করতে আপনি একটি পারফেটটো ট্রেস থেকে ফ্রেম টাইমলাইন মেট্রিক্স সংগ্রহ করতে পারেন। ফ্রেম ড্রপের কারণ নির্ণয়ের ক্ষেত্রে এটিই হতে পারে প্রথম পদক্ষেপ।
  • জ্যাঙ্ক সনাক্তকরণের জন্য অ্যান্ড্রয়েড স্টুডিও প্রোফাইলার

প্রধান অ্যাক্টিভিটি লোড হওয়ার সময় পরীক্ষা করুন

আপনার অ্যাপের প্রধান অ্যাক্টিভিটিতে একাধিক উৎস থেকে লোড হওয়া প্রচুর পরিমাণে তথ্য থাকতে পারে। হোম Activity UI পরীক্ষা করুন এবং বিশেষভাবে Choreographer#doFrame ইভেন্টটি দেখুন।

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

প্রধান অ্যাক্টিভিটির লোড টাইম অপ্টিমাইজ করার জন্য এই সম্ভাব্য সমাধানগুলো বিবেচনা করুন:

  • আপনার প্রাথমিক কম্পোজিশনটি যতটা সম্ভব হালকা করুন। আরও তথ্যের জন্য, Jetpack Compose Performance দেখুন।
  • ড্রপ হওয়া ফ্রেম এবং জটিল লেআউট সম্পর্কে আরও তথ্য প্রদানের জন্য কাস্টম ট্রেসপয়েন্ট যোগ করুন।
  • স্টার্টআপের সময় লোড হওয়া বিটম্যাপ রিসোর্সের সংখ্যা ও আকার হ্রাস করুন। আরও তথ্যের জন্য, বিটম্যাপ ইমেজ অপ্টিমাইজ করা দেখুন।
  • আপনি যদি Jetpack Compose ব্যবহার করেন, তাহলে আপনার UI-এর যে অংশগুলো চালু হওয়ার সাথে সাথে দেখা যায় না, যেমন এরর স্ক্রিন, ঐচ্ছিক বিবরণ বা সেকেন্ডারি ট্যাব, সেগুলোর লোডিং বিলম্বিত করতে কন্ডিশনাল কম্পোজিশন ব্যবহার করার কথা ভাবতে পারেন। ভারী কম্পোনেন্টগুলোকে একটি সাধারণ স্টেট চেকের মধ্যে আবদ্ধ করার মাধ্যমে, আপনি গুরুত্বপূর্ণ স্টার্টআপ উইন্ডোতে তাদের কম্পোজিশন লজিক কার্যকর করা এড়াতে পারেন, যা আপনার প্রাথমিক লেআউটকে হালকা রাখে।

    var shouldLoad by remember {mutableStateOf(false)}
    
    if (shouldLoad) {
     MyComposable()
    }
    

    shouldLoad পরিবর্তন করে কন্ডিশনাল ব্লকের ভিতরে কম্পোজেবলগুলো লোড করুন:

    LaunchedEffect(Unit) {
     shouldLoad = true
    }
    

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

    Compose-এর পারফরম্যান্স অপ্টিমাইজ করার বিষয়ে আরও তথ্যের জন্য, সেরা অনুশীলনসমূহ (Best Practices) দেখুন।

{% হুবহু %} {% endverbatim %} {% হুবহু%} {% endverbatim %}