অপ্টিমাইজেশন সংক্রান্ত সমস্যার সমাধান করা

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

সমস্যার সমাধান করার সময়, নিম্নলিখিত পরিস্থিতিগুলির উপর ফোকাস করুন:

  • অতিরিক্ত অপ্টিমাইজেশনের কারণে অ্যাপ ক্র্যাশ করা: R8 অতিরিক্ত কোড অপ্টিমাইজ করার কারণে আপনার অ্যাপ ক্র্যাশ করে।
  • অস্পষ্ট বা অপর্যাপ্ত অপ্টিমাইজেশন: R8 আপনার অ্যাপকে আপনি যতটা আশা করেছিলেন ততটা অপ্টিমাইজ করেনি অথবা অপ্টিমাইজেশনের জন্য আপনার আরও ব্যাখ্যার প্রয়োজন।

অ্যাপ ক্র্যাশ করা

R8-এর মাধ্যমে অপ্টিমাইজ করার পরে আপনার অ্যাপ ক্র্যাশ করলে, সাধারণত ব্রোকেন রিফ্লেকশনের কারণে এটি হয়। ব্রোকেন রিফ্লেকশন শনাক্ত করতে, নিম্নলিখিত নির্দেশিকা ব্যবহার করুন:

  • আপনি একটি ব্যতিক্রম লক্ষ্য করেছেন যার অর্থ হল যে উল্লিখিত ক্লাস, পদ্ধতি বা ফিল্ড রিফ্লেকশনের মাধ্যমে ব্যবহার করা হচ্ছে। এইসব ব্যতিক্রম সাধারণত এগুলির মধ্যে একটি: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • আপনি এমন কোড দেখতে পান যা import kotlin.reflect.* বা import java.lang.reflect.*-এর সাথে প্রতিফলনকে রেফার করে।
  • আপনি লক্ষ্য করেছেন যে ক্লাস কনস্ট্রাক্টর নিম্নলিখিত উপায়ে ব্যবহার করা হচ্ছে: Something::class.constructors.
  • আপনি Class.forName(...) দেখতে পাবেন।

সমাধান: রাখার নিয়ম যোগ করুন।

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

অস্পষ্ট বা অপর্যাপ্ত অপ্টিমাইজেশন

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

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

    সমাধান: আপনার প্রোজেক্ট তৈরি করার সময় R8 যেসব নিয়ম প্রয়োগ করে, সেই সব নিয়মের রিপোর্ট দেখে কোন কোন নিয়ম প্রয়োগ করা হয়েছে তা চেক করুন। আপনি এই রিপোর্ট ./app/build/outputs/mapping/configuration.txt-এ পাবেন। এই রিপোর্টে R8 কনফিগার করতে ব্যবহৃত প্রতিটি লাইব্রেরি ও মডিউল থেকে মার্জ করা সব নিয়ম থাকে এবং এটি অদক্ষ নিয়ম শনাক্ত করতে ব্যবহার করা যেতে পারে।

  • অনেক বেশি কোড রাখা হচ্ছে: R8-এর অপ্টিমাইজেশন এমন কোড রেখে দিতে পারে যা আপনি সরিয়ে দিতে চেয়েছিলেন।

    সমাধান: কোডটি কেন রাখা হয়েছে তা বুঝতে সাহায্য করার জন্য কনফিগারেশন বিকল্প -whyareyoukeeping ব্যবহার করুন। আউটপুটে, রেখে দেওয়া কোড থেকে আপনার অ্যাপের কোনও একটি এন্ট্রি পয়েন্টের পাথ থাকে। আরও তথ্যের জন্য, -whyareyoukeeping দেখুন।

  • আসল স্ট্যাক ট্রেস বুঝতে অসুবিধা হওয়া: R8 বিভিন্ন উপায়ে কোড পরিবর্তন করে, এর ফলে স্ট্যাক ট্রেস আর আসল কোডকে রেফার করে না। যেমন, লাইন নম্বর এবং ক্লাস ও পদ্ধতির নাম পরিবর্তন হতে পারে।

    সমাধান: Android Studio Otter 3 ফিচার ড্রপ ও AGP 9.0 থেকে শুরু করে, Logcat অটোমেটিক স্ট্যাক ট্রেস ডিঅবফস্কেট করে। তবে, আপনি যদি Android Studio-এর আগের কোনও ভার্সন ব্যবহার করেন, তাহলে আপনাকে মূল স্ট্যাক ট্রেস ম্যানুয়ালি রিকভার করতে হবে। আসল স্ট্যাক ট্রেস রিকভার করতে, retrace কমান্ড-লাইন টুল ব্যবহার করুন, যা কমান্ড-লাইন টুল প্যাকেজের সাথে বান্ডেল করা থাকে।

    retrace ব্যবহার করতে, ম্যাপিং ফাইল ও স্ট্যাক ট্রেস ফাইলের পাথ সহ কমান্ড দিন। mapping.txt নামের ম্যাপিং ফাইলটি অটোমেটিক আপনার Android অ্যাপ বান্ডেলের (AAB) সাথে বান্ডেল করা হয়। আরও তথ্যের জন্য, রিট্রেস ডকুমেন্টেশন এবং Play Console সহায়তা কেন্দ্রের কীভাবে ক্র্যাশ স্ট্যাক ট্রেস ডিঅবফস্কেট করতে হয় সেই সম্পর্কিত নিবন্ধ দেখুন। Play ও Firebase Crashlytics ব্যবহার করার সময়, অ্যাপ ব্যবহারকারীদের থেকে পরিষেবা সংগ্রহ করা ক্র্যাশ সহ mapping.txt ফাইল ব্যবহার করুন। আপনার প্রোজেক্টের রুট থেকে কীভাবে retrace রান করবেন তা নিম্নলিখিত কমান্ড থেকে জানতে পারবেন:

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

সমস্যার ব্যাপারে অভিযোগ জানানো

R8-এর সাথে কোনও সমস্যার সমাধান করতে না পারলে, বাগ ফাইল করুন।