কেস স্টাডি: কিভাবে Gmail Wear OS টিম তাদের অ্যাপ স্টার্টআপকে 50% উন্নত করেছে

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

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

একটি ট্রেস ক্যাপচার করুন এবং অ্যাপ স্টার্টআপ দেখুন

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

চিত্র 1. পারফেটোতে ট্রেসের প্রাথমিক দৃশ্য।

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

হাইলাইট করা পিন করার বিকল্প সহ অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ সারি।
চিত্র 2. সহজ বিশ্লেষণের জন্য আপনার ড্যাশবোর্ডের শীর্ষে অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ কাস্টম মেট্রিক পিন করুন।

মনে রাখবেন যে অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ মেট্রিক প্রাথমিক প্রদর্শনের সময়কে উপস্থাপন করে, এমনকি আপনি যদি reportFullyDrawn() ব্যবহার করেন। সম্পূর্ণ প্রদর্শনের সময় সনাক্ত করতে, Perfetto অনুসন্ধান বাক্সে reportFullyDrawn() অনুসন্ধান করুন।

মূল থ্রেড চেক করুন

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

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

অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ এবং প্রধান থ্রেড সারি পিন করা হয়েছে।
চিত্র 3. বিশ্লেষণে সহায়তা করতে অ্যান্ড্রয়েড অ্যাপ স্টার্টআপ কাস্টম মেট্রিকের নীচে প্রধান থ্রেড সারিগুলি পিন করুন৷

চলমান অবস্থায় এবং CPU বিতর্কে সময় কাটানো

অ্যাপ স্টার্টআপের সময় CPU কার্যকলাপের সামগ্রিক দৃশ্য পেতে, অ্যাপ স্টার্টআপের সময়সীমা ক্যাপচার করতে আপনার কার্সারটিকে মূল থ্রেডের উপর টেনে আনুন। প্রদর্শিত থ্রেড স্টেটস প্যানেল আপনাকে আপনার নির্বাচিত সময় সীমার মধ্যে প্রতিটি CPU স্টেটে ব্যয় করা মোট সময় দেখায়।

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

থ্রেড স্টেটস প্যানেলে বিভিন্ন রাজ্যের মোট সময়ের সাথে প্রধান থ্রেড হাইলাইট করা হয়েছে।
চিত্র 4. কতটা CPU বিতর্ক আছে তার প্রাথমিক ধারণা পেতে Runnable টু Running স্টেটে আপেক্ষিক সময়ের মূল্যায়ন করুন।

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

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

OpenDexFilesFromOat* এ কাটানো সময়

এখন OpenDexFilesFromOat* এ অতিবাহিত সময় পরীক্ষা করুন; ট্রেসে, এটি bindApplication স্লাইসের মতো একই সময়ে ঘটে। এই স্লাইসটি অ্যাপ্লিকেশানের DEX ফাইলগুলি পড়ার জন্য নেওয়া সময়ের প্রতিনিধিত্ব করে।

ব্লক বাইন্ডার লেনদেন

পরবর্তী বাইন্ডার লেনদেন চেক করুন. বাইন্ডার লেনদেনগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে কলগুলিকে প্রতিনিধিত্ব করে: এই ক্ষেত্রে, অ্যাপ (ক্লায়েন্ট) একটি binder transaction সাথে অ্যান্ড্রয়েড সিস্টেমকে (সার্ভার) কল করে এবং সার্ভার একটি binder reply দিয়ে প্রতিক্রিয়া জানায়৷ নিশ্চিত করুন যে অ্যাপটি স্টার্টআপের সময় অপ্রয়োজনীয় বাইন্ডার লেনদেন করে না, কারণ তারা CPU বিতর্কের ঝুঁকি বাড়ায়। আপনি যদি পারেন, অ্যাপ স্টার্টআপ পিরিয়ডের পরে বাইন্ডার কল জড়িত এমন কাজ স্থগিত করুন। যদি আপনাকে বাইন্ডার লেনদেন করতে হয়, নিশ্চিত করুন যে সেগুলি আপনার ডিভাইসের Vsync রিফ্রেশ হারের চেয়ে বেশি সময় নেয় না।

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

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

    একটি লাইন বাইন্ডার কল এবং উত্তর সংযোগ করে।
    চিত্র 5. অ্যাপ স্টার্টআপের সময় বাইন্ডার লেনদেনগুলি চিহ্নিত করুন এবং আপনি সেগুলি পিছিয়ে দিতে পারেন কিনা তা মূল্যায়ন করুন৷
  3. সিস্টেম সার্ভার কীভাবে এই বাইন্ডার লেনদেন পরিচালনা করছে তা দেখতে, আপনার স্ক্রিনের শীর্ষে Cpu 0 এবং Cpu 1 থ্রেডগুলি পিন করুন৷

  4. এই ক্ষেত্রে "বাইন্ডার:687_11 [2542]" বাইন্ডারের উত্তর থ্রেডের নাম অন্তর্ভুক্ত করে এমন স্লাইসগুলি খুঁজে বের করে বাইন্ডার উত্তর পরিচালনাকারী সিস্টেম প্রক্রিয়াগুলি খুঁজুন। বাইন্ডার লেনদেন সম্পর্কে আরও তথ্য পেতে প্রাসঙ্গিক সিস্টেম প্রক্রিয়াগুলিতে ক্লিক করুন।

CPU 0 তে যে সুদের বাইন্ডার লেনদেনের সাথে যুক্ত এই সিস্টেম প্রক্রিয়াটি দেখুন:

এন্ড স্টেট সহ সিস্টেম প্রক্রিয়া 'চালানযোগ্য (প্রিম্পড)।
চিত্র 6. সিস্টেম প্রক্রিয়াটি Runnable (Preempted) অবস্থায় রয়েছে, যা নির্দেশ করে যে এটি বিলম্বিত হচ্ছে।

এন্ড স্টেট বলে Runnable (Preempted) , যার মানে হল প্রক্রিয়াটি বিলম্বিত হচ্ছে কারণ CPU অন্য কিছু করছে। এটি কিসের দ্বারা প্রিমম্পড হচ্ছে তা খুঁজে বের করতে, Ftrace ইভেন্ট সারিগুলি প্রসারিত করুন৷ Ftrace ইভেন্টস ট্যাবে যা উপলব্ধ হবে, স্ক্রোল করুন এবং আগ্রহের বাইন্ডার থ্রেড সম্পর্কিত ইভেন্টগুলি সন্ধান করুন "Binder:687_11 [2542]"৷ যে সময়ে সিস্টেম প্রসেসটি প্রিম্পট করা হয়, সেই সময়ে দুটি সিস্টেম সার্ভার ইভেন্ট ঘটে যার মধ্যে আর্গুমেন্ট "ডিকন" অন্তর্ভুক্ত থাকে, যার মানে তারা ডিসপ্লে কন্ট্রোলারের সাথে সম্পর্কিত। এটি যুক্তিসঙ্গত বলে মনে হচ্ছে কারণ ডিসপ্লে কন্ট্রোলার ফ্রেমগুলিকে স্ক্রিনে রাখে - একটি গুরুত্বপূর্ণ কাজ! ইভেন্টগুলিকে তাই রেখে দিন।

সুদের বাইন্ডার লেনদেনের সাথে যুক্ত FTrace ইভেন্টগুলি হাইলাইট করা হয়েছে।
চিত্র 7. FTrace ইভেন্টগুলি নির্দেশ করে যে বাইন্ডার লেনদেন ডিসপ্লে কন্ট্রোলার ইভেন্টগুলির দ্বারা বিলম্বিত হচ্ছে৷

জেআইটি কার্যকলাপ

জাস্ট-ইন-টাইম কম্পাইলেশন (JIT) অ্যাক্টিভিটি তদন্ত করতে, আপনার অ্যাপের সাথে সম্পর্কিত প্রক্রিয়াগুলিকে প্রসারিত করুন, দুটি "জিট থ্রেড পুল" সারি খুঁজুন এবং সেগুলিকে আপনার ভিউয়ের শীর্ষে পিন করুন৷ যেহেতু এই অ্যাপটি অ্যাপ স্টার্টআপের সময় বেসলাইন প্রোফাইলগুলি থেকে উপকৃত হয়, তাই প্রথম ফ্রেমটি আঁকা না হওয়া পর্যন্ত খুব কম JIT কার্যকলাপ ঘটে, প্রথম Choreographer.doFrame কলের শেষ নাগাদ। যাইহোক, JIT compiling void ধীর শুরুর কারণটি লক্ষ্য করুন, যা নির্দেশ করে যে Application creation লেবেলযুক্ত ট্রেসপয়েন্টের সময় ঘটছে সিস্টেমের কার্যকলাপের ফলে প্রচুর পটভূমি JIT কার্যকলাপ ঘটছে। এটি সমাধান করার জন্য, প্রথম ফ্রেমটি বেসলাইন প্রোফাইলে আঁকার পরপরই ঘটে যাওয়া ইভেন্টগুলি যোগ করুন প্রোফাইল সংগ্রহটিকে এমন একটি বিন্দুতে প্রসারিত করে যেখানে অ্যাপটি ব্যবহার করার জন্য প্রস্তুত। অনেক ক্ষেত্রে, আপনি আপনার বেসলাইন প্রোফাইল সংগ্রহের ম্যাক্রোবেঞ্চমার্ক পরীক্ষার শেষে একটি লাইন যোগ করে এটি করতে পারেন যা আপনার স্ক্রিনে একটি নির্দিষ্ট UI উইজেট উপস্থিত হওয়ার জন্য অপেক্ষা করে, এটি নির্দেশ করে যে স্ক্রীনটি সম্পূর্ণরূপে জনবহুল।

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

ফলাফল

এই বিশ্লেষণের ফলস্বরূপ, Gmail Wear OS টিম নিম্নলিখিত উন্নতি করেছে:

  • যেহেতু তারা অ্যাপ স্টার্টআপের সময় CPU অ্যাক্টিভিটি দেখার সময় বিরোধ লক্ষ্য করেছে, তাই তারা স্পিনার অ্যানিমেশনটি প্রতিস্থাপন করেছে যেটি নির্দেশ করে যে অ্যাপটি একটি স্ট্যাটিক ইমেজ দিয়ে লোড হচ্ছে। তারা স্প্ল্যাশ স্ক্রিনটিকে দীর্ঘায়িত করেছে ঝিলমিল অবস্থাকে পিছিয়ে দেওয়ার জন্য, দ্বিতীয় স্ক্রীনের অবস্থাটি নির্দেশ করে যে অ্যাপটি লোড হচ্ছে, CPU সংস্থানগুলিকে বিনামূল্যে দিতে। এই উন্নত অ্যাপ স্টার্টআপ লেটেন্সি 50%।
  • OpenDexFilesFromOat* এবং JIT কার্যকলাপে অতিবাহিত সময় দেখার থেকে, তারা বেসলাইন প্রোফাইলের R8 পুনর্লিখন সক্ষম করেছে। এই অ্যাপ স্টার্টআপ লেটেন্সি 20% দ্বারা উন্নত হয়েছে।

অ্যাপের পারফরম্যান্স কীভাবে দক্ষতার সাথে বিশ্লেষণ করা যায় সে সম্পর্কে এখানে টিমের কিছু টিপস রয়েছে:

  • একটি চলমান প্রক্রিয়া সেট আপ করুন যা স্বয়ংক্রিয়ভাবে ট্রেস এবং ফলাফল সংগ্রহ করতে সক্ষম। বেঞ্চমার্কিং ব্যবহার করে আপনার অ্যাপের জন্য স্বয়ংক্রিয় ট্রেসিং সেট আপ করার কথা বিবেচনা করুন।
  • পরিবর্তনের জন্য A/B পরীক্ষা ব্যবহার করুন যা আপনি মনে করেন যে জিনিসগুলি উন্নতি করবে, এবং যদি না হয় তবে সেগুলি প্রত্যাখ্যান করুন। আপনি ম্যাক্রোবেঞ্চমার্ক লাইব্রেরি ব্যবহার করে বিভিন্ন পরিস্থিতিতে কর্মক্ষমতা পরিমাপ করতে পারেন।

আরও জানতে, নিম্নলিখিত সংস্থানগুলি দেখুন: