অ্যাপ শুরুর সময়

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

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

বিভিন্ন অ্যাপ স্টার্টআপ অবস্থা বুঝতে

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

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

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

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

ঠান্ডা শুরু

কোল্ড স্টার্ট বলতে স্ক্র্যাচ থেকে শুরু হওয়া অ্যাপকে বোঝায়। এর মানে হল যে এই শুরু না হওয়া পর্যন্ত, সিস্টেমের প্রক্রিয়াটি অ্যাপের প্রক্রিয়া তৈরি করে। ডিভাইস বুট হওয়ার পর বা সিস্টেম অ্যাপটিকে মেরে ফেলার পর থেকে প্রথমবার আপনার অ্যাপ চালু হওয়ার মতো ক্ষেত্রে ঠান্ডা শুরু হয়।

এই ধরনের স্টার্ট স্টার্টআপের সময় কমিয়ে আনার জন্য সবচেয়ে বড় চ্যালেঞ্জ উপস্থাপন করে, কারণ সিস্টেম এবং অ্যাপের অন্যান্য লঞ্চ স্টেটের তুলনায় অনেক বেশি কাজ করতে হয়।

কোল্ড স্টার্টের শুরুতে, সিস্টেমের নিম্নলিখিত তিনটি কাজ রয়েছে:

  1. অ্যাপটি লোড করুন এবং চালু করুন।
  2. লঞ্চের পরপরই অ্যাপটির জন্য একটি ফাঁকা শুরুর উইন্ডো প্রদর্শন করুন।
  3. অ্যাপ প্রক্রিয়া তৈরি করুন।

যত তাড়াতাড়ি সিস্টেম অ্যাপ প্রক্রিয়া তৈরি করে, অ্যাপ প্রক্রিয়া পরবর্তী ধাপগুলির জন্য দায়ী:

  1. অ্যাপ অবজেক্ট তৈরি করুন।
  2. মূল থ্রেড চালু করুন।
  3. প্রধান কার্যকলাপ তৈরি করুন।
  4. ভিউ স্ফীত করুন।
  5. স্ক্রীন লেআউট করুন।
  6. প্রাথমিক ড্র সঞ্চালন.

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

চিত্র 1 দেখায় কিভাবে সিস্টেম এবং অ্যাপ একে অপরের মধ্যে কাজ বন্ধ করে দেয়।

চিত্র 1. একটি কোল্ড অ্যাপ লঞ্চের গুরুত্বপূর্ণ অংশগুলির একটি ভিজ্যুয়াল উপস্থাপনা৷

অ্যাপ্লিকেশন তৈরি এবং কার্যকলাপ তৈরি করার সময় পারফরম্যান্স সমস্যা দেখা দিতে পারে।

অ্যাপ তৈরি

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

আপনি যদি আপনার নিজের অ্যাপে Application.onCreate() ওভাররাইড করেন, তাহলে সিস্টেমটি আপনার অ্যাপ অবজেক্টে onCreate() পদ্ধতি চালু করবে। পরে, অ্যাপটি মূল থ্রেড তৈরি করে, যা UI থ্রেড নামেও পরিচিত, এবং এটি আপনার প্রধান কার্যকলাপ তৈরির কাজ করে।

এই বিন্দু থেকে, সিস্টেম- এবং অ্যাপ-স্তরের প্রক্রিয়াগুলি অ্যাপের লাইফসাইকেল পর্যায় অনুসারে এগিয়ে যায়।

কার্যকলাপ সৃষ্টি

অ্যাপ প্রক্রিয়া আপনার কার্যকলাপ তৈরি করার পরে, কার্যকলাপ নিম্নলিখিত ক্রিয়াকলাপগুলি সম্পাদন করে:

  1. মান শুরু করে।
  2. কনস্ট্রাক্টরকে কল করে।
  3. কলব্যাক পদ্ধতিকে কল করে, যেমন Activity.onCreate() , কার্যকলাপের বর্তমান জীবনচক্র অবস্থার জন্য উপযুক্ত।

সাধারণত, onCreate() পদ্ধতিটি লোড সময়ের উপর সর্বাধিক প্রভাব ফেলে, কারণ এটি সর্বোচ্চ ওভারহেডের সাথে কাজটি সম্পাদন করে: লোড করা এবং ভিউ স্ফীত করা এবং কার্যকলাপ চালানোর জন্য প্রয়োজনীয় বস্তুগুলি শুরু করা।

উষ্ণ শুরু

একটি উষ্ণ সূচনা একটি ঠান্ডা শুরুর সময় সঞ্চালিত অপারেশনগুলির একটি উপসেটকে অন্তর্ভুক্ত করে। একই সময়ে, এটি একটি গরম শুরুর চেয়ে বেশি ওভারহেড প্রতিনিধিত্ব করে। অনেক সম্ভাব্য অবস্থা আছে যেগুলিকে উষ্ণ শুরু বলে বিবেচনা করা যেতে পারে, যেমন নিম্নলিখিত:

  • ব্যবহারকারী আপনার অ্যাপ থেকে ব্যাক আউট করে কিন্তু তারপর এটি পুনরায় চালু করে। প্রক্রিয়াটি চলতে থাকতে পারে, তবে অ্যাপটিকে অবশ্যই onCreate() এ কল ব্যবহার করে স্ক্র্যাচ থেকে কার্যকলাপটি পুনরায় তৈরি করতে হবে।

  • সিস্টেমটি আপনার অ্যাপটিকে মেমরি থেকে উচ্ছেদ করে এবং তারপর ব্যবহারকারী এটি পুনরায় চালু করে। প্রক্রিয়া এবং কার্যকলাপ পুনরায় আরম্ভ করা প্রয়োজন, কিন্তু কাজটি কিছুটা উপকৃত হতে পারে সংরক্ষিত ইনস্ট্যান্স স্টেট বান্ডেল onCreate() এ পাস করা থেকে।

হট স্টার্ট

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

যাইহোক, যদি মেমরি ট্রিমিং ইভেন্টের প্রতিক্রিয়া হিসাবে কিছু মেমরি শুদ্ধ করা হয়, যেমন onTrimMemory() , তাহলে হট স্টার্ট ইভেন্টের প্রতিক্রিয়া হিসাবে এই বস্তুগুলিকে পুনরায় তৈরি করতে হবে।

একটি হট স্টার্ট কোল্ড স্টার্টের দৃশ্যের মতো একই অন-স্ক্রীন আচরণ প্রদর্শন করে। অ্যাপটি অ্যাক্টিভিটি রেন্ডার করা শেষ না হওয়া পর্যন্ত সিস্টেম প্রক্রিয়াটি একটি ফাঁকা স্ক্রীন প্রদর্শন করে।

চিত্র 2. বিভিন্ন স্টার্টআপ স্টেট এবং তাদের নিজ নিজ প্রসেস সহ একটি ডায়াগ্রাম, প্রতিটি স্টেট প্রথম ফ্রেম থেকে শুরু হয়।

পারফেটোতে কীভাবে অ্যাপ স্টার্টআপ সনাক্ত করবেন

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

  1. পারফেটোতে, অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ থেকে প্রাপ্ত মেট্রিক সহ সারি খুঁজুন। আপনি এটি দেখতে না পেলে, ডিভাইসে সিস্টেম ট্রেসিং অ্যাপ ব্যবহার করে একটি ট্রেস ক্যাপচার করার চেষ্টা করুন।

    চিত্র 3. অ্যান্ড্রয়েড অ্যাপ স্টার্টআপগুলি পারফেটোতে মেট্রিক স্লাইস তৈরি করেছে।
  2. সংশ্লিষ্ট স্লাইসটিতে ক্লিক করুন এবং স্লাইসটি নির্বাচন করতে m চাপুন। ব্র্যাকেটগুলি স্লাইসের চারপাশে উপস্থিত হয় এবং এটি কতক্ষণ লেগেছিল তা নির্দেশ করে। বর্তমান নির্বাচন ট্যাবেও সময়কাল দেখানো হয়েছে।

  3. পিন আইকনে ক্লিক করে অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ সারিটি পিন করুন, যখন আপনি সারির উপরে পয়েন্টারটি ধরে রাখেন তখন দৃশ্যমান হয়।

  4. প্রশ্নে থাকা অ্যাপটি সহ সারিটিতে স্ক্রোল করুন এবং সারিটি প্রসারিত করতে প্রথম ঘরে ক্লিক করুন৷

  5. প্রধান থ্রেডে জুম করুন, সাধারণত শীর্ষে, w টিপে (জুম আউট করতে s, a, d টিপুন, যথাক্রমে বাম দিকে সরান এবং ডানদিকে সরান)।

    চিত্র 4. অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ অ্যাপের মূল থ্রেডের পাশে মেট্রিক স্লাইস তৈরি করেছে।
  6. প্রাপ্ত মেট্রিক্স স্লাইস অ্যাপ স্টার্টআপে ঠিক কী অন্তর্ভুক্ত রয়েছে তা দেখতে সহজ করে, যাতে আপনি আরও বিশদে ডিবাগ করা চালিয়ে যেতে পারেন।

স্টার্টআপগুলি পরিদর্শন এবং উন্নত করতে মেট্রিক্স ব্যবহার করুন

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

স্টার্টআপ মেট্রিক্স ব্যবহার করার সুবিধা

ঠান্ডা এবং উষ্ণ অ্যাপ স্টার্টআপগুলিকে অপ্টিমাইজ করতে অ্যান্ড্রয়েড টাইম টু ইনিশিয়াল ডিসপ্লে (TTID) এবং টাইম টু ফুল ডিসপ্লে (TTFD) মেট্রিক্স ব্যবহার করে। Android রানটাইম (ART) ভবিষ্যতের স্টার্টআপগুলির অপ্টিমাইজেশনের জন্য দক্ষতার সাথে প্রি-কম্পাইল কোডের জন্য এই মেট্রিকগুলি থেকে ডেটা ব্যবহার করে৷

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

অ্যান্ড্রয়েড গুরুত্বপূর্ণ

অ্যান্ড্রয়েড ভাইটালগুলি আপনার অ্যাপের স্টার্টআপের সময় অতিরিক্ত হলে প্লে কনসোলে আপনাকে সতর্ক করে আপনার অ্যাপের কার্যক্ষমতা উন্নত করতে সাহায্য করতে পারে।

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

  • কোল্ড স্টার্টআপে 5 সেকেন্ড বা তার বেশি সময় লাগে।
  • উষ্ণ স্টার্টআপ 2 সেকেন্ড বা তার বেশি সময় নেয়।
  • হট স্টার্টআপে 1.5 সেকেন্ড বা তার বেশি সময় লাগে।

অ্যান্ড্রয়েড ভাইটাল প্রাথমিক প্রদর্শনের সময় (TTID) মেট্রিক ব্যবহার করে। Google Play কীভাবে Android গুরুত্বপূর্ণ ডেটা সংগ্রহ করে সে সম্পর্কে তথ্যের জন্য, Play Console ডকুমেন্টেশন দেখুন।

প্রাথমিক প্রদর্শনের সময়

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

TTID একটি সময়ের মান হিসাবে পরিমাপ করা হয় যা মোট অতিবাহিত সময়ের প্রতিনিধিত্ব করে যাতে নিম্নলিখিত ঘটনাগুলির ক্রম অন্তর্ভুক্ত থাকে:

  • প্রক্রিয়া চালু করা হচ্ছে।
  • বস্তুর সূচনা.
  • ক্রিয়াকলাপ তৈরি এবং শুরু করা।
  • বিন্যাস স্ফীত.
  • প্রথমবারের মতো অ্যাপটি আঁকছি।

TTID পুনরুদ্ধার করুন

TTID খুঁজতে, Logcat কমান্ড-লাইন টুলে একটি আউটপুট লাইনের জন্য অনুসন্ধান করুন যেখানে একটি মান রয়েছে Displayed । এই মানটি হল TTID এবং নিম্নলিখিত উদাহরণের মতো দেখায়, যেখানে TTID হল 3s534ms:

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

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

চিত্র 5. নিষ্ক্রিয় ফিল্টার এবং logcat এ Displayed মান।

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

কখনও কখনও Logcat আউটপুটে Displayed লাইনে মোট সময়ের জন্য একটি অতিরিক্ত ক্ষেত্র থাকে। উদাহরণ স্বরূপ:

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)

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

আমরা অ্যান্ড্রয়েড স্টুডিওতে লগক্যাট ব্যবহার করার পরামর্শ দিই, কিন্তু আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার না করেন, তাহলে আপনি adb শেল অ্যাক্টিভিটি ম্যানেজার কমান্ড দিয়ে আপনার অ্যাপটি চালিয়ে TTID পরিমাপ করতে পারেন। এখানে একটি উদাহরণ:

adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN

Displayed মেট্রিক আগের মত Logcat আউটপুট প্রদর্শিত হবে. আপনার টার্মিনাল উইন্ডো নিম্নলিখিত প্রদর্শন করে:

Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete

-c এবং -a আর্গুমেন্ট ঐচ্ছিক এবং আপনাকে <category> এবং <action> নির্দিষ্ট করতে দেয়।

সম্পূর্ণ প্রদর্শনের সময়

টাইম টু ফুল ডিসপ্লে (TTFD) হল একটি অ্যাপ ব্যবহারকারীর জন্য ইন্টারেক্টিভ হতে যে সময় লাগে। অ্যাপের UI এর প্রথম ফ্রেমটি প্রদর্শন করতে যে সময় লাগে, সেইসাথে প্রাথমিক ফ্রেমটি প্রদর্শিত হওয়ার পরে অ্যাসিঙ্ক্রোনাসভাবে লোড হওয়া সামগ্রী হিসাবে এটি রিপোর্ট করা হয়৷ সাধারণত, এটি নেটওয়ার্ক বা ডিস্ক থেকে লোড করা প্রাথমিক বিষয়বস্তু, যেমন অ্যাপ দ্বারা রিপোর্ট করা হয়েছে। অন্য কথায়, TTFD-এ TTID এর পাশাপাশি অ্যাপটি ব্যবহারযোগ্য হতে সময় লাগে। আপনার অ্যাপের TTFD কম রাখা ব্যবহারকারীদের আপনার অ্যাপের সাথে দ্রুত ইন্টারঅ্যাক্ট করতে দিয়ে ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে।

সিস্টেম টিটিআইডি নির্ধারণ করে যখন Choreographer কার্যকলাপের onDraw() পদ্ধতিতে কল করে এবং যখন এটি জানে যে এটি প্রথমবার কল করে। যাইহোক, সিস্টেমটি জানে না কখন TTFD নির্ধারণ করতে হবে কারণ প্রতিটি অ্যাপ আলাদাভাবে আচরণ করে। TTFD নির্ধারণ করতে, অ্যাপটিকে সিস্টেমে সংকেত দিতে হবে যখন এটি সম্পূর্ণভাবে টানা অবস্থায় পৌঁছায়।

TTFD পুনরুদ্ধার করুন

TTFD খুঁজে পেতে, ComponentActivity এর reportFullyDrawn() পদ্ধতিতে কল করে সম্পূর্ণ অঙ্কিত অবস্থার সংকেত দিন। reportFullyDrawn পদ্ধতি রিপোর্ট করে যখন অ্যাপটি সম্পূর্ণভাবে আঁকা হয় এবং ব্যবহারযোগ্য অবস্থায় থাকে। TTFD হল সেই সময় যেটি সিস্টেম অ্যাপ লঞ্চের উদ্দেশ্য গ্রহণ করে যখন reportFullyDrawn() কল করা হয়। আপনি যদি reportFullyDrawn() কল না করেন, তাহলে কোনো TTFD মান রিপোর্ট করা হয় না।

TTFD পরিমাপ করতে, আপনি সম্পূর্ণরূপে UI এবং সমস্ত ডেটা আঁকলে reportFullyDrawn() কল করুন। সিস্টেম দ্বারা পরিমাপ করা প্রথম অ্যাক্টিভিটি উইন্ডোটি প্রথম আঁকা এবং প্রদর্শিত হওয়ার আগে reportFullyDrawn() কে কল করবেন না, কারণ তারপর সিস্টেম সিস্টেম পরিমাপিত সময় রিপোর্ট করে। অন্য কথায়, সিস্টেম টিটিআইডি শনাক্ত করার আগে আপনি reportFullyDrawn() কল করলে, সিস্টেমটি TTID এবং TTFD উভয়কেই একই মান হিসাবে রিপোর্ট করে এবং এই মানটি হল TTID মান।

আপনি যখন reportFullyDrawn() ব্যবহার করেন, Logcat নিম্নলিখিত উদাহরণের মতো একটি আউটপুট প্রদর্শন করে, যেখানে TTFD হল 1s54ms:

system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms

Logcat আউটপুট কখনও কখনও total সময় অন্তর্ভুক্ত করে, যেমনটি টাইম টু প্রাথমিক প্রদর্শনে আলোচনা করা হয়েছে।

যদি আপনার প্রদর্শনের সময়গুলি আপনার চেয়ে ধীর হয়, আপনি স্টার্টআপ প্রক্রিয়ায় বাধাগুলি সনাক্ত করার চেষ্টা করতে পারেন।

আপনি reportFullyDrawn() ব্যবহার করতে পারেন মৌলিক ক্ষেত্রে সম্পূর্ণভাবে আঁকা অবস্থাকে সংকেত দিতে যেখানে আপনি সচেতন যে সম্পূর্ণভাবে আঁকা অবস্থা অর্জন করা হয়েছে। যাইহোক, যে ক্ষেত্রে ব্যাকগ্রাউন্ড থ্রেডগুলিকে সম্পূর্ণভাবে আঁকা অবস্থা অর্জনের আগে ব্যাকগ্রাউন্ডের কাজ সম্পূর্ণ করতে হবে, আপনাকে আরও সঠিক TTFD পরিমাপের জন্য reportFullyDrawn() বিলম্বিত করতে হবে। কিভাবে reportFullyDrawn() , নিম্নলিখিত বিভাগটি দেখুন।

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

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

উদাহরণস্বরূপ, যদি UI-তে একটি ডায়নামিক তালিকা থাকে, যেমন একটি RecyclerView বা অলস তালিকা, এটি একটি পটভূমির টাস্ক দ্বারা পপুলেট হতে পারে যা তালিকাটি প্রথম আঁকার পরে সম্পূর্ণ হয় এবং তাই, UI সম্পূর্ণরূপে আঁকা হিসাবে চিহ্নিত করার পরে। এই ধরনের ক্ষেত্রে, তালিকা জনসংখ্যা বেঞ্চমার্কিং-এ অন্তর্ভুক্ত করা হয় না।

আপনার বেঞ্চমার্ক সময়ের অংশ হিসাবে তালিকা জনসংখ্যা অন্তর্ভুক্ত করতে, getFullyDrawnReporter() ব্যবহার করে FullyDrawnReporter পান এবং আপনার অ্যাপ কোডে এটিতে একজন রিপোর্টার যোগ করুন। ব্যাকগ্রাউন্ড টাস্ক তালিকাটি পূরণ করার পরে রিপোর্টারকে ছেড়ে দিন।

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

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে আপনি একাধিক ব্যাকগ্রাউন্ড টাস্ক একসাথে চালাতে পারেন, প্রতিটি তার নিজস্ব রিপোর্টার নিবন্ধন করে:

কোটলিন

class MainActivity : ComponentActivity() {

    sealed interface ActivityState {
        data object LOADING : ActivityState
        data object LOADED : ActivityState
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            var activityState by remember {
                mutableStateOf(ActivityState.LOADING as ActivityState)
            }
            fullyDrawnReporter.addOnReportDrawnListener {
                activityState = ActivityState.LOADED
            }
            ReportFullyDrawnTheme {
                when(activityState) {
                    is ActivityState.LOADING -> {
                        // Display the loading UI.
                    }
                    is ActivityState.LOADED -> {
                        // Display the full UI.
                    }
                }
            }
            SideEffect {
                lifecycleScope.launch(Dispatchers.IO) {
                    fullyDrawnReporter.addReporter()

                    // Perform the background operation.

                    fullyDrawnReporter.removeReporter()
                }
                lifecycleScope.launch(Dispatchers.IO) {
                    fullyDrawnReporter.addReporter()

                    // Perform the background operation.

                    fullyDrawnReporter.removeReporter()
                }
            }
        }
    }
}

জাভা

public class MainActivity extends ComponentActivity {
    private FullyDrawnReporter fullyDrawnReporter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        fullyDrawnReporter = getFullyDrawnReporter();
        fullyDrawnReporter.addOnReportDrawnListener(() -> {
            // Trigger the UI update.
            return Unit.INSTANCE;
        });

        new Thread(new Runnable() {
            @Override
            public void run() {
                fullyDrawnReporter.addReporter();

                // Do the background work.

               fullyDrawnReporter.removeReporter();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                fullyDrawnReporter.addReporter();

                // Do the background work.

                fullyDrawnReporter.removeReporter();
            }
        }).start();
    }
}

যদি আপনার অ্যাপ জেটপ্যাক কম্পোজ ব্যবহার করে, আপনি সম্পূর্ণভাবে আঁকা অবস্থা নির্দেশ করতে নিম্নলিখিত API ব্যবহার করতে পারেন:

  • ReportDrawn : নির্দেশ করে যে আপনার কম্পোজেবল অবিলম্বে মিথস্ক্রিয়া জন্য প্রস্তুত।
  • ReportDrawnWhen : আপনার কম্পোজেবল কখন ইন্টারঅ্যাকশনের জন্য প্রস্তুত তা নির্দেশ করতে একটি পূর্বনির্ধারণ করে, যেমন list.count > 0
  • ReportDrawnAfter : একটি স্থগিত পদ্ধতি গ্রহণ করে যা একবার সম্পূর্ণ হলে ইঙ্গিত করে যে আপনার কম্পোজেবল ইন্টারঅ্যাকশনের জন্য প্রস্তুত।
প্রতিবন্ধকতা চিহ্নিত করুন

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

এছাড়াও আপনি আপনার অ্যাপস এবং অ্যাক্টিভিটিগুলির onCreate() পদ্ধতিগুলির ভিতরে ইনলাইন ট্রেসিংয়ের মাধ্যমে সম্ভাব্য বাধাগুলির অন্তর্দৃষ্টি অর্জন করতে পারেন। ইনলাইন ট্রেসিং সম্পর্কে জানতে, Trace ফাংশনের জন্য ডকুমেন্টেশন এবং সিস্টেম ট্রেসিংয়ের ওভারভিউ দেখুন।

সাধারণ সমস্যা সমাধান করুন

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

ভারী অ্যাপ আরম্ভ

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

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

অ্যাপ ইনিশিয়ালাইজেশনের সময় অন্যান্য চ্যালেঞ্জগুলির মধ্যে রয়েছে আবর্জনা সংগ্রহের ইভেন্ট যা প্রভাবশালী বা অসংখ্য, বা ডিস্ক I/O শুরুর সাথে একই সাথে ঘটছে, যা আরম্ভ করার প্রক্রিয়াটিকে আরও ব্লক করে। আবর্জনা সংগ্রহ বিশেষ করে ডালভিক রানটাইমের সাথে বিবেচনা করা হয়; অ্যান্ড্রয়েড রানটাইম (এআরটি) একই সাথে আবর্জনা সংগ্রহ করে, সেই অপারেশনের প্রভাবকে কমিয়ে দেয়।

সমস্যা নির্ণয় করুন

আপনি সমস্যা নির্ণয়ের চেষ্টা করতে পদ্ধতি ট্রেসিং বা ইনলাইন ট্রেসিং ব্যবহার করতে পারেন।

পদ্ধতি ট্রেসিং

CPU প্রোফাইলার চালানোর ফলে দেখা যায় যে callApplicationOnCreate() পদ্ধতিটি অবশেষে আপনার com.example.customApplication.onCreate পদ্ধতিতে কল করে। যদি টুলটি দেখায় যে এই পদ্ধতিগুলি কার্যকর করা শেষ করতে দীর্ঘ সময় নিচ্ছে, সেখানে কী কাজ হচ্ছে তা দেখতে আরও অন্বেষণ করুন।

ইনলাইন ট্রেসিং

নিম্নলিখিত সহ সম্ভাব্য অপরাধীদের তদন্ত করতে ইনলাইন ট্রেসিং ব্যবহার করুন:

  • আপনার অ্যাপের প্রাথমিক onCreate() ফাংশন।
  • যেকোনো গ্লোবাল সিঙ্গলটন অবজেক্ট আপনার অ্যাপ আরম্ভ করে।
  • যেকোন ডিস্ক I/O, ডিসিরিয়ালাইজেশন, বা টাইট লুপ যা বাধার সময় ঘটতে পারে।

সমস্যার সমাধান

সমস্যাটি অপ্রয়োজনীয় ইনিশিয়ালাইজেশন বা ডিস্ক I/O এর সাথেই হোক না কেন, সমাধান হল অলস প্রারম্ভিকতা। অন্য কথায়, অবিলম্বে প্রয়োজনীয় বস্তুগুলিকে শুরু করুন। গ্লোবাল স্ট্যাটিক অবজেক্ট তৈরি করার পরিবর্তে, একটি সিঙ্গলটন প্যাটার্নে যান যেখানে অ্যাপটি প্রথমবার প্রয়োজন হলেই অবজেক্ট শুরু করে।

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

যদি আপনার অ্যাপ স্টার্টআপে অ্যাপ কম্পোনেন্ট শুরু করতে কন্টেন্ট প্রোভাইডার ব্যবহার করে, তাহলে পরিবর্তে অ্যাপ স্টার্টআপ লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন।

ভারী কার্যকলাপ আরম্ভ

ক্রিয়াকলাপ তৈরিতে প্রায়শই প্রচুর উচ্চ-ওভারহেড কাজ করা হয়। প্রায়শই, কর্মক্ষমতা উন্নতি অর্জনের জন্য এই কাজটি অপ্টিমাইজ করার সুযোগ রয়েছে। এই জাতীয় সাধারণ সমস্যাগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • বড় বা জটিল লেআউট স্ফীত করা।
  • ডিস্ক, বা নেটওয়ার্ক I/O-এ স্ক্রীন অঙ্কন ব্লক করা।
  • বিটম্যাপ লোড এবং ডিকোডিং।
  • রাস্টারাইজিং VectorDrawable বস্তু।
  • কার্যকলাপের অন্যান্য সাবসিস্টেমের সূচনা।

সমস্যা নির্ণয় করুন

এই ক্ষেত্রে, পাশাপাশি, উভয় পদ্ধতি ট্রেসিং এবং ইনলাইন ট্রেসিং দরকারী হতে পারে।

পদ্ধতি ট্রেসিং

CPU প্রোফাইলার ব্যবহার করার সময়, আপনার অ্যাপের Application সাবক্লাস কনস্ট্রাক্টর এবং com.example.customApplication.onCreate() পদ্ধতিতে মনোযোগ দিন।

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

ইনলাইন ট্রেসিং

নিম্নলিখিত সহ সম্ভাব্য অপরাধীদের তদন্ত করতে ইনলাইন ট্রেসিং ব্যবহার করুন:

  • আপনার অ্যাপের প্রাথমিক onCreate() ফাংশন।
  • যেকোনো গ্লোবাল সিঙ্গলটন অবজেক্ট এটি আরম্ভ করে।
  • যেকোন ডিস্ক I/O, ডিসিরিয়ালাইজেশন, বা টাইট লুপ যা বাধার সময় ঘটতে পারে।

সমস্যার সমাধান

অনেক সম্ভাব্য বাধা রয়েছে, তবে দুটি সাধারণ সমস্যা এবং প্রতিকার নিম্নরূপ:

  • আপনার ভিউ হায়ারার্কি যত বড় হবে, অ্যাপটি এটিকে স্ফীত করতে তত বেশি সময় নেয়। এই সমস্যাটি সমাধান করার জন্য আপনি দুটি পদক্ষেপ নিতে পারেন:
    • অপ্রয়োজনীয় বা নেস্টেড লেআউটগুলি হ্রাস করে আপনার ভিউ অনুক্রমকে সমতল করুন।
    • UI এর অংশগুলিকে স্ফীত করবেন না যেগুলি লঞ্চের সময় দৃশ্যমান হওয়ার প্রয়োজন নেই৷ পরিবর্তে, একটি ViewStub অবজেক্টকে সাব-হায়ারার্কিগুলির জন্য একটি স্থানধারক হিসাবে ব্যবহার করুন যা অ্যাপটি আরও উপযুক্ত সময়ে স্ফীত করতে পারে।
  • মূল থ্রেডে আপনার সমস্ত রিসোর্স ইনিশিয়ালাইজেশন থাকাও স্টার্টআপকে ধীর করে দিতে পারে। আপনি এই সমস্যাটি নিম্নরূপ সমাধান করতে পারেন:
    • সমস্ত রিসোর্স প্রারম্ভিকতা সরান যাতে অ্যাপটি অলসভাবে এটি একটি ভিন্ন থ্রেডে সম্পাদন করতে পারে।
    • অ্যাপটিকে আপনার ভিউ লোড এবং প্রদর্শন করতে দিন এবং তারপরে বিটম্যাপ এবং অন্যান্য সংস্থানগুলির উপর নির্ভরশীল ভিজ্যুয়াল বৈশিষ্ট্যগুলি আপডেট করুন৷

কাস্টম স্প্ল্যাশ পর্দা

আপনি যদি পূর্বে Android 11 (API লেভেল 30) বা তার আগে একটি কাস্টম স্প্ল্যাশ স্ক্রিন প্রয়োগ করতে নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করেন তবে আপনি স্টার্টআপের সময় অতিরিক্ত সময় যোগ করতে দেখতে পারেন:

  • লঞ্চের সময় সিস্টেম দ্বারা আঁকা প্রাথমিক ফাঁকা স্ক্রীনটি বন্ধ করতে windowDisablePreview থিম বৈশিষ্ট্য ব্যবহার করে।
  • একটি উত্সর্গীকৃত Activity ব্যবহার করে.

Android 12 দিয়ে শুরু করে, SplashScreen API-এ স্থানান্তর করা প্রয়োজন। এই APIটি একটি দ্রুত স্টার্টআপ সময় সক্ষম করে এবং আপনাকে নিম্নলিখিত উপায়ে আপনার স্প্ল্যাশ স্ক্রীনকে পরিবর্তন করতে দেয়:

অধিকন্তু, কম্প্যাট লাইব্রেরি SplashScreen API-কে ব্যাকপোর্ট করে ব্যাকওয়ার্ড-কম্প্যাটিবিলিটি সক্ষম করতে এবং সমস্ত অ্যান্ড্রয়েড সংস্করণ জুড়ে স্প্ল্যাশ স্ক্রিন প্রদর্শনের জন্য একটি সামঞ্জস্যপূর্ণ চেহারা তৈরি করতে।

বিস্তারিত জানার জন্য স্প্ল্যাশ স্ক্রিন মাইগ্রেশন গাইড দেখুন।

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