এই পৃষ্ঠাটি সমস্যা সমাধানের সহায়তা এবং Crashlytics ব্যবহার সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্নের উত্তর প্রদান করে। আপনি যা খুঁজছেন তা যদি খুঁজে না পান বা অতিরিক্ত সাহায্যের প্রয়োজন হয়, তাহলে Firebase সহায়তার সাথে যোগাযোগ করুন।
সাধারণ সমস্যা সমাধান/প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
Firebase কনসোলে আপনার Issue টেবিলে তালিকাভুক্ত সমস্যাগুলির জন্য আপনি দুটি ভিন্ন ফর্ম্যাট লক্ষ্য করতে পারেন। এবং আপনার কিছু সমস্যার মধ্যে "ভেরিয়েন্ট" নামক একটি বৈশিষ্ট্যও লক্ষ্য করতে পারেন। এখানে কেন!
২০২৩ সালের গোড়ার দিকে, আমরা ইভেন্টগুলিকে গ্রুপ করার জন্য একটি উন্নত বিশ্লেষণ ইঞ্জিন, সেইসাথে একটি আপডেটেড ডিজাইন এবং নতুন ইস্যুগুলির জন্য কিছু উন্নত বৈশিষ্ট্য (যেমন ভেরিয়েন্ট!) চালু করেছি। সমস্ত বিবরণের জন্য আমাদের সাম্প্রতিক ব্লগ পোস্টটি দেখুন, তবে হাইলাইটগুলির জন্য আপনি নীচে পড়তে পারেন।
Crashlytics আপনার অ্যাপের সমস্ত ইভেন্ট (যেমন ক্র্যাশ, নন-ফ্যাটাল এবং ANR) বিশ্লেষণ করে এবং ইস্যু নামক ইভেন্টের গ্রুপ তৈরি করে — একটি ইস্যুর সমস্ত ইভেন্টের ব্যর্থতার একটি সাধারণ বিন্দু থাকে।
এই সমস্যাগুলির মধ্যে ইভেন্টগুলিকে গোষ্ঠীভুক্ত করার জন্য, উন্নত বিশ্লেষণ ইঞ্জিন এখন ইভেন্টের অনেক দিক বিবেচনা করে, যার মধ্যে রয়েছে স্ট্যাক ট্রেসের ফ্রেম, ব্যতিক্রম বার্তা, ত্রুটি কোড এবং অন্যান্য প্ল্যাটফর্ম বা ত্রুটি ধরণের বৈশিষ্ট্য।
তবে, এই ইভেন্ট গ্রুপের মধ্যে, ব্যর্থতার দিকে পরিচালিত স্ট্যাক ট্রেসগুলি ভিন্ন হতে পারে। একটি ভিন্ন স্ট্যাক ট্রেস একটি ভিন্ন মূল কারণকে বোঝাতে পারে। একটি সমস্যার মধ্যে এই সম্ভাব্য পার্থক্যটি উপস্থাপন করার জন্য, আমরা এখন সমস্যার মধ্যে ভেরিয়েন্ট তৈরি করি - প্রতিটি ভেরিয়েন্ট হল একটি সমস্যার ইভেন্টগুলির একটি উপ-গ্রুপ যার একই ব্যর্থতা বিন্দু এবং একই রকম স্ট্যাক ট্রেস রয়েছে। ভেরিয়েন্টগুলির সাহায্যে, আপনি একটি সমস্যার মধ্যে সবচেয়ে সাধারণ স্ট্যাক ট্রেসগুলি ডিবাগ করতে পারেন এবং নির্ধারণ করতে পারেন যে বিভিন্ন মূল কারণ ব্যর্থতার দিকে পরিচালিত করছে কিনা।
এই উন্নতিগুলির সাথে আপনি যা অভিজ্ঞতা পাবেন তা এখানে:
সমস্যা সারির মধ্যে পুনর্নির্মিত মেটাডেটা দেখানো হয়েছে
আপনার অ্যাপে সমস্যাগুলি বোঝা এবং বিচার করা এখন আরও সহজ।কম ডুপ্লিকেট সমস্যা
লাইন নম্বর পরিবর্তনের ফলে নতুন কোনও সমস্যা হয় না।বিভিন্ন মূল কারণ সহ জটিল সমস্যাগুলির সহজে ডিবাগিং
কোনও সমস্যার মধ্যে সবচেয়ে সাধারণ স্ট্যাক ট্রেস ডিবাগ করতে ভেরিয়েন্ট ব্যবহার করুন।আরও অর্থপূর্ণ সতর্কতা এবং সংকেত
একটি নতুন সমস্যা আসলে একটি নতুন বাগের প্রতিনিধিত্ব করে।আরও শক্তিশালী অনুসন্ধান
প্রতিটি ইস্যুতে আরও অনুসন্ধানযোগ্য মেটাডেটা থাকে, যেমন ব্যতিক্রমের ধরণ এবং প্যাকেজের নাম।
এই উন্নতিগুলি কীভাবে কার্যকর হচ্ছে তা এখানে দেওয়া হল:
যখন আমরা আপনার অ্যাপ থেকে নতুন ইভেন্ট পাব, তখন আমরা পরীক্ষা করব যে সেগুলি বিদ্যমান কোনও সমস্যার সাথে মেলে কিনা।
যদি কোনও মিল না থাকে, তাহলে আমরা স্বয়ংক্রিয়ভাবে ইভেন্টে আমাদের আরও স্মার্ট ইভেন্ট-গ্রুপিং অ্যালগরিদম প্রয়োগ করব এবং পুনর্নির্মিত মেটাডেটা ডিজাইনের সাথে একটি নতুন সমস্যা তৈরি করব।
আমাদের ইভেন্ট গ্রুপিং-এ এটিই প্রথম বড় আপডেট। যদি আপনার কোন প্রতিক্রিয়া থাকে বা কোন সমস্যার সম্মুখীন হন, তাহলে একটি প্রতিবেদন দাখিল করে আমাদের জানান।
যদি আপনি ব্রেডক্রাম্ব লগ ( iOS+ | Android | Flutter | Unity ) দেখতে না পান, তাহলে আমরা আপনাকে Google Analytics এর জন্য আপনার অ্যাপের কনফিগারেশন পরীক্ষা করার পরামর্শ দিচ্ছি। নিশ্চিত করুন যে আপনি নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করছেন:
আপনি আপনার Firebase প্রকল্পে Google Analytics সক্ষম করেছেন ।
আপনি Google Analytics এর জন্য ডেটা শেয়ারিং সক্ষম করেছেন। আপনার Analytics ডেটা শেয়ারিং সেটিংস পরিচালনা করুন বিভাগে এই সেটিং সম্পর্কে আরও জানুন।
আপনি আপনার অ্যাপে Google Analytics এর জন্য Firebase SDK যোগ করেছেন: iOS+ | Android | Flutter | Unity ।
এই SDK টি Crashlytics SDK এর সাথে যুক্ত করতে হবে।আপনার অ্যাপে ব্যবহৃত সমস্ত পণ্যের জন্য আপনি সর্বশেষ Firebase SDK সংস্করণ ব্যবহার করছেন ( iOS+ | Android | Flutter | Unity )।
অ্যাপল প্ল্যাটফর্ম এবং অ্যান্ড্রয়েড অ্যাপের জন্য, বিশেষ করে নিশ্চিত করুন যে আপনি Google Analytics এর জন্য Firebase SDK এর কমপক্ষে নিম্নলিখিত সংস্করণটি ব্যবহার করছেন:
iOS+ — v6.3.1+ (macOS এবং tvOS এর জন্য v8.9.0+) | Android — v17.2.3+ ( BoM v24.7.1+)।
যদি আপনি বেগের সতর্কতা দেখতে না পান, তাহলে নিশ্চিত করুন যে আপনি ব্যবহার করছেন
যদি আপনি ক্র্যাশ-মুক্ত মেট্রিক্স (যেমন ক্র্যাশ-মুক্ত ব্যবহারকারী এবং সেশন) দেখতে না পান অথবা অবিশ্বস্ত মেট্রিক্স দেখতে না পান, তাহলে নিম্নলিখিতগুলি পরীক্ষা করুন:
নিশ্চিত করুন যে আপনি ব্যবহার করছেন
নিশ্চিত করুন যে আপনার ডেটা সংগ্রহের সেটিংস আপনার ক্র্যাশ-মুক্ত মেট্রিক্সের গুণমানের উপর প্রভাব ফেলছে না:
যদি আপনি স্বয়ংক্রিয় ক্র্যাশ রিপোর্টিং অক্ষম করে অপ্ট-ইন রিপোর্টিং সক্ষম করেন , তাহলে ক্র্যাশ তথ্য কেবলমাত্র সেই ব্যবহারকারীদের কাছ থেকে Crashlytics এ পাঠানো যাবে যারা স্পষ্টভাবে ডেটা সংগ্রহে অংশগ্রহণ করেছেন। সুতরাং, ক্র্যাশ-মুক্ত মেট্রিক্সের নির্ভুলতা প্রভাবিত হবে কারণ Crashlytics শুধুমাত্র এই অপ্ট-ইন করা ব্যবহারকারীদের কাছ থেকে ক্র্যাশ তথ্য থাকে (আপনার সমস্ত ব্যবহারকারীর পরিবর্তে)। এর অর্থ হল আপনার ক্র্যাশ-মুক্ত মেট্রিক্স কম নির্ভরযোগ্য এবং আপনার অ্যাপের সামগ্রিক স্থিতিশীলতার প্রতিফলন কম হতে পারে।
যদি আপনার স্বয়ংক্রিয় ডেটা সংগ্রহ অক্ষম থাকে, তাহলে আপনি Crashlytics এ ডিভাইসে ক্যাশ করা রিপোর্ট পাঠাতে
sendUnsentReportsব্যবহার করতে পারেন। এই পদ্ধতি ব্যবহার করলে Crashlytics এ ক্র্যাশ ডেটা পাঠানো হবে, কিন্তু সেশন ডেটা পাঠানো হবে না যার ফলে কনসোল চার্টগুলি ক্র্যাশ-মুক্ত মেট্রিক্সের জন্য কম বা শূন্য মান দেখাবে।
ক্র্যাশ-মুক্ত মেট্রিক্স বুঝুন দেখুন।
নোট প্রকল্পের সদস্যদের প্রশ্ন, স্ট্যাটাস আপডেট ইত্যাদির মাধ্যমে নির্দিষ্ট বিষয়ে মন্তব্য করার সুযোগ দেয়।
যখন কোনও প্রকল্প সদস্য একটি নোট পোস্ট করেন, তখন এটি তাদের Google অ্যাকাউন্টের ইমেল ঠিকানা দিয়ে লেবেল করা হয়। এই ইমেল ঠিকানাটি, নোটের সাথে, সমস্ত প্রকল্প সদস্যদের কাছে দৃশ্যমান হবে যাদের নোটটি দেখার অ্যাক্সেস রয়েছে।
নোট দেখতে, লিখতে এবং মুছে ফেলার জন্য প্রয়োজনীয় অ্যাক্সেসের বর্ণনা নিচে দেওয়া হল:
নিম্নলিখিত যেকোনো ভূমিকা সম্পন্ন প্রকল্পের সদস্যরা বিদ্যমান নোটগুলি দেখতে এবং মুছে ফেলতে এবং কোনও বিষয়ে নতুন নোট লিখতে পারবেন।
- প্রকল্পের মালিক বা সম্পাদক , ফায়ারবেস অ্যাডমিন , কোয়ালিটি অ্যাডমিন , অথবা ক্র্যাশলিটিক্স অ্যাডমিন
নিম্নলিখিত যেকোনো ভূমিকায় থাকা প্রকল্পের সদস্যরা কোনও বিষয়ে পোস্ট করা নোট দেখতে পারবেন, কিন্তু তারা কোনও নোট মুছতে বা লিখতে পারবেন না।
- প্রজেক্ট ভিউয়ার , ফায়ারবেস ভিউয়ার , কোয়ালিটি ভিউয়ার , অথবা ক্র্যাশলিটিক্স ভিউয়ার
আপনি যখন আগে সমস্যাটি বন্ধ করে দিয়েছিলেন তখন একটি সমস্যা রিগ্রেশন হয়েছিল কিন্তু Crashlytics একটি নতুন রিপোর্ট পেয়েছে যে সমস্যাটি আবার ঘটেছে। Crashlytics স্বয়ংক্রিয়ভাবে এই রিগ্রেশন করা সমস্যাগুলি পুনরায় খুলবে যাতে আপনি আপনার অ্যাপের জন্য উপযুক্ত হিসাবে সেগুলি সমাধান করতে পারেন।
এখানে একটি উদাহরণ দেওয়া হল যা ব্যাখ্যা করে যে কীভাবে Crashlytics একটি সমস্যাকে রিগ্রেশন হিসেবে শ্রেণীবদ্ধ করে:
- প্রথমবারের মতো, Crashlytics Crash "A" সম্পর্কে একটি ক্র্যাশ রিপোর্ট পেয়েছে। Crashlytics সেই ক্র্যাশের জন্য একটি সংশ্লিষ্ট সমস্যা (ইস্যু "A") খোলে।
- আপনি দ্রুত এই বাগটি ঠিক করুন, "A" সমস্যাটি বন্ধ করুন, এবং তারপর আপনার অ্যাপের একটি নতুন সংস্করণ প্রকাশ করুন।
- আপনি সমস্যাটি বন্ধ করার পরে, Crashlytics "A" ইস্যু সম্পর্কে আরেকটি প্রতিবেদন পায়।
- যদি রিপোর্টটি এমন কোনও অ্যাপ ভার্সন থেকে আসে যা Crashlytics আপনার সমস্যাটি বন্ধ করার সময় জানত (অর্থাৎ সংস্করণটি কোনও ক্র্যাশের জন্য একটি ক্র্যাশ রিপোর্ট পাঠিয়েছিল), তাহলে Crashlytics সমস্যাটিকে রিগ্রেসড বলে বিবেচনা করবে না। সমস্যাটি বন্ধ থাকবে।
- যদি রিপোর্টটি এমন কোনও অ্যাপ ভার্সন থেকে আসে যা Crashlytics আপনার সমস্যাটি বন্ধ করার সময় জানত না (অর্থাৎ সংস্করণটি কোনও ক্র্যাশের জন্য কোনও ক্র্যাশ রিপোর্ট পাঠায়নি ), তাহলে Crashlytics সমস্যাটিকে পিছিয়ে গেছে বলে মনে করবে এবং সমস্যাটি আবার খুলবে।
যখন কোনও সমস্যা রিগ্রেস হয়, তখন আমরা একটি রিগ্রেশন ডিটেকশন অ্যালার্ট পাঠাই এবং সমস্যাটিতে একটি রিগ্রেশন সিগন্যাল যোগ করি যাতে আপনাকে জানানো হয় যে Crashlytics সমস্যাটি পুনরায় খুলেছে। আমাদের রিগ্রেশন অ্যালগরিদমের কারণে যদি আপনি কোনও সমস্যা পুনরায় খুলতে না চান, তাহলে সমস্যাটি বন্ধ করার পরিবর্তে "মিউট" করুন।
যদি কোনও প্রতিবেদন এমন কোনও পুরানো অ্যাপ সংস্করণ থেকে আসে যা সমস্যাটি বন্ধ করার সময় কখনও কোনও ক্র্যাশ রিপোর্ট পাঠায়নি, তাহলে Crashlytics সমস্যাটিকে পিছিয়ে গেছে বলে মনে করে এবং সমস্যাটি পুনরায় খুলবে।
এই পরিস্থিতি নিম্নলিখিত পরিস্থিতিতে ঘটতে পারে: আপনি একটি বাগ সংশোধন করেছেন এবং আপনার অ্যাপের একটি নতুন সংস্করণ প্রকাশ করেছেন, কিন্তু আপনার এখনও পূর্ববর্তী সংস্করণগুলিতে ব্যবহারকারীরা বাগ সংশোধন ছাড়াই আছেন। যদি, দৈবক্রমে, সমস্যাটি বন্ধ করার সময় পূর্ববর্তী সংস্করণগুলির মধ্যে একটি কখনও কোনও ক্র্যাশ রিপোর্ট না পাঠায় এবং সেই ব্যবহারকারীরা বাগের সম্মুখীন হতে শুরু করে, তাহলে সেই ক্র্যাশ রিপোর্টগুলি একটি রিগ্রেসড সমস্যা তৈরি করবে।
আমাদের রিগ্রেশন অ্যালগরিদমের কারণে যদি আপনি কোনও সমস্যা পুনরায় খুলতে না চান, তাহলে সমস্যাটি বন্ধ করার পরিবর্তে "মিউট" করুন।
যদি আপনার প্রোজেক্টে Google Mobile Ads SDK-এর পাশাপাশি Crashlytics ব্যবহার করা হয়, তাহলে সম্ভবত ক্র্যাশ রিপোর্টাররা ব্যতিক্রম হ্যান্ডলার নিবন্ধনের সময় হস্তক্ষেপ করছে। সমস্যাটি সমাধানের জন্য, disableSDKCrashReporting কল করে Mobile Ads SDK-তে ক্র্যাশ রিপোর্টিং বন্ধ করুন।
Crashlytics BigQuery এর সাথে লিঙ্ক করার পরে, আপনার তৈরি করা নতুন ডেটাসেটগুলি স্বয়ংক্রিয়ভাবে মার্কিন যুক্তরাষ্ট্রে অবস্থিত হবে, আপনার Firebase প্রকল্পের অবস্থান নির্বিশেষে।
প্ল্যাটফর্ম-নির্দিষ্ট সহায়তা
নিম্নলিখিত বিভাগগুলি প্ল্যাটফর্ম-নির্দিষ্ট সমস্যা সমাধান এবং প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীর জন্য সহায়তা প্রদান করে: iOS+ | অ্যান্ড্রয়েড | ইউনিটি ।
অ্যাপল প্ল্যাটফর্ম সাপোর্ট
আপনার প্রকল্পের dSYM গুলি আপলোড করতে এবং ভার্বোজ আউটপুট পেতে, নিম্নলিখিতগুলি পরীক্ষা করুন:
নিশ্চিত করুন যে আপনার প্রোজেক্টের বিল্ড ফেজে Crashlytics রান স্ক্রিপ্ট আছে, যা Xcode কে বিল্ডের সময় আপনার প্রোজেক্টের dSYM আপলোড করার অনুমতি দেয় (স্ক্রিপ্ট যোগ করার নির্দেশাবলীর জন্য Initializing Crashlytics পড়ুন)। আপনার প্রোজেক্ট আপডেট করার পরে, জোর করে ক্র্যাশ করুন এবং নিশ্চিত করুন যে ক্র্যাশটি Crashlytics ড্যাশবোর্ডে প্রদর্শিত হচ্ছে।
যদি আপনি Firebase কনসোলে "missing dSYM" সতর্কতা দেখতে পান, তাহলে Xcode পরীক্ষা করে দেখুন যে এটি বিল্ডের জন্য সঠিকভাবে dSYM তৈরি করছে কিনা ।
যদি Xcode সঠিকভাবে dSYM তৈরি করে, এবং আপনি এখনও dSYM অনুপস্থিত দেখতে পান, তাহলে সম্ভবত dSYM আপলোড করার সময় রান স্ক্রিপ্ট টুলটি আটকে যাচ্ছে। এই ক্ষেত্রে, নিম্নলিখিত প্রতিটি চেষ্টা করে দেখুন:
নিশ্চিত করুন যে আপনি Crashlytics এর সর্বশেষ সংস্করণ ব্যবহার করছেন।
অনুপস্থিত dSYM ফাইলগুলি ম্যানুয়ালি আপলোড করুন:
- বিকল্প ১: dSYMs ট্যাবে কনসোল-ভিত্তিক "টেনে আনুন এবং ফেলে দিন" বিকল্পটি ব্যবহার করে অনুপস্থিত dSYM ফাইলগুলি ধারণকারী একটি জিপ সংরক্ষণাগার আপলোড করুন।
- বিকল্প ২: dSYM ট্যাবে প্রদত্ত UUID গুলির জন্য, অনুপস্থিত dSYM ফাইলগুলি আপলোড করতে
upload-symbolsস্ক্রিপ্ট ব্যবহার করুন।
যদি আপনি এখনও dSYM অনুপস্থিত দেখতে পান, অথবা আপলোডগুলি এখনও ব্যর্থ হয়, তাহলে Firebase সাপোর্টের সাথে যোগাযোগ করুন এবং আপনার লগগুলি অন্তর্ভুক্ত করতে ভুলবেন না।
যদি আপনার স্ট্যাক ট্রেসগুলি খারাপভাবে প্রতীকী বলে মনে হয়, তাহলে নিম্নলিখিতগুলি পরীক্ষা করুন:
যদি আপনার অ্যাপের লাইব্রেরির ফ্রেমগুলিতে আপনার অ্যাপের কোডের রেফারেন্স না থাকে, তাহলে নিশ্চিত করুন যে
-fomit-frame-pointerএকটি সংকলন পতাকা হিসেবে সেট করা নেই।যদি আপনি আপনার অ্যাপের লাইব্রেরির জন্য বেশ কয়েকটি
(Missing)ফ্রেম দেখতে পান, তাহলে Firebase কনসোলের Crashlytics dSYMs ট্যাবে (প্রভাবিত অ্যাপ সংস্করণের জন্য) অনুপস্থিত হিসাবে তালিকাভুক্ত ঐচ্ছিক dSYM গুলি আছে কিনা তা পরীক্ষা করুন। যদি তাই হয়, তাহলে এই পৃষ্ঠায় dSYM গুলি অনুপস্থিত/আপলোড হচ্ছে না এমন FAQ- এ "অনুপস্থিত dSYM সতর্কতা" সমস্যা সমাধানের ধাপটি অনুসরণ করুন। মনে রাখবেন যে এই dSYM গুলি আপলোড করলে ইতিমধ্যে ঘটে যাওয়া ক্র্যাশগুলিকে প্রতীকী করা হবে না, তবে এটি ভবিষ্যতের ক্র্যাশগুলির জন্য প্রতীকীকরণ নিশ্চিত করতে সহায়তা করবে।
হ্যাঁ, আপনি macOS এবং tvOS প্রকল্পগুলিতে Crashlytics বাস্তবায়ন করতে পারেন। Google Analytics এর জন্য Firebase SDK-এর v8.9.0+ অন্তর্ভুক্ত করতে ভুলবেন না যাতে ক্র্যাশগুলি Google Analytics দ্বারা সংগৃহীত মেট্রিক্সে অ্যাক্সেস পেতে পারে (ক্র্যাশ-মুক্ত ব্যবহারকারী, সর্বশেষ প্রকাশ, বেগ সতর্কতা এবং ব্রেডক্রাম্ব লগ)।
এখন আপনি একটি একক Firebase প্রকল্পে একাধিক অ্যাপের ক্র্যাশ রিপোর্ট করতে পারবেন, এমনকি যখন অ্যাপগুলি বিভিন্ন Apple প্ল্যাটফর্মের জন্য তৈরি করা হয় (উদাহরণস্বরূপ, iOS, tvOS, এবং Mac Catalyst)। পূর্বে, যদি একই বান্ডেল আইডি থাকে তবে আপনাকে অ্যাপগুলিকে পৃথক Firebase প্রকল্পে আলাদা করতে হত।
অ্যান্ড্রয়েড সাপোর্ট
Crashlytics Android 11 এবং তার পরবর্তী ভার্সন চালিত ডিভাইস থেকে Android অ্যাপের জন্য ANR রিপোর্টিং সমর্থন করে। ANR সংগ্রহের জন্য আমরা যে অন্তর্নিহিত API ( getHistoricalProcessExitReasons ) ব্যবহার করি তা SIGQUIT বা ওয়াচডগ-ভিত্তিক পদ্ধতির চেয়ে বেশি নির্ভরযোগ্য। এই API শুধুমাত্র Android 11+ ডিভাইসে উপলব্ধ।
যদি আপনার কিছু ANR-তে BuildId গুলি অনুপস্থিত থাকে, তাহলে নিম্নরূপ সমস্যা সমাধান করুন:
নিশ্চিত করুন যে আপনি একটি আপ-টু-ডেট Crashlytics Android SDK এবং Crashlytics Gradle প্লাগইন সংস্করণ ব্যবহার করছেন।
যদি আপনার Android 11 এবং কিছু Android 12 ANR-এর জন্য
BuildIdগুলি অনুপস্থিত থাকে, তাহলে সম্ভবত আপনি একটি পুরানো SDK, Gradle প্লাগইন, অথবা উভয়ই ব্যবহার করছেন। এই ANR-এর জন্যBuildIdগুলি সঠিকভাবে সংগ্রহ করতে, আপনাকে নিম্নলিখিত সংস্করণগুলি ব্যবহার করতে হবে:- Crashlytics অ্যান্ড্রয়েড এসডিকে v18.3.5+ ( Firebase BoM v31.2.2+)
- Crashlytics গ্রেডল প্লাগইন v2.9.4+
আপনার শেয়ার্ড লাইব্রেরির জন্য আপনি কোনও অ-মানক অবস্থান ব্যবহার করছেন কিনা তা পরীক্ষা করুন।
যদি আপনার অ্যাপের শেয়ার্ড লাইব্রেরির জন্য শুধুমাত্র
BuildIdগুলি অনুপস্থিত থাকে, তাহলে সম্ভবত আপনি শেয়ার্ড লাইব্রেরির জন্য স্ট্যান্ডার্ড, ডিফল্ট অবস্থান ব্যবহার করছেন না। যদি এটি হয়, তাহলে Crashlytics সংশ্লিষ্টBuildIdগুলি সনাক্ত করতে সক্ষম নাও হতে পারে। আমরা আপনাকে শেয়ার্ড লাইব্রেরির জন্য স্ট্যান্ডার্ড অবস্থান ব্যবহার করার কথা বিবেচনা করার পরামর্শ দিচ্ছি।নিশ্চিত করুন যে আপনি বিল্ড প্রক্রিয়ার সময়
BuildIdগুলি স্ট্রিপ করছেন না।মনে রাখবেন যে নিম্নলিখিত সমস্যা সমাধানের টিপসগুলি ANR এবং নেটিভ ক্র্যাশ উভয়ের ক্ষেত্রেই প্রযোজ্য।
আপনার বাইনারিগুলিতে
readelf -nচালিয়েBuildIdগুলি বিদ্যমান কিনা তা পরীক্ষা করুন। যদিBuildIdগুলি অনুপস্থিত থাকে, তাহলে আপনার বিল্ড সিস্টেমের ফ্ল্যাগে-Wl,--build-idযোগ করুন।আপনার APK এর আকার কমানোর জন্য
BuildIdগুলি অনিচ্ছাকৃতভাবে বাদ দিচ্ছেন না কিনা তা পরীক্ষা করুন।যদি আপনি কোনও লাইব্রেরির স্ট্রিপড এবং আনস্ট্রিপড সংস্করণ রাখেন, তাহলে আপনার কোডের সঠিক সংস্করণটি নির্দেশ করতে ভুলবেন না।
গুগল প্লে এবং Crashlytics মধ্যে ANR গণনার মধ্যে অমিল থাকতে পারে। ANR ডেটা সংগ্রহ এবং রিপোর্ট করার পদ্ধতির পার্থক্যের কারণে এটি প্রত্যাশিত। অ্যাপটি পরবর্তী শুরু হলে Crashlytics ANR রিপোর্ট করে, যেখানে Android Vitals ANR হওয়ার পরে ANR ডেটা পাঠায়।
উপরন্তু, Crashlytics শুধুমাত্র অ্যান্ড্রয়েড ১১+ চালিত ডিভাইসগুলিতে ঘটে যাওয়া ANR প্রদর্শন করে, যেখানে Google Play পরিষেবা এবং ডেটা সংগ্রহের সম্মতি গ্রহণকারী ডিভাইসগুলি থেকে ANR প্রদর্শন করে।
যখন কোনও অ্যাপ এমন একটি অবফাসকেটর ব্যবহার করে যা ফাইল এক্সটেনশনটি প্রকাশ করে না, তখন Crashlytics ডিফল্টরূপে .java ফাইল এক্সটেনশন সহ প্রতিটি সমস্যা তৈরি করে।
যাতে Crashlytics সঠিক ফাইল এক্সটেনশনের সাথে সমস্যা তৈরি করতে পারে, নিশ্চিত করুন যে আপনার অ্যাপটি নিম্নলিখিত সেটআপ ব্যবহার করে:
- অ্যান্ড্রয়েড গ্রেডল ৪.২.০ বা তার বেশি ব্যবহার করে
- অস্পষ্টতা চালু থাকা অবস্থায় R8 ব্যবহার করে। আপনার অ্যাপটি R8 তে আপডেট করতে, এই ডকুমেন্টেশনটি অনুসরণ করুন।
মনে রাখবেন যে উপরে বর্ণিত সেটআপে আপডেট করার পরে, আপনি নতুন .kt সমস্যাগুলি দেখতে শুরু করতে পারেন যা বিদ্যমান .java সমস্যাগুলির সদৃশ। সেই পরিস্থিতি সম্পর্কে আরও জানতে FAQ দেখুন।
২০২১ সালের ডিসেম্বরের মাঝামাঝি থেকে, Crashlytics কোটলিন ব্যবহারকারী অ্যাপ্লিকেশনগুলির জন্য সমর্থন উন্নত করেছে।
সম্প্রতি পর্যন্ত, উপলব্ধ অবফাসকেটরগুলি ফাইল এক্সটেনশনটি প্রকাশ করত না, তাই Crashlytics প্রতিটি সমস্যা ডিফল্টরূপে .java ফাইল এক্সটেনশন দিয়ে তৈরি করত। তবে, অ্যান্ড্রয়েড গ্রেডল 4.2.0 হিসাবে, R8 ফাইল এক্সটেনশন সমর্থন করে।
এই আপডেটের মাধ্যমে, Crashlytics এখন নির্ধারণ করতে পারবে যে অ্যাপের মধ্যে ব্যবহৃত প্রতিটি ক্লাস Kotlin-এ লেখা আছে কিনা এবং ইস্যু স্বাক্ষরে সঠিক ফাইলের নাম অন্তর্ভুক্ত করতে পারবে। আপনার অ্যাপে নিম্নলিখিত সেটআপ থাকলে ক্র্যাশগুলি এখন সঠিকভাবে .kt ফাইলগুলিতে (যথাযথভাবে) দায়ী করা হবে:
- আপনার অ্যাপটি Android Gradle 4.2.0 বা তার উচ্চতর সংস্করণ ব্যবহার করে।
- আপনার অ্যাপটি অস্পষ্টতা চালু রেখে R8 ব্যবহার করে।
যেহেতু নতুন ক্র্যাশগুলিতে এখন তাদের ইস্যু স্বাক্ষরে সঠিক ফাইল এক্সটেনশন অন্তর্ভুক্ত থাকে, তাই আপনি নতুন .kt সমস্যাগুলি দেখতে পাবেন যা আসলে বিদ্যমান .java লেবেলযুক্ত সমস্যার সদৃশ। Firebase কনসোলে, আমরা একটি নতুন .kt সমস্যাটি বিদ্যমান .java লেবেলযুক্ত সমস্যার সম্ভাব্য সদৃশ কিনা তা সনাক্ত করার এবং আপনাকে যোগাযোগ করার চেষ্টা করি।
যদি আপনি নিম্নলিখিত ব্যতিক্রমটি দেখতে পান, তাহলে সম্ভবত আপনি DexGuard এর এমন একটি সংস্করণ ব্যবহার করছেন যা Firebase Crashlytics SDK এর সাথে বেমানান:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
এই ব্যতিক্রমটি আপনার অ্যাপটিকে ক্র্যাশ করে না বরং ক্র্যাশ রিপোর্ট পাঠানো থেকে বিরত রাখে। এটি ঠিক করার জন্য:
নিশ্চিত করুন যে আপনি সর্বশেষ DexGuard 8.x রিলিজ ব্যবহার করছেন। সর্বশেষ সংস্করণে Firebase Crashlytics SDK-এর জন্য প্রয়োজনীয় নিয়ম রয়েছে।
যদি আপনি আপনার DexGuard সংস্করণ পরিবর্তন করতে না চান, তাহলে আপনার অস্পষ্ট নিয়মে (আপনার DexGuard কনফিগারেশন ফাইলে) নিম্নলিখিত লাইনটি যোগ করার চেষ্টা করুন:
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
অ্যান্ড্রয়েড-এনডিকে নির্দিষ্ট সহায়তা
LLVM এবং GNU টুলচেইনগুলিতে আপনার অ্যাপের বাইনারিগুলির পঠনযোগ্য অংশের জন্য আলাদা ডিফল্ট এবং চিকিত্সা রয়েছে, যা Firebase কনসোলে অসঙ্গত স্ট্যাক ট্রেস তৈরি করতে পারে। এটি কমাতে, আপনার বিল্ড প্রক্রিয়ায় নিম্নলিখিত লিঙ্কার ফ্ল্যাগগুলি যুক্ত করুন:
যদি আপনি LLVM টুলচেইন থেকে
lldলিঙ্কার ব্যবহার করেন, তাহলে যোগ করুন:-Wl,--no-rosegmentযদি আপনি GNU টুলচেইন থেকে
ld.goldলিঙ্কার ব্যবহার করেন, তাহলে যোগ করুন:-Wl,--rosegment
যদি আপনি এখনও স্ট্যাক ট্রেস অসঙ্গতি দেখতে পান (অথবা যদি কোনও পতাকাই আপনার টুলচেইনের সাথে প্রাসঙ্গিক না হয়), তাহলে পরিবর্তে আপনার বিল্ড প্রক্রিয়ায় নিম্নলিখিতগুলি যোগ করার চেষ্টা করুন:
-fno-omit-frame-pointer Crashlytics প্লাগইনটি একটি কাস্টমাইজড ব্রেকপ্যাড প্রতীক ফাইল জেনারেটরকে একত্রিত করে। যদি আপনি ব্রেকপ্যাড প্রতীক ফাইল তৈরির জন্য আপনার নিজস্ব বাইনারি ব্যবহার করতে চান (উদাহরণস্বরূপ, যদি আপনি আপনার বিল্ড চেইন থেকে উৎস থেকে সমস্ত নেটিভ এক্সিকিউটেবল তৈরি করতে চান), তাহলে এক্সিকিউটেবলের পথ নির্দিষ্ট করতে ঐচ্ছিক symbolGeneratorBinary এক্সটেনশন প্রপার্টি ব্যবহার করুন।
আপনি দুটি উপায়ের একটিতে ব্রেকপ্যাড প্রতীক ফাইল জেনারেটর বাইনারির পথ নির্দিষ্ট করতে পারেন:
বিকল্প ১ : আপনার
build.gradleফাইলেfirebaseCrashlyticsএক্সটেনশনের মাধ্যমে পথ নির্দিষ্ট করুন।আপনার অ্যাপ-লেভেল
build.gradle.ktsফাইলে নিম্নলিখিতটি যোগ করুন:গ্রেডল প্লাগইন v3.0.0+
android { buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true // Add these optional fields to specify the path to the executable symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } }
প্লাগইনের নিম্ন সংস্করণ
android { // ... buildTypes { // ... release { // ... firebaseCrashlytics { // existing; required for either symbol file generator nativeSymbolUploadEnabled true // Add this optional new block to specify the path to the executable symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } }
বিকল্প ২ : আপনার গ্র্যাডেল প্রোপার্টি ফাইলে একটি প্রোপার্টি লাইনের মাধ্যমে পথ নির্দিষ্ট করুন।
এক্সিকিউটেবলের পাথ নির্দিষ্ট করতে আপনি
com.google.firebase.crashlytics.breakpadBinaryপ্রপার্টি ব্যবহার করতে পারেন।আপনি আপনার Gradle প্রোপার্টি ফাইলটি ম্যানুয়ালি আপডেট করতে পারেন অথবা কমান্ড লাইনের মাধ্যমে ফাইলটি আপডেট করতে পারেন। উদাহরণস্বরূপ, কমান্ড লাইনের মাধ্যমে পাথ নির্দিষ্ট করতে, নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \ -Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \ app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
Firebase Crashlytics NDK ARMv5 (armeabi) সমর্থন করে না। NDK r17 থেকে এই ABI-এর সমর্থন সরিয়ে ফেলা হয়েছে।
ঐক্য সমর্থন
যদি আপনি Unity IL2CPP ব্যবহার করেন এবং আপনি অপ্রতীকী স্ট্যাক ট্রেস দেখতে পান, তাহলে নিম্নলিখিতগুলি চেষ্টা করে দেখুন:
নিশ্চিত করুন যে আপনি Crashlytics Unity SDK এর v8.6.1 বা তার উচ্চতর সংস্করণ ব্যবহার করছেন।
আপনার প্রতীক ফাইল তৈরি এবং আপলোড করার জন্য নিশ্চিত করুন যে আপনি Firebase CLI
crashlytics:symbols:uploadকমান্ডের জন্য সেট আপ এবং চালাচ্ছেন।প্রতিবার যখন আপনি একটি রিলিজ বিল্ড তৈরি করবেন অথবা Firebase কনসোলে প্রতীকী স্ট্যাক ট্রেস দেখতে চান এমন যেকোনো বিল্ড তৈরি করবেন, তখন আপনাকে এই CLI কমান্ডটি চালাতে হবে। আরও জানুন Get readable crash reports এ।
হ্যাঁ, Crashlytics আপনার IL2CPP ব্যবহারকারী অ্যাপগুলির জন্য প্রতীকী স্ট্যাক ট্রেস প্রদর্শন করতে পারে। এই ক্ষমতাটি Android বা Apple প্ল্যাটফর্মে প্রকাশিত অ্যাপগুলির জন্য উপলব্ধ। আপনাকে যা করতে হবে তা এখানে:
নিশ্চিত করুন যে আপনি Crashlytics Unity SDK এর v8.6.0 বা উচ্চতর সংস্করণ ব্যবহার করছেন।
আপনার প্ল্যাটফর্মের জন্য প্রয়োজনীয় কাজগুলি সম্পন্ন করুন:
অ্যাপল প্ল্যাটফর্ম অ্যাপের জন্য : কোনও বিশেষ পদক্ষেপের প্রয়োজন নেই। অ্যাপল প্ল্যাটফর্ম অ্যাপের জন্য, ফায়ারবেস ইউনিটি এডিটর প্লাগইন স্বয়ংক্রিয়ভাবে আপনার এক্সকোড প্রকল্পকে প্রতীক আপলোড করার জন্য কনফিগার করে।
অ্যান্ড্রয়েড অ্যাপের জন্য : আপনার প্রতীক ফাইল তৈরি এবং আপলোড করার জন্য নিশ্চিত করুন যে আপনি Firebase CLI
crashlytics:symbols:uploadকমান্ডের জন্য সেট আপ করেছেন এবং চালাচ্ছেন।প্রতিবার যখন আপনি একটি রিলিজ বিল্ড তৈরি করবেন অথবা Firebase কনসোলে প্রতীকী স্ট্যাক ট্রেস দেখতে চান এমন যেকোনো বিল্ড তৈরি করবেন, তখন আপনাকে এই CLI কমান্ডটি চালাতে হবে। আরও জানুন Get readable crash reports এ।
ধরা না পড়া ব্যতিক্রমগুলিকে মারাত্মক হিসাবে রিপোর্ট করা
Crashlytics ধরা না পড়া ব্যতিক্রমগুলিকে মারাত্মক হিসাবে রিপোর্ট করতে পারে (Unity SDK এর v10.4.0 দিয়ে শুরু)। নিম্নলিখিত FAQ গুলি এই বৈশিষ্ট্যটি ব্যবহারের যুক্তি এবং সর্বোত্তম অনুশীলনগুলি ব্যাখ্যা করতে সহায়তা করে।
ধরা না পড়া ব্যতিক্রমগুলিকে মারাত্মক হিসাবে রিপোর্ট করার মাধ্যমে, আপনি আরও বাস্তবসম্মত ইঙ্গিত পাবেন যে কোন ব্যতিক্রমগুলির ফলে গেমটি খেলা যাবে না - এমনকি যদি অ্যাপটি চলতে থাকে।
মনে রাখবেন যে আপনি যদি মারাত্মক দুর্ঘটনার প্রতিবেদন করা শুরু করেন, তাহলে আপনার ক্র্যাশ-মুক্ত ব্যবহারকারীর (CFU) শতাংশ সম্ভবত হ্রাস পাবে, তবে CFU মেট্রিক আপনার অ্যাপের সাথে শেষ ব্যবহারকারীদের অভিজ্ঞতার আরও প্রতিনিধিত্ব করবে।
Crashlytics যাতে কোনও ধরা না পড়া ব্যতিক্রমকে মারাত্মক হিসেবে রিপোর্ট করতে পারে, তার জন্য নিম্নলিখিত দুটি শর্ত অবশ্যই পূরণ করতে হবে:
আপনার অ্যাপে ইনিশিয়ালাইজেশনের সময়,
ReportUncaughtExceptionsAsFatalপ্রোপার্টিটিtrueতে সেট করতে হবে ।আপনার অ্যাপ (অথবা অন্তর্ভুক্ত লাইব্রেরি) এমন একটি ব্যতিক্রম দেয় যা ধরা পড়ে না। এমন একটি ব্যতিক্রম যা তৈরি করা হয়েছে, কিন্তু থ্রো করা হয়নি , তাকে ধরা হয়নি বলে মনে করা হয়।
যখন আপনি আপনার ধরা না পড়া ব্যতিক্রমগুলিকে মারাত্মক হিসাবে রিপোর্ট পেতে শুরু করেন, তখন এই ধরা না পড়া ব্যতিক্রমগুলি পরিচালনা করার জন্য এখানে কিছু বিকল্প রয়েছে:
- এই অধরা ব্যতিক্রমগুলিকে কীভাবে ধরা এবং পরিচালনা করা শুরু করবেন তা বিবেচনা করুন।
- ইউনিটি ডিবাগ কনসোল এবং Crashlytics ব্যতিক্রম লগ করার জন্য বিভিন্ন বিকল্প বিবেচনা করুন।
থ্রো করা ব্যতিক্রমগুলি ধরুন এবং পরিচালনা করুন
অপ্রত্যাশিত বা ব্যতিক্রমী অবস্থা প্রতিফলিত করার জন্য ব্যতিক্রমগুলি তৈরি এবং নিক্ষেপ করা হয়। একটি নিক্ষেপিত ব্যতিক্রম দ্বারা প্রতিফলিত সমস্যাগুলি সমাধান করার জন্য প্রোগ্রামটিকে একটি পরিচিত অবস্থায় ফিরিয়ে আনা জড়িত (একটি প্রক্রিয়া যা ব্যতিক্রম হ্যান্ডলিং নামে পরিচিত)।
প্রোগ্রামটিকে একটি পরিচিত অবস্থায় ফিরিয়ে আনা না গেলে, সমস্ত পূর্বাভাসিত ব্যতিক্রমগুলি ধরা এবং পরিচালনা করা সর্বোত্তম অনুশীলন।
কোন ধরণের ব্যতিক্রম ধরা পড়বে এবং কোন কোড দ্বারা পরিচালিত হবে তা নিয়ন্ত্রণ করতে, try-catch ব্লকে এমন কোড মোড়ানো হবে যা ব্যতিক্রম তৈরি করতে পারে । নিশ্চিত করুন যে catch বিবৃতিতে শর্তগুলি যতটা সম্ভব সংকীর্ণ যাতে নির্দিষ্ট ব্যতিক্রমগুলি যথাযথভাবে পরিচালনা করা যায়।
ইউনিটি বা Crashlytics ব্যতিক্রম লগ করুন
সমস্যাটি ডিবাগ করতে সাহায্য করার জন্য ইউনিটি বা Crashlytics ব্যতিক্রম রেকর্ড করার একাধিক উপায় রয়েছে।
Crashlytics ব্যবহার করার সময়, এখানে দুটি সবচেয়ে সাধারণ এবং প্রস্তাবিত বিকল্প রয়েছে:
বিকল্প ১: ইউনিটি কনসোলে প্রিন্ট করুন, কিন্তু ডেভেলপমেন্ট বা সমস্যা সমাধানের সময় Crashlytics এ রিপোর্ট করবেন না।
-
Debug.Log(exception),Debug.LogWarning(exception), এবংDebug.LogError(exception)ব্যবহার করে Unity কনসোলে প্রিন্ট করুন যা ব্যতিক্রমের বিষয়বস্তু ইউনিটি কনসোলে প্রিন্ট করে এবং ব্যতিক্রমটি পুনরায় থ্রো করে না।
-
বিকল্প ২: নিম্নলিখিত পরিস্থিতিতে Crashlytics ড্যাশবোর্ডে একত্রিত প্রতিবেদনের জন্য Crashlytics এ আপলোড করুন:
- যদি কোনও ব্যতিক্রম লগিং করে পরবর্তী কোনও সম্ভাব্য Crashlytics ইভেন্ট ডিবাগ করার যোগ্য হয়, তাহলে
Crashlytics.Log(exception.ToString())ব্যবহার করুন। - যদি ধরা পড়া এবং পরিচালনা করা সত্ত্বেও কোনও ব্যতিক্রম Crashlytics কে রিপোর্ট করা হয়, তাহলে
Crashlytics.LogException(exception)ব্যবহার করে এটিকে একটি অ-মারাত্মক ঘটনা হিসেবে লগ করুন।
- যদি কোনও ব্যতিক্রম লগিং করে পরবর্তী কোনও সম্ভাব্য Crashlytics ইভেন্ট ডিবাগ করার যোগ্য হয়, তাহলে
তবে, যদি আপনি ইউনিটি ক্লাউড ডায়াগনস্টিকসে কোনও মারাত্মক ঘটনা ম্যানুয়ালি রিপোর্ট করতে চান, তাহলে আপনি Debug.LogException ব্যবহার করতে পারেন। এই বিকল্পটি অপশন ১ এর মতো ইউনিটি কনসোলে ব্যতিক্রমটি প্রিন্ট করে, তবে এটি ব্যতিক্রমটিও ছুঁড়ে ফেলে (এটি এখনও ছুঁড়ে ফেলা হয়েছে বা ধরা হয়েছে কিনা)। এটি স্থানীয়ভাবে ত্রুটিটি ছুঁড়ে ফেলে। এর অর্থ হল, এমনকি try-catch ব্লক সহ একটি Debug.LogException(exception) এর ফলেও একটি uncauted ব্যতিক্রম দেখা যায়।
অতএব, যদি আপনি নিম্নলিখিত সমস্ত কিছু করতে চান তবেই Debug.LogException কল করুন:
- ইউনিটি কনসোলে ব্যতিক্রমটি প্রিন্ট করতে।
- একটি মারাত্মক ঘটনা হিসেবে Crashlytics এ ব্যতিক্রমটি আপলোড করার জন্য।
- ব্যতিক্রমটি বাদ দেওয়ার জন্য, এটিকে একটি অধরা ব্যতিক্রম হিসেবে বিবেচনা করা হোক এবং এটি ইউনিটি ক্লাউড ডায়াগনস্টিকসকে রিপোর্ট করা হোক।
মনে রাখবেন, যদি আপনি ইউনিটি কনসোলে একটি ধরা পড়া ব্যতিক্রম প্রিন্ট করতে চান এবং একটি অ-মারাত্মক ইভেন্ট হিসাবে Crashlytics এ আপলোড করতে চান, তাহলে পরিবর্তে নিম্নলিখিতগুলি করুন:
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}