অ্যাপের কর্মক্ষমতা পরিমাপের ওভারভিউ

এই ডকুমেন্টটি আপনার অ্যাপের মূল কর্মক্ষমতা সমস্যাগুলি সনাক্ত করতে এবং সমাধান করতে সাহায্য করে।

মূল কর্মক্ষমতা সমস্যা

একটি অ্যাপের খারাপ পারফরম্যান্সের জন্য অনেক সমস্যা থাকতে পারে, তবে আপনার অ্যাপে যেসব সাধারণ সমস্যা লক্ষ্য করা উচিত সেগুলি নিম্নরূপ:

স্টার্টআপ লেটেন্সি

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

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

  • ৫০০ মিলিসেকেন্ডেরও কম সময়ে কোল্ড স্টার্ট। যখন লঞ্চ করা অ্যাপটি সিস্টেমের মেমরিতে উপস্থিত থাকে না তখন কোল্ড স্টার্ট ঘটে। রিবুট করার পর অ্যাপটি যখন প্রথমবার চালু হয় অথবা ব্যবহারকারী বা সিস্টেম অ্যাপ প্রক্রিয়া বন্ধ করে দেয় তখন এটি ঘটে।

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

  • P95 এবং P99 ল্যাটেন্সিগুলি মাঝারি ল্যাটেন্সির খুব কাছাকাছি। যখন অ্যাপটি চালু হতে দীর্ঘ সময় নেয়, তখন এটি ব্যবহারকারীর অভিজ্ঞতাকে খারাপ করে তোলে। অ্যাপ স্টার্টআপের গুরুত্বপূর্ণ পথে ইন্টারপ্রসেস কমিউনিকেশন (IPC) এবং অপ্রয়োজনীয় I/O লক কনটেন্টের সম্মুখীন হতে পারে এবং অসঙ্গতি তৈরি করতে পারে।

স্ক্রোল জ্যাঙ্ক

জ্যাঙ্ক শব্দটি সেই ভিজ্যুয়াল হিক্কাকে বর্ণনা করে যা তখন ঘটে যখন সিস্টেমটি 60hz বা তার বেশি ক্যাডেন্সে স্ক্রিনে ফ্রেম তৈরি এবং সরবরাহ করতে সক্ষম হয় না। জ্যাঙ্ক স্ক্রোল করার সময় সবচেয়ে স্পষ্ট হয়, যখন মসৃণ অ্যানিমেটেড প্রবাহের পরিবর্তে, হিক্কা হয়। জ্যাঙ্ক তখন দেখা দেয় যখন এক বা একাধিক ফ্রেমের জন্য চলাচল থেমে যায়, কারণ অ্যাপটি সিস্টেমে একটি ফ্রেমের সময়কালের চেয়ে কন্টেন্ট রেন্ডার করতে বেশি সময় নেয়।

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

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

মসৃণ নয় এমন পরিবর্তনগুলি

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

বিদ্যুৎ অদক্ষতা

কাজ করলে ব্যাটারির চার্জ কমে যায়, আর অপ্রয়োজনীয় কাজ করলে ব্যাটারির আয়ু কমে যায়।

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

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

সমস্যাগুলি চিহ্নিত করুন

কর্মক্ষমতা সংক্রান্ত সমস্যাগুলি সনাক্ত এবং প্রতিকারের জন্য আমরা নিম্নলিখিত কর্মপ্রণালী সুপারিশ করেছি:

  1. নিম্নলিখিত গুরুত্বপূর্ণ ব্যবহারকারীর ভ্রমণগুলি সনাক্ত করুন এবং পরিদর্শন করুন:
    • লঞ্চার এবং বিজ্ঞপ্তি সহ সাধারণ স্টার্টআপ প্রবাহ।
    • স্ক্রিন যেখানে ব্যবহারকারী ডেটা স্ক্রোল করে।
    • পর্দার মধ্যে পরিবর্তন।
    • দীর্ঘমেয়াদী প্রবাহ, যেমন নেভিগেশন বা সঙ্গীত প্লেব্যাক।
  2. নিম্নলিখিত ডিবাগিং সরঞ্জামগুলি ব্যবহার করে পূর্ববর্তী প্রবাহের সময় কী ঘটছে তা পরীক্ষা করুন:
    • পারফেটো : আপনাকে সুনির্দিষ্ট সময় তথ্যের সাহায্যে পুরো ডিভাইস জুড়ে কী ঘটছে তা দেখতে দেয়।
    • মেমোরি প্রোফাইলার : আপনাকে দেখতে দেয় যে হিপে কী মেমোরি বরাদ্দ হচ্ছে।
    • Simpleperf : একটি নির্দিষ্ট সময়ের মধ্যে কোন ফাংশন কলগুলি সবচেয়ে বেশি CPU ব্যবহার করছে তার একটি ফ্লেমগ্রাফ দেখায়। যখন আপনি Systrace-এ এমন কিছু সনাক্ত করেন যা দীর্ঘ সময় নিচ্ছে, কিন্তু কেন তা জানেন না, Simpleperf অতিরিক্ত তথ্য প্রদান করতে পারে।

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

  • স্টার্টআপ প্রবাহ
  • জ্যাঙ্ক
    • ফিল্ড মেট্রিক্স
      • প্লে কনসোলের ফ্রেমের গুরুত্বপূর্ণ তথ্য: প্লে কনসোলের মধ্যে, আপনি নির্দিষ্ট ব্যবহারকারীর যাত্রার মেট্রিক্সকে সীমাবদ্ধ করতে পারবেন না। এটি শুধুমাত্র অ্যাপ জুড়ে সামগ্রিক জ্যাঙ্ক রিপোর্ট করে।
      • FrameMetricsAggregator সাহায্যে কাস্টম পরিমাপ: আপনি একটি নির্দিষ্ট কর্মপ্রবাহের সময় জ্যাঙ্ক মেট্রিক্স রেকর্ড করতে FrameMetricsAggregator ব্যবহার করতে পারেন।
    • ল্যাব পরীক্ষা
      • Macrobenchmark দিয়ে স্ক্রোলিং
      • Macrobenchmark dumpsys gfxinfo কমান্ড ব্যবহার করে ফ্রেম টাইমিং সংগ্রহ করে যা একক ব্যবহারকারীর যাত্রাকে বন্ধনী করে। এটি একটি নির্দিষ্ট ব্যবহারকারীর যাত্রার উপর জ্যাঙ্কের তারতম্য বোঝার একটি উপায়। RenderTime মেট্রিক্স, যা ফ্রেমগুলি আঁকতে কত সময় নেয় তা তুলে ধরে, রিগ্রেশন বা উন্নতি সনাক্তকরণের জন্য জ্যাঙ্কি ফ্রেমের গণনার চেয়ে বেশি গুরুত্বপূর্ণ।

অ্যাপ লিংক হলো আপনার ওয়েবসাইটের URL এর উপর ভিত্তি করে তৈরি ডিপ লিংক যা আপনার ওয়েবসাইটের সাথে সম্পর্কিত বলে যাচাই করা হয়। অ্যাপ লিংক যাচাইকরণ ব্যর্থ হওয়ার কারণগুলি নিম্নরূপ।

  • ইন্টেন্ট ফিল্টার স্কোপ: শুধুমাত্র আপনার অ্যাপ যে URL গুলিতে সাড়া দিতে পারে তার জন্য ইন্টেন্ট ফিল্টারগুলিতে autoVerify যোগ করুন।
  • যাচাই না করা প্রোটোকল সুইচ: যাচাই না করা সার্ভার-সাইড এবং সাবডোমেন রিডাইরেক্টগুলিকে নিরাপত্তা ঝুঁকি হিসেবে বিবেচনা করা হয় এবং যাচাই ব্যর্থ হয়। এর ফলে সমস্ত autoVerify লিঙ্ক ব্যর্থ হয়। উদাহরণস্বরূপ, HTTPS লিঙ্কগুলি যাচাই না করে HTTPS থেকে HTTPS-এ, যেমন example.com-এ www.example.com-এ রিডাইরেক্ট করলে যাচাই ব্যর্থ হতে পারে। ইনটেন্ট ফিল্টার যোগ করে অ্যাপ লিঙ্কগুলি যাচাই করতে ভুলবেন না।
  • যাচাইযোগ্য নয় এমন লিঙ্ক: পরীক্ষার উদ্দেশ্যে যাচাইযোগ্য নয় এমন লিঙ্ক যোগ করলে সিস্টেম আপনার অ্যাপের জন্য অ্যাপ লিঙ্ক যাচাই করতে পারবে না।
  • অবিশ্বস্ত সার্ভার: নিশ্চিত করুন যে আপনার সার্ভারগুলি আপনার ক্লায়েন্ট অ্যাপগুলির সাথে সংযোগ করতে পারে।

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

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

ট্রেসপয়েন্ট

অ্যাপগুলি কাস্টম ট্রেস ইভেন্টের মাধ্যমে তাদের কোড ব্যবহার করতে পারে।

ট্রেস ক্যাপচার করার সময়, ট্রেসিংয়ের জন্য প্রতি সেকশনে প্রায় 5μs এর একটি ছোট ওভারহেড লাগে, তাই প্রতিটি পদ্ধতিতে এটি ব্যবহার করবেন না। 0.1 মিলিসেকেন্ডের বেশি কাজের বৃহত্তর অংশ ট্রেস করলে বাধাগুলির মধ্যে উল্লেখযোগ্য অন্তর্দৃষ্টি পাওয়া যেতে পারে।

APK বিবেচ্য বিষয়সমূহ

ডিবাগ ভেরিয়েন্টগুলি স্ট্যাক নমুনার সমস্যা সমাধান এবং প্রতীকীকরণের জন্য সহায়ক হতে পারে, তবে তাদের কর্মক্ষমতার উপর মারাত্মক প্রভাব পড়ে। অ্যান্ড্রয়েড 10 (API লেভেল 29) এবং উচ্চতর সংস্করণে চলমান ডিভাইসগুলি রিলিজ বিল্ডগুলিতে প্রোফাইলিং সক্ষম করতে তাদের ম্যানিফেস্টে profileable android:shell="true" ব্যবহার করতে পারে।

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

সংকলন

আপনার অ্যাপটিকে ডিভাইসে একটি পরিচিত অবস্থায় কম্পাইল করুন —সাধারণত সরলতার জন্য speed , অথবা আরও ঘনিষ্ঠভাবে মিলিত উৎপাদন কর্মক্ষমতার জন্য speed-profile (যদিও এর জন্য অ্যাপ্লিকেশনটি উষ্ণ করা এবং প্রোফাইল ডাম্প করা, অথবা অ্যাপের বেসলাইন প্রোফাইল কম্পাইল করা প্রয়োজন)।

speed এবং speed-profile উভয়ই ডেক্স থেকে ব্যাখ্যা করা কোড রানিংয়ের পরিমাণ হ্রাস করে এবং ফলস্বরূপ ব্যাকগ্রাউন্ড জাস্ট-ইন-টাইম (JIT) সংকলনের পরিমাণ হ্রাস করে যা উল্লেখযোগ্য হস্তক্ষেপের কারণ হতে পারে। শুধুমাত্র speed-profile ডেক্স থেকে রানটাইম ক্লাস লোডিংয়ের প্রভাব হ্রাস করে।

নিম্নলিখিত কমান্ডটি speed মোড ব্যবহার করে অ্যাপ্লিকেশনটি কম্পাইল করে:

adb shell cmd package compile -m speed -f com.example.packagename

speed কম্পাইলেশন মোড অ্যাপের পদ্ধতিগুলিকে সম্পূর্ণরূপে কম্পাইল করে। speed-profile মোড অ্যাপ ব্যবহারের সময় সংগৃহীত ব্যবহৃত কোড পাথের প্রোফাইল অনুসারে অ্যাপের পদ্ধতি এবং ক্লাসগুলিকে কম্পাইল করে। ধারাবাহিকভাবে এবং সঠিকভাবে প্রোফাইল সংগ্রহ করা কঠিন হতে পারে, তাই আপনি যদি সেগুলি ব্যবহার করার সিদ্ধান্ত নেন, তাহলে নিশ্চিত করুন যে তারা আপনার প্রত্যাশা অনুযায়ী সংগ্রহ করছে। প্রোফাইলগুলি নিম্নলিখিত স্থানে অবস্থিত:

/data/misc/profiles/ref/[package-name]/primary.prof

সিস্টেম বিবেচনা

নিম্ন-স্তরের এবং উচ্চ বিশ্বস্ততা পরিমাপের জন্য, আপনার ডিভাইসগুলি ক্যালিব্রেট করুন। একই ডিভাইস এবং একই OS সংস্করণ জুড়ে A/B তুলনা চালান। একই ধরণের ডিভাইস জুড়েও কর্মক্ষমতার ক্ষেত্রে উল্লেখযোগ্য পরিবর্তন হতে পারে।

রুটেড ডিভাইসগুলিতে, মাইক্রোবেঞ্চমার্কের জন্য একটি lockClocks স্ক্রিপ্ট ব্যবহার করার কথা বিবেচনা করুন। অন্যান্য জিনিসের মধ্যে, এই স্ক্রিপ্টগুলি নিম্নলিখিত কাজ করে:

  • একটি নির্দিষ্ট ফ্রিকোয়েন্সিতে CPU গুলি স্থাপন করুন।
  • ছোট কোরগুলি অক্ষম করুন এবং GPU কনফিগার করুন।
  • থার্মাল থ্রটলিং অক্ষম করুন।

আমরা অ্যাপ লঞ্চ, DoU টেস্টিং এবং জ্যাঙ্ক টেস্টিংয়ের মতো ব্যবহারকারী-অভিজ্ঞতা কেন্দ্রিক পরীক্ষার জন্য lockClocks স্ক্রিপ্ট ব্যবহার করার পরামর্শ দিই না, তবে মাইক্রোবেঞ্চমার্ক পরীক্ষায় শব্দ কমানোর জন্য এটি অপরিহার্য হতে পারে।

যখন সম্ভব, Macrobenchmark এর মতো একটি পরীক্ষামূলক কাঠামো ব্যবহার করার কথা বিবেচনা করুন, যা আপনার পরিমাপে শব্দ কমাতে পারে এবং পরিমাপের ভুলতা রোধ করতে পারে।

ধীর গতির অ্যাপ স্টার্টআপ: অপ্রয়োজনীয় ট্রাম্পোলিন কার্যকলাপ

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

alt_text চিত্র ১. ট্রাম্পোলিনের কার্যকলাপ দেখানো একটি ট্রেস।

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

অপ্রয়োজনীয় বরাদ্দ ঘন ঘন জিসি তৈরি করে

আপনি হয়তো দেখতে পাবেন যে একটি সিস্ট্রেসে আবর্জনা সংগ্রহ (GCs) আপনার প্রত্যাশার চেয়ে বেশি ঘন ঘন ঘটছে।

নিম্নলিখিত উদাহরণে, দীর্ঘমেয়াদী অপারেশনের সময় প্রতি ১০ সেকেন্ডে একটি ইঙ্গিত পাওয়া যায় যে অ্যাপটি অপ্রয়োজনীয়ভাবে কিন্তু ধারাবাহিকভাবে সময়ের সাথে সাথে বরাদ্দ করছে:

alt_text চিত্র ২। GC ইভেন্টের মধ্যে স্থান দেখানো একটি ট্রেস।

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

জ্যাঙ্কি ফ্রেম

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

যখন অ্যাপ থেকে খুব কম কাজ করে ফ্রেম আঁকা হয়, তখন ৬০ FPS ডিভাইসে ১৬.৭ms ক্যাডেন্সে Choreographer.doFrame() ট্রেসপয়েন্ট দেখা যায়:

alt_text চিত্র ৩। ঘন ঘন দ্রুত ফ্রেম দেখানো একটি ট্রেস।

যদি আপনি জুম আউট করেন এবং ট্রেসটি নেভিগেট করেন, তাহলে আপনি মাঝে মাঝে দেখতে পাবেন যে ফ্রেমগুলি সম্পূর্ণ হতে একটু বেশি সময় নেয়, তবে এটি এখনও ঠিক আছে কারণ তারা তাদের নির্ধারিত 16.7ms সময়ের চেয়ে বেশি সময় নিচ্ছে না:

alt_text চিত্র ৪। পর্যায়ক্রমিক কাজের বিস্ফোরণ সহ ঘন ঘন দ্রুত ফ্রেম দেখানো একটি ট্রেস।

যখন আপনি এই নিয়মিত ক্যাডেন্সে কোনও ব্যাঘাত দেখতে পান, তখন এটি একটি ঝাঁকুনিপূর্ণ ফ্রেম, যেমন চিত্র ৫-এ দেখানো হয়েছে:

alt_text চিত্র ৫। একটি ঝাঁকুনিপূর্ণ ফ্রেম দেখানো একটি ট্রেস।

তুমি তাদের শনাক্ত করার অনুশীলন করতে পারো।

alt_text চিত্র ৬। আরও ঝাঁকুনিপূর্ণ ফ্রেম দেখানো একটি ট্রেস।

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

জ্যাঙ্কি ফ্রেম সনাক্তকরণ এবং তাদের কারণগুলি ডিবাগ করার বিষয়ে আরও তথ্যের জন্য, ধীর রেন্ডারিং দেখুন।

RecyclerView-এর সাধারণ ভুল

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

ব্যয়বহুল notifyDatasetChanged() কল এড়াতে বর্তমান গতিশীল ডেটা দেখুন, যা কন্টেন্টকে সম্পূর্ণরূপে প্রতিস্থাপন করার পরিবর্তে আপডেট করে।

যদি আপনি প্রতিটি নেস্টেড RecyclerView সঠিকভাবে সমর্থন না করেন, তাহলে প্রতিবার অভ্যন্তরীণ RecyclerView সম্পূর্ণরূপে পুনরায় তৈরি হতে পারে। প্রতিটি নেস্টেড, অভ্যন্তরীণ RecyclerView একটি RecycledViewPool সেট থাকতে হবে যাতে প্রতিটি অভ্যন্তরীণ RecyclerView মধ্যে ভিউ পুনর্ব্যবহার করা যায়।

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

আপনার অ্যাপটি ডিবাগ করুন

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

Systrace দিয়ে অ্যাপ স্টার্টআপ ডিবাগ করুন

অ্যাপ স্টার্টআপ প্রক্রিয়ার একটি সারসংক্ষেপের জন্য অ্যাপ স্টার্টআপ সময় দেখুন এবং সিস্টেম ট্রেসিংয়ের একটি সারসংক্ষেপের জন্য নিম্নলিখিত ভিডিওটি দেখুন।

আপনি নিম্নলিখিত ধাপগুলিতে স্টার্টআপের ধরণগুলি দ্ব্যর্থতা নিরসন করতে পারেন:

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

আমরা ডিভাইসে System Tracing অ্যাপ ব্যবহার করে Systraces ক্যাপচার করার পরামর্শ দিচ্ছি। Android 10 এবং তার পরবর্তী ভার্সনের জন্য, Perfetto ব্যবহার করুন। Android 9 এবং তার পরবর্তী ভার্সনের জন্য, Systrace ব্যবহার করুন। আমরা ওয়েব-ভিত্তিক Perfetto ট্রেস ভিউয়ার ব্যবহার করে ট্রেস ফাইলগুলি দেখারও পরামর্শ দিচ্ছি। আরও তথ্যের জন্য, সিস্টেম ট্রেসিংয়ের ওভারভিউ দেখুন।

কিছু জিনিসের সন্ধান করতে হবে যার মধ্যে রয়েছে:

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

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

  • I/O: স্টার্টআপের সময় সঞ্চালিত I/O পরীক্ষা করুন এবং দীর্ঘ স্টলগুলি সন্ধান করুন।

  • অন্যান্য থ্রেডে উল্লেখযোগ্য কার্যকলাপ: এগুলি UI থ্রেডে হস্তক্ষেপ করতে পারে, তাই স্টার্টআপের সময় ব্যাকগ্রাউন্ডের কাজের দিকে নজর রাখুন।

উন্নত অ্যাপ স্টার্টআপ মেট্রিক রিপোর্টিংয়ের জন্য অ্যাপের দৃষ্টিকোণ থেকে স্টার্টআপ সম্পন্ন হলে reportFullyDrawn কল করার পরামর্শ দিচ্ছি। reportFullyDrawn ব্যবহার সম্পর্কে আরও তথ্যের জন্য Time to full display বিভাগটি দেখুন। আপনি Perfetto ট্রেস প্রসেসরের মাধ্যমে RFD-নির্ধারিত শুরুর সময় বের করতে পারেন এবং একটি ব্যবহারকারী-দৃশ্যমান ট্রেস ইভেন্ট নির্গত হয়।

ডিভাইসে সিস্টেম ট্রেসিং ব্যবহার করুন

আপনি সিস্টেম ট্রেসিং নামক সিস্টেম-স্তরের অ্যাপটি ব্যবহার করে ডিভাইসে সিস্টেম ট্রেস ক্যাপচার করতে পারেন। এই অ্যাপটি আপনাকে ডিভাইসটি প্লাগ ইন বা adb এর সাথে সংযুক্ত না করেই ডিভাইস থেকে ট্রেস রেকর্ড করতে দেয়।

অ্যান্ড্রয়েড স্টুডিও মেমরি প্রোফাইলার ব্যবহার করুন

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

কেন এবং কত ঘন ঘন GC ঘটে তা ট্র্যাক করার জন্য মেমরি প্রোফাইলার ব্যবহার করে তথ্য অনুসরণ করে আপনি আপনার অ্যাপে মেমরি সমস্যা সমাধান করতে পারেন।

অ্যাপ মেমোরি প্রোফাইল করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. স্মৃতি সমস্যা সনাক্ত করুন।

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

    alt_text চিত্র ৭। বস্তুর সংখ্যা বৃদ্ধি।

    alt_text চিত্র ৮। আবর্জনা সংগ্রহ।

    মেমোরি চাপ যোগ করছে এমন ব্যবহারকারীর যাত্রা শনাক্ত করার পর, মেমোরি চাপের মূল কারণগুলি বিশ্লেষণ করুন।

  2. মেমোরি প্রেসার হট স্পট নির্ণয় করুন।

    চিত্র ৯-এ দেখানো হিসাবে, বরাদ্দ এবং অগভীর আকার উভয়ই কল্পনা করার জন্য টাইমলাইনে একটি পরিসর নির্বাচন করুন।

    alt_text চিত্র ৯। বরাদ্দ এবং অগভীর আকারের মান।

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

    • ক্লাস অনুসারে সাজান : যখন আপনি এমন ক্লাস খুঁজে পেতে চান যা এমন বস্তু তৈরি করে যা অন্যথায় ক্যাশে করা হয় বা মেমরি পুল থেকে পুনঃব্যবহৃত হয় তখন এটি কার্যকর।

      উদাহরণস্বরূপ, যদি আপনি দেখেন যে একটি অ্যাপ প্রতি সেকেন্ডে "Vertex" নামক ক্লাসের 2,000টি অবজেক্ট তৈরি করছে, তাহলে এটি প্রতি সেকেন্ডে অ্যালোকেশন কাউন্ট 2,000 বৃদ্ধি করে এবং ক্লাস অনুসারে সাজানোর সময় আপনি এটি দেখতে পাবেন। আবর্জনা তৈরি এড়াতে যদি আপনি এই অবজেক্টগুলি পুনরায় ব্যবহার করতে চান, তাহলে একটি মেমরি পুল বাস্তবায়ন করুন।

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

    • Shallow Size : শুধুমাত্র বস্তুর মেমোরি ট্র্যাক করে। এটি মূলত আদিম মান দিয়ে তৈরি সাধারণ ক্লাস ট্র্যাক করার জন্য কার্যকর।

    • Retained Size : বস্তুর কারণে মোট মেমোরি এবং বস্তুর দ্বারা শুধুমাত্র রেফারেন্স করা রেফারেন্সগুলি দেখায়। জটিল বস্তুর কারণে মেমোরি চাপ ট্র্যাক করার জন্য এটি কার্যকর। এই মানটি পেতে, চিত্র 10-এ দেখানো একটি সম্পূর্ণ মেমোরি ডাম্প নিন এবং চিত্র 11-এ দেখানো হিসাবে Retained Size একটি কলাম হিসাবে যোগ করা হয়েছে।

      alt_text চিত্র ১০। সম্পূর্ণ মেমরি ডাম্প।

      ধরে রাখা আকারের কলাম।
      চিত্র ১১। ধরে রাখা আকারের কলাম।
  3. একটি অপ্টিমাইজেশনের প্রভাব পরিমাপ করুন।

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

    অপ্টিমাইজেশনের প্রভাব পরিমাপ করার জন্য, প্রোফাইলার টাইমলাইনে, GC গুলির মধ্যে সময় পরিমাপ করুন। তারপর আপনি দেখতে পাবেন যে GC গুলির মধ্যে এটি বেশি সময় নিচ্ছে।

    স্মৃতিশক্তির উন্নতির চূড়ান্ত প্রভাবগুলি হল:

    • অ্যাপটি যদি ক্রমাগত মেমোরির চাপ না দেয়, তাহলে মেমোরির বাইরে শাটডাউনের সম্ভাবনা কম থাকে।
    • কম GC থাকলে জ্যাঙ্ক মেট্রিক্স উন্নত হয়, বিশেষ করে P99-এ। এর কারণ হল GC গুলি CPU-তে বিরোধ সৃষ্টি করে, যার ফলে GC চলাকালীন রেন্ডারিং কাজগুলি পিছিয়ে যেতে পারে।
{% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %} {% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %}