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

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

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

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

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

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

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

কর্মক্ষমতা ট্রেডঅফ করতে, নিম্নলিখিত বিবেচনা করুন:

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

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

  • অ্যাপ স্টার্টআপে আপনি এই অপারেশনটি চালানোর আশা করছেন তা নিশ্চিত করুন। প্রায়ই, অপ্রয়োজনীয় ক্রিয়াকলাপগুলি লিগ্যাসি কোড বা তৃতীয় পক্ষের লাইব্রেরি থেকে কল করা যেতে পারে।

  • যদি সম্ভব হয়, দীর্ঘ-চলমান অপারেশনগুলিকে পটভূমিতে নিয়ে যান। পটভূমি প্রক্রিয়াগুলি এখনও স্টার্টআপের সময় CPU ব্যবহারকে প্রভাবিত করতে পারে।

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

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

বড় অপারেশনে ব্যয় করা সময় পরিমাপ এবং বিশ্লেষণ করুন

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

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

  • বড় সময় ফ্রেম দখল এবং অপ্টিমাইজ করা যেতে পারে. প্রতি মিলিসেকেন্ড কর্মক্ষমতা গণনা. উদাহরণস্বরূপ, Choreographer ড্রয়ের সময়, লেআউট স্ফীতির সময়, লাইব্রেরি লোডের সময়, Binder লেনদেন বা সংস্থান লোডের সময়গুলি সন্ধান করুন। একটি সাধারণ শুরুর জন্য, 20ms এর বেশি সময় নেয় এমন সমস্ত অপারেশন দেখুন।
  • মূল থ্রেড ব্লক করুন. আরও তথ্যের জন্য, একটি 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()
            )
        ...
    }
}

জাভা

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        ...
        if(BuildConfig.DEBUG) {
            StrictMode.setThreadPolicy(
                    new StrictMode.ThreadPolicy.Builder()
                            .detectAll()
                            .penaltyDeath()
                            .build()
            );
        }
        ...
    }
}

StrictMode.ThreadPolicy ব্যবহার করা সমস্ত ডিবাগ বিল্ডে থ্রেড নীতি চালু করে এবং যখনই থ্রেড নীতির লঙ্ঘন সনাক্ত করা হয় তখন অ্যাপটি ক্র্যাশ করে, যার ফলে থ্রেড নীতি লঙ্ঘনগুলি মিস করা কঠিন হয়৷

TTID এবং TTFD

অ্যাপটির প্রথম ফ্রেম তৈরি করতে যে সময় লাগে তা দেখতে, প্রাথমিক প্রদর্শনের সময় পরিমাপ করুন (TTID)। যাইহোক, ব্যবহারকারী আপনার অ্যাপের সাথে ইন্টারঅ্যাক্ট করা শুরু না করা পর্যন্ত এই মেট্রিকটি অগত্যা সময়কে প্রতিফলিত করে না। সম্পূর্ণ প্রদর্শনের সময় (TTFD) মেট্রিক সম্পূর্ণরূপে ব্যবহারযোগ্য অ্যাপ স্থিতির জন্য প্রয়োজনীয় কোড পাথগুলি পরিমাপ এবং অপ্টিমাইজ করার জন্য আরও কার্যকর।

যখন অ্যাপের UI সম্পূর্ণরূপে আঁকা হয় তখন রিপোর্ট করার কৌশলগুলির জন্য, স্টার্টআপের সময় সঠিকতা উন্নত করুন দেখুন।

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

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

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

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

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

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

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

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

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

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

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

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

UI কর্মক্ষমতা বিশ্লেষণ

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

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

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

সূচনা অপ্টিমাইজ করতে, নিম্নলিখিতগুলি করুন:

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

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

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

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

প্রধান কার্যকলাপ লোড সময় পরীক্ষা করুন

আপনার অ্যাপ্লিকেশানের প্রধান কার্যকলাপে প্রচুর পরিমাণে তথ্য থাকতে পারে যা একাধিক উত্স থেকে লোড করা হয়৷ হোম Activity লেআউট চেক করুন, এবং বিশেষভাবে হোম অ্যাক্টিভিটির Choreographer.onDraw পদ্ধতি দেখুন।

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

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

  • আপনার প্রাথমিক বিন্যাস যতটা সম্ভব মৌলিক করুন। আরও তথ্যের জন্য, অপ্টিমাইজ লেআউট শ্রেণিবিন্যাস দেখুন।
  • ড্রপ করা ফ্রেম এবং জটিল লেআউট সম্পর্কে আরও তথ্য প্রদান করতে কাস্টম ট্রেসপয়েন্ট যোগ করুন।
  • স্টার্টআপের সময় লোড হওয়া বিটম্যাপ সংস্থানগুলির সংখ্যা এবং আকার ছোট করুন।
  • ViewStub ব্যবহার করুন যেখানে লেআউটগুলি অবিলম্বে VISIBLE হয় না৷ একটি ViewStub হল একটি অদৃশ্য, শূন্য-আকারের দৃশ্য যা রানটাইমে লেআউট সংস্থানগুলিকে অলসভাবে স্ফীত করতে ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য, ViewStub দেখুন।

    আপনি যদি জেটপ্যাক কম্পোজ ব্যবহার করেন তবে আপনি কিছু উপাদান লোড করা পিছিয়ে দেওয়ার জন্য রাজ্য ব্যবহার করে ViewStub অনুরূপ আচরণ পেতে পারেন:

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

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

    LaunchedEffect(Unit) {
     shouldLoad = true
    }
    

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

{% শব্দার্থে %} {% endverbatim %} {% শাব্দিক%} {% endverbatim %}