এই পৃষ্ঠা থেকে Crashlytics ব্যবহার করা সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্নের উত্তর ও সমস্যার সমাধান সংক্রান্ত সহায়তা পাবেন। আপনি যা খুঁজছেন তা খুঁজে না পেলে অথবা অতিরিক্ত সহায়তার প্রয়োজন হলে, Firebase সহায়তা টিমের সাথে যোগাযোগ করুন।
এই পৃষ্ঠায়, আপনি নিম্নলিখিত ধরনের বিষয় সম্পর্কে তথ্য পাবেন:
সাধারণ সমস্যা সমাধান, যার মধ্যে রয়েছে ডেটা ডিসপ্লে করা বা Firebase কনসোলে ডেটা নিয়ে কাজ করা সংক্রান্ত প্রশ্ন এবং আগের অবস্থায় ফিরে যাওয়া সমস্যা সংক্রান্ত প্রশ্ন।
প্ল্যাটফর্ম-নির্দিষ্ট সহায়তা, যার মধ্যে Apple প্ল্যাটফর্ম, Android এবং Unity-এর জন্য নির্দিষ্ট প্রশ্ন অন্তর্ভুক্ত।
ইন্টিগ্রেশন সাপোর্ট, যার মধ্যে BigQuery সম্পর্কিত প্রশ্ন পড়ে।
সাধারণ সমস্যা সমাধান/প্রায়শই জিজ্ঞাসিত প্রশ্ন
সমস্যা সারণীতে কিছু সমস্যার জন্য আলাদা ফর্ম্যাট (এবং কখনও কখনও "ভেরিয়েন্ট") দেখতে পাওয়া
Firebase কনসোলে আপনার সমস্যা সারণীতে তালিকাভুক্ত সমস্যার জন্য আপনি দুটি আলাদা ফর্ম্যাট দেখতে পেতে পারেন। এছাড়াও, আপনি হয়ত কিছু সমস্যার মধ্যে "ভেরিয়েন্ট" নামের একটি ফিচার দেখতে পাবেন। এর কারণ এখানে দেওয়া হল!
২০২৩ সালের শুরুতে, আমরা ইভেন্টগুলিকে গ্রুপ করার জন্য একটি উন্নত বিশ্লেষণ ইঞ্জিন প্রকাশ করেছি। এর পাশাপাশি, নতুন সমস্যার জন্য আপডেট করা ডিজাইন এবং কিছু উন্নত ফিচার (যেমন ভেরিয়েন্ট!) প্রকাশ করেছি। সব বিবরণ জানতে আমাদের সাম্প্রতিক ব্লগ পোস্ট চেক করে দেখুন, তবে নিচে হাইলাইটগুলি পড়তে পারেন।
Crashlytics আপনার অ্যাপের সমস্ত ইভেন্ট (যেমন, ক্র্যাশ, নন-ফ্যাটাল, এবং ANR) বিশ্লেষণ করে এবং সমস্যা নামের ইভেন্টের গ্রুপ তৈরি করে — কোনও সমস্যার মধ্যে থাকা সব ইভেন্টের ব্যর্থতার একটি সাধারণ পয়েন্ট থাকে।
এইসব সমস্যার মধ্যে ইভেন্টগুলিকে গ্রুপ করতে, উন্নত অ্যানালিসিস ইঞ্জিন এখন ইভেন্টের বিভিন্ন দিক দেখে, যার মধ্যে স্ট্যাক ট্রেসে থাকা ফ্রেম, ব্যতিক্রমী মেসেজ, এরর কোড এবং অন্যান্য প্ল্যাটফর্ম বা সমস্যার ধরন সংক্রান্ত বৈশিষ্ট্য অন্তর্ভুক্ত।
তবে, ইভেন্টের এই গ্রুপের মধ্যে, ব্যর্থতার কারণ হওয়া স্ট্যাক ট্রেস আলাদা হতে পারে। আলাদা স্ট্যাক ট্রেস মানে আলাদা মূল কারণ। কোনও সমস্যার মধ্যে এই সম্ভাব্য পার্থক্যকে উপস্থাপন করতে, আমরা এখন সমস্যার মধ্যে ভেরিয়েন্ট তৈরি করি - প্রতিটি ভেরিয়েন্ট হল কোনও সমস্যার মধ্যে থাকা ইভেন্টের সাব-গ্রুপ যেগুলির একই ব্যর্থতার পয়েন্ট এবং একই ধরনের স্ট্যাক ট্রেস আছে। ভেরিয়েন্টের সাহায্যে, আপনি কোনও সমস্যার মধ্যে সবচেয়ে সাধারণ স্ট্যাক ট্রেস ডিবাগ করতে এবং বিভিন্ন মূল কারণের জন্য সমস্যা হচ্ছে কিনা তা নির্ধারণ করতে পারবেন।
এইসব উন্নতির ফলে আপনি যা অভিজ্ঞতা পাবেন তা এখানে দেওয়া হল:
সমস্যার সারিতে দেখানো নতুন মেটাডেটা
আপনার অ্যাপে সমস্যা বোঝা ও সেগুলিকে অগ্রাধিকারের ভিত্তিতে সাজানো এখন আরও সহজ।কম ডুপ্লিকেট সমস্যা
লাইন নম্বর পরিবর্তন করলে নতুন কোনও সমস্যা হয় না।বিভিন্ন মূল কারণ সহ জটিল সমস্যা সহজে ডিবাগ করা
কোনও সমস্যার মধ্যে সবচেয়ে সাধারণ স্ট্যাক ট্রেস ডিবাগ করতে ভ্যারিয়েন্ট ব্যবহার করুন।আরও অর্থপূর্ণ অ্যালার্ট ও সিগন্যাল
নতুন সমস্যা আসলে নতুন বাগকেই বোঝায়।আরও শক্তিশালী সার্চ
প্রতিটি সমস্যার মধ্যে আরও বেশি সার্চ করা যায় এমন মেটাডেটা থাকে, যেমন ব্যতিক্রমের ধরন ও প্যাকেজের নাম।
এইসব উন্নতি কীভাবে প্রকাশ করা হচ্ছে তা এখানে দেওয়া হল:
আপনার অ্যাপ থেকে নতুন ইভেন্ট পেলে, আমরা চেক করে দেখব যে সেগুলি আগে থেকে থাকা সমস্যার সাথে ম্যাচ করছে কিনা।
কোনও মিল না থাকলে, আমরা ইভেন্টে অটোমেটিক আমাদের আরও স্মার্ট ইভেন্ট-গ্রুপিং অ্যালগরিদম প্রয়োগ করব এবং নতুন করে সাজানো মেটাডেটা ডিজাইন সহ একটি নতুন সমস্যা তৈরি করব।
আমাদের ইভেন্ট গ্রুপিংয়ে এটিই প্রথম বড় আপডেট। আপনার মতামত থাকলে বা কোনও সমস্যা হলে, আমাদের রিপোর্ট জমা দিয়ে জানান।
ব্রেডক্রাম্ব লগ দেখতে না পাওয়া
আপনি ব্রেডক্রাম্ব লগ দেখতে না পেলে (iOS+ | Android | Flutter | Unity), আমরা সাজেস্ট করি যে Google Analytics-এর জন্য আপনার অ্যাপের কনফিগারেশন চেক করুন। নিচে উল্লেখ করা প্রয়োজনীয়তা পূরণ করেছেন কিনা তা ভালোভাবে দেখে নিন:
আপনার Firebase প্রোজেক্টে চালু করেছেন Google Analytics ।
আপনি Google Analytics-এর জন্য ডেটা শেয়ারিং চালু করেছেন। এই সেটিংস সম্পর্কে আরও জানতে আপনার Analytics ডেটা শেয়ারিং সেটিংস ম্যানেজ করুন
আপনি নিজের অ্যাপে Google Analytics-এর জন্য Firebase SDK যোগ করেছেন: iOS+ | Android | Flutter | Unity.
Crashlytics SDK-এর পাশাপাশি এই SDK যোগ করতে হবে।আপনার অ্যাপে ব্যবহার করা সব প্রোডাক্টের জন্য আপনি লেটেস্ট Firebase SDK ভার্সন ব্যবহার করছেন (iOS+ | Android | Flutter | Unity)।
Apple প্ল্যাটফর্ম ও Android অ্যাপের জন্য, বিশেষ করে চেক করে দেখুন যে আপনি অন্তত নিম্নলিখিত ভার্সনের Firebase SDK for Google Analytics ব্যবহার করছেন:
iOS+ — v6.3.1+ (macOS ও tvOS-এর জন্য v8.9.0+) |Android — v17.2.3+ (BoM v24.7.1+) .
ভেলোসিটি অ্যালার্ট দেখতে না পাওয়া
আপনি ভেলোসিটি অ্যালার্ট দেখতে না পেলে, নিশ্চিত করুন যে আপনি ব্যবহার করছেন।
ক্র্যাশ-ফ্রি মেট্রিক দেখতে না পাওয়া (অথবা বিশ্বাসযোগ্য নয় এমন মেট্রিক দেখতে পাওয়া)
আপনি ক্র্যাশ-ফ্রি মেট্রিক (যেমন, ক্র্যাশ-ফ্রি ব্যবহারকারী ও সেশন) দেখতে না পেলে অথবা অনির্ভরযোগ্য মেট্রিক দেখতে পেলে, নিম্নলিখিত বিষয়গুলি চেক করুন:
আপনি যে ব্যবহার করছেন তা নিশ্চিত করুন।
আপনার ডেটা সংগ্রহ সংক্রান্ত সেটিংস যেন ক্র্যাশ-ফ্রি মেট্রিকের কোয়ালিটির উপর প্রভাব না ফেলে তা নিশ্চিত করুন:
আপনি অটোমেটিক ক্র্যাশ রিপোর্টিং বন্ধ করে অপ্ট-ইন রিপোর্টিং চালু করলে, Crashlytics-এ শুধুমাত্র সেইসব ব্যবহারকারীর থেকে ক্র্যাশ সংক্রান্ত তথ্য পাঠানো যাবে যারা ডেটা সংগ্রহ করার জন্য স্পষ্টভাবে অপ্ট-ইন করেছেন। তাই, ক্র্যাশ-ফ্রি মেট্রিক্সের নির্ভুলতা প্রভাবিত হবে, কারণ Crashlytics শুধুমাত্র এইসব অপ্ট-ইন ব্যবহারকারীদের থেকে ক্র্যাশ সংক্রান্ত তথ্য পায় (আপনার সব ব্যবহারকারীদের থেকে নয়)। এর অর্থ হল, আপনার ক্র্যাশ-ফ্রি মেট্রিক কম নির্ভরযোগ্য হতে পারে এবং আপনার অ্যাপের সামগ্রিক স্থিতিশীলতা কম দেখাতে পারে।
আপনার অটোমেটিক ডেটা সংগ্রহ করার সুবিধা বন্ধ করা থাকলে, আপনি
sendUnsentReportsব্যবহার করে ডিভাইসে ক্যাশে করা রিপোর্ট Crashlytics-এ পাঠাতে পারবেন। এই পদ্ধতি ব্যবহার করলে Crashlytics-এ ক্র্যাশ ডেটা পাঠানো হবে, কিন্তু সেশন ডেটা পাঠানো হবে না, এর ফলে কনসোল চার্টে ক্র্যাশ-ফ্রি মেট্রিকের জন্য কম বা শূন্য ভ্যালু দেখানো হবে।
ক্র্যাশ-ফ্রি ব্যবহারকারীর সংখ্যা কীভাবে গণনা করা হয়?
ক্র্যাশ-ফ্রি মেট্রিক বোঝা দেখুন।
কোনও সমস্যার উপর কে নোট দেখতে, লিখতে ও মুছে দিতে পারবেন?
নোটের মাধ্যমে প্রোজেক্টের মেম্বাররা নির্দিষ্ট সমস্যা সম্পর্কে প্রশ্ন, স্ট্যাটাস আপডেট ইত্যাদি কমেন্ট করতে পারেন।
প্রোজেক্ট মেম্বার কোনও নোট পোস্ট করলে, সেটি তার Google অ্যাকাউন্টের ইমেল আইডি দিয়ে লেবেল করা হয়। এই ইমেল আইডি, নোট সহ, সেইসব প্রোজেক্ট মেম্বারদের কাছে দৃশ্যমান হবে যাদের নোট দেখার অ্যাক্সেস আছে।
নোট দেখার, লেখার ও মুছে ফেলার জন্য প্রয়োজনীয় অ্যাক্সেস সম্পর্কে নিচে বর্ণনা করা হল:
প্রোজেক্ট মেম্বারদের নিম্নলিখিত যেকোনও ভূমিকা থাকলে, তারা আগে থেকে থাকা নোট দেখতে ও মুছে দিতে এবং কোনও সমস্যার উপর নতুন নোট লিখতে পারবেন।
- প্রোজেক্টের মালিক বা এডিটর, Firebase অ্যাডমিন, কোয়ালিটি অ্যাডমিন, বা Crashlytics অ্যাডমিন
নিম্নলিখিত যেকোনও ভূমিকা সহ প্রোজেক্ট মেম্বাররা কোনও সমস্যার উপর পোস্ট করা নোট দেখতে পাবেন, তবে তারা কোনও নোট মুছে ফেলতে বা লিখতে পারবেন না।
- প্রোজেক্ট ভিউয়ার, Firebase ভিউয়ার, কোয়ালিটি ভিউয়ার, বা Crashlytics ভিউয়ার
রিগ্রেসড সমস্যা কী?
আপনি আগে কোনও সমস্যা বন্ধ করে দেওয়ার পরে Crashlytics যদি সেই সমস্যা আবার হয়েছে বলে নতুন রিপোর্ট পায়, তাহলে সেই সমস্যাটি রিগ্রেশন হয়েছে বলে ধরে নেওয়া হয়। Crashlytics অটোমেটিক এইসব রিগ্রেস করা সমস্যা আবার খুলে দেয় যাতে আপনি আপনার অ্যাপের জন্য উপযুক্তভাবে সেগুলির সমাধান করতে পারেন।
Crashlytics কীভাবে কোনও সমস্যাকে রিগ্রেশন হিসেবে শ্রেণীবদ্ধ করে তা ব্যাখ্যা করে এমন একটি উদাহরণমূলক পরিস্থিতি এখানে দেওয়া হল:
- এই প্রথমবার, Crashlytics Crash "A" সংক্রান্ত ক্র্যাশ রিপোর্ট পেয়েছে। Crashlytics সেই ক্র্যাশ সংক্রান্ত সমস্যা (সমস্যা "ক") খুলে দেয়।
- আপনি দ্রুত এই বাগটি ঠিক করেন, "ক" সমস্যাটি বন্ধ করেন এবং তারপরে আপনার অ্যাপের একটি নতুন ভার্সন রিলিজ করেন।
- আপনি সমস্যাটি বন্ধ করে দেওয়ার পরে Crashlytics "ক" সমস্যা সম্পর্কে আরেকটি অভিযোগ পায়।
- আপনি যখন সমস্যাটি বন্ধ করেছিলেন, তখন যদি রিপোর্টটি এমন একটি অ্যাপ ভার্সন থেকে আসে যা Crashlytics জানত (এর অর্থ হল, ভার্সনটি যেকোনও ক্র্যাশ সংক্রান্ত রিপোর্ট পাঠিয়েছে), তাহলে Crashlytics সমস্যাটিকে রিগ্রেসড হিসেবে বিবেচনা করবে না। সমস্যাটি বন্ধ করা থাকবে।
- আপনি যখন সমস্যাটি বন্ধ করেছিলেন, তখন যদি রিপোর্টটি এমন কোনও অ্যাপ ভার্সন থেকে আসে যা Crashlytics জানত না সম্পর্কে (এর অর্থ হল, ভার্সনটি কোনও ক্র্যাশের জন্য কখনও কোনও ক্র্যাশ রিপোর্ট পাঠায়নি), তাহলে Crashlytics সমস্যাটি রিগ্রেসড হিসেবে বিবেচনা করে এবং সমস্যাটি আবার খুলে দেবে।
কোনও সমস্যা রিগ্রেস করলে, আমরা রিগ্রেশন শনাক্তকরণ সংক্রান্ত সতর্কতা পাঠাই এবং সমস্যাটি যে Crashlytics আবার খুলেছে তা আপনাকে জানাতে সমস্যাটিতে একটি রিগ্রেশন সিগন্যাল যোগ করি। আমাদের রিগ্রেশন অ্যালগরিদমের কারণে কোনও সমস্যা আবার খোলা হোক, তা আপনি না চাইলে, সেটি বন্ধ না করে "মিউট" করে দিন।
আমি কেন অ্যাপের পুরনো ভার্সনে রিগ্রেশন সংক্রান্ত সমস্যা দেখতে পাচ্ছি?
আপনি সমস্যা বন্ধ করার সময়, কোনও ক্র্যাশ রিপোর্ট না পাঠানো পুরনো অ্যাপ ভার্সন থেকে রিপোর্ট পেলে, Crashlytics সমস্যাটি রিগ্রেশন হিসেবে বিবেচনা করে আবার খুলে দেবে।
নিম্নলিখিত পরিস্থিতিতে এটি হতে পারে: আপনি একটি বাগ ঠিক করেছেন এবং আপনার অ্যাপের একটি নতুন ভার্সন রিলিজ করেছেন, কিন্তু এখনও আপনার কাছে এমন ব্যবহারকারী আছেন যারা বাগ ঠিক করা হয়নি এমন আগের ভার্সন ব্যবহার করছেন। যদি, কোনওভাবে, সেইসব আগের ভার্সনের মধ্যে কোনও একটি, আপনি সমস্যা বন্ধ করার সময় কখনও কোনও ক্র্যাশ রিপোর্ট না পাঠিয়ে থাকে এবং সেইসব ব্যবহারকারী যদি বাগটি দেখতে পান, তাহলে সেইসব ক্র্যাশ রিপোর্ট একটি রিগ্রেসড সমস্যা ট্রিগার করবে।
আমাদের রিগ্রেশন অ্যালগরিদমের কারণে কোনও সমস্যা আবার খুলে যাক, তা আপনি না চাইলে, সেটি বন্ধ না করে "মিউট" করে দিন।
প্ল্যাটফর্ম-নির্দিষ্ট সহায়তা
নিম্নলিখিত বিভাগগুলি প্ল্যাটফর্ম-নির্দিষ্ট সমস্যা সমাধান ও প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী সম্পর্কে সহায়তা প্রদান করে: iOS+ | Android | Unity.
Apple প্ল্যাটফর্ম সংক্রান্ত সহায়তা
dSYM ফাইল আপলোড করা যাচ্ছে না/খুঁজে পাওয়া যাচ্ছে না
আপনার প্রোজেক্টের dSYMs আপলোড করতে এবং ভার্বোজ আউটপুট পেতে, নিম্নলিখিত বিষয়গুলি চেক করুন:
আপনার প্রোজেক্টের বিল্ড ফেজে Crashlytics রান স্ক্রিপ্ট আছে কিনা তা নিশ্চিত করুন, যা Xcode-কে বিল্ড করার সময় আপনার প্রোজেক্টের dSYMs আপলোড করতে দেয় (স্ক্রিপ্ট যোগ করার নির্দেশাবলী পেতে ইনিশিয়ালাইজ করা Crashlytics লিঙ্কটি দেখুন)। আপনার প্রোজেক্ট আপডেট করার পরে, ক্র্যাশ জোর করে ঘটান এবং কনফার্ম করুন যে ক্র্যাশটি Crashlytics ড্যাশবোর্ডে দেখা যাচ্ছে।
Firebase কনসোলে "dSYM নেই" অ্যালার্ট দেখতে পেলে, Xcode চেক করে দেখে নিন যে এটি বিল্ডের জন্য dSYM সঠিকভাবে তৈরি করছে কিনা।
Xcode যদি সঠিকভাবে dSYMs তৈরি করে এবং আপনি এখনও dSYMs দেখতে না পান, তাহলে সম্ভবত রান স্ক্রিপ্ট টুল dSYMs আপলোড করার সময় আটকে যাচ্ছে। এই ক্ষেত্রে, নিম্নলিখিত প্রতিটি পদ্ধতি ব্যবহার করে দেখুন:
আপনি Crashlytics-এর লেটেস্ট ভার্সন ব্যবহার করছেন কিনা তা নিশ্চিত করুন।
না থাকা dSYM ফাইল ম্যানুয়ালি আপলোড করুন:
- বিকল্প ১: অনুপস্থিত dSYM ফাইল সহ zip আর্কাইভ আপলোড করতে, dSYMs ট্যাবে কনসোল-ভিত্তিক "ড্র্যাগ অ্যান্ড ড্রপ" বিকল্প ব্যবহার করুন।
- বিকল্প ২: dSYMs
ট্যাবে দেওয়া UUID-এর জন্য, অনুপস্থিত dSYM ফাইল আপলোড করতে
upload-symbolsস্ক্রিপ্ট ব্যবহার করুন।
আপনি যদি এখনও dSYM ফাইল দেখতে না পান বা আপলোড এখনও সফল না হয়, Firebase সহায়তা টিমের সাথে যোগাযোগ করুন এবং আপনার লগ অন্তর্ভুক্ত করতে ভুলবেন না।
ক্র্যাশগুলি সঠিকভাবে সিম্বোলাইজ করা হয়নি
আপনার স্ট্যাক ট্রেস ঠিকমতো সিম্বলিক করা না হলে, নিম্নলিখিত বিষয়গুলি চেক করুন:
আপনার অ্যাপের লাইব্রেরির ফ্রেমের মধ্যে আপনার অ্যাপের কোডের রেফারেন্স না থাকলে, নিশ্চিত করুন যে
কম্পাইলেশন ফ্ল্যাগ হিসেবে সেট করা নেই।-fomit-frame-pointerআপনার অ্যাপের লাইব্রেরির জন্য একাধিক
(Missing)ফ্রেম দেখতে পেলে, Firebase কনসোলের Crashlytics dSYMs ট্যাবে দেখুন যে সেখানে কোনও ঐচ্ছিক dSYMs অনুপস্থিত হিসেবে তালিকাভুক্ত করা আছে কিনা (প্রভাবিত অ্যাপ ভার্সনের জন্য)। যদি তাই হয়, তাহলে এই পৃষ্ঠায় dSYMs পাওয়া যাচ্ছে না/আপলোড হচ্ছে না সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্ন থেকে "dSYM পাওয়া যাচ্ছে না সংক্রান্ত সতর্কতা" সমস্যার সমাধান সংক্রান্ত ধাপ অনুসরণ করুন। মনে রাখবেন, এই dSYM আপলোড করলে, আগে হওয়া ক্র্যাশ সিম্বলিক্যাট করা যাবে না, তবে এটি ভবিষ্যতে হওয়া ক্র্যাশ সিম্বলিক্যাট করতে সাহায্য করবে।
আমি কি macOS বা tvOS-এর জন্য Crashlytics ব্যবহার করতে পারব?
হ্যাঁ, আপনি macOS এবং tvOS প্রোজেক্টে Crashlytics প্রয়োগ করতে পারবেন। Google Analytics-এর জন্য Firebase SDK-এর v8.9.0+ ভার্সন অন্তর্ভুক্ত করতে ভুলবেন না, যাতে ক্র্যাশ Google Analytics-এর (ক্র্যাশ-ফ্রি ব্যবহারকারী, লেটেস্ট রিলিজ, ভেলোসিটি অ্যালার্ট ও ব্রেডক্রাম্ব লগ) সংগ্রহ করা মেট্রিক্স অ্যাক্সেস করতে পারে।
আমি কি একাধিক অ্যাপ সহ Firebase প্রোজেক্টে Crashlytics ব্যবহার করতে পারি, যেগুলি আলাদা আলাদা Apple প্ল্যাটফর্মে চলে?
আপনি এখন একটি Firebase প্রোজেক্টে একাধিক অ্যাপের ক্র্যাশ রিপোর্ট করতে পারবেন, এমনকি অ্যাপগুলি আলাদা আলাদা Apple প্ল্যাটফর্মের জন্য তৈরি করা হলেও (যেমন, iOS, tvOS এবং Mac Catalyst)। আগে, একই বান্ডেল আইডি থাকলে আপনাকে অ্যাপগুলিকে আলাদা Firebase প্রোজেক্টে ভাগ করতে হত।
Android সহায়তা
Android 11+ ভার্সনের জন্য কেন শুধু ANR রিপোর্ট করা হয়?
Crashlytics Android 11 ও তার পরবর্তী যেকোনও ভার্সনে চলে এমন ডিভাইস থেকে Android অ্যাপের জন্য ANR রিপোর্টিং কাজ করে। ANR সংগ্রহ করার জন্য আমরা যে অন্তর্নিহিত API ব্যবহার করি (getHistoricalProcessExitReasons) তা SIGQUIT বা ওয়াচডগ-ভিত্তিক পদ্ধতির চেয়ে বেশি নির্ভরযোগ্য। এই API শুধুমাত্র Android 11+ ডিভাইসে উপলভ্য।
কিছু ANR-এর BuildId কেন নেই
?
আপনার কিছু ANR-এর BuildIds না থাকলে, নিম্নলিখিতভাবে সমস্যার সমাধান করুন:
আপ-টু-ডেট Crashlytics Android SDK এবং Crashlytics Gradle প্লাগ-ইন ভার্সন ব্যবহার করছেন কিনা তা নিশ্চিত করুন।
আপনি যদি Android 11-এর জন্য
BuildIds এবং কিছু Android 12 ANR মিস করে থাকেন, তাহলে সম্ভবত আপনি একটি পুরানো SDK, Gradle প্লাগ-ইন বা দুটিই ব্যবহার করছেন। এইসব ANR-এর জন্য সঠিকভাবেBuildIds সংগ্রহ করতে, আপনাকে নিম্নলিখিত ভার্সন ব্যবহার করতে হবে:- Crashlytics Android SDK v18.3.5+ (Firebase BoM v31.2.2+)
- Crashlytics Gradle প্লাগ-ইন v2.9.4+
আপনার শেয়ার করা লাইব্রেরির জন্য আপনি কোনও নন-স্ট্যান্ডার্ড লোকেশন ব্যবহার করছেন কিনা তা চেক করুন।
আপনার অ্যাপের শেয়ার করা লাইব্রেরির জন্য
BuildIds মিস করলে, এটি সম্ভবত শেয়ার করা লাইব্রেরির জন্য স্ট্যান্ডার্ড, ডিফল্ট লোকেশন ব্যবহার করছেন না। যদি এমনটি হয়, তাহলে Crashlytics হয়ত সংশ্লিষ্টBuildIds লোকেট করতে পারবে না। আমরা সাজেস্ট করি যে শেয়ার করা লাইব্রেরির জন্য স্ট্যান্ডার্ড লোকেশন ব্যবহার করার কথা বিবেচনা করুন।বিল্ড প্রসেস চলাকালীন
BuildIds সরিয়ে দিচ্ছেন না তো, তা নিশ্চিত করুন।মনে রাখবেন, সমস্যা সমাধানের জন্য নিচে দেওয়া পরামর্শগুলি ANR ও নেটিভ ক্র্যাশ, দু'টির ক্ষেত্রেই প্রযোজ্য।
আপনার বাইনারিতে
readelf -nরান করিয়েBuildIds আছে কিনা তা চেক করুন।BuildIds না থাকলে, আপনার বিল্ড সিস্টেমের জন্য ফ্ল্যাগে-Wl,--build-idযোগ করুন।APK-এর সাইজ কমানোর চেষ্টা করতে গিয়ে আপনি অজান্তেই
BuildIdসরিয়ে দিচ্ছেন কিনা তা চেক করে দেখুন।আপনি যদি কোনও লাইব্রেরির স্ট্রিপ করা এবং স্ট্রিপ না করা ভার্সন রাখেন, তাহলে আপনার কোডে সঠিক ভার্সনটি উল্লেখ করতে ভুলবেন না।
Crashlytics ড্যাশবোর্ড এবং Google Play Console-এ ANR রিপোর্ট দুটির মধ্যে পার্থক্য
Google Play এবং Crashlytics-এর মধ্যে ANR-এর সংখ্যায় অমিল থাকতে পারে। ANR ডেটা সংগ্রহ ও রিপোর্ট করার পদ্ধতির পার্থক্যের কারণে এটি প্রত্যাশিত। Crashlytics অ্যাপ পরের বার চালু হলে ANR রিপোর্ট করে, যেখানে Android Vitals ANR হওয়ার পরে ANR ডেটা পাঠায়।
এছাড়াও, Crashlytics Google Play-এর তুলনায়, শুধুমাত্র Android 11+ ভার্সনে চলা ডিভাইসে হওয়া ANR দেখায়, Google Play Google Play পরিষেবা ও ডেটা সংগ্রহ করার সম্মতি গ্রহণ করা ডিভাইস থেকে ANR দেখায়।
আমি কেন .java সমস্যা হিসেবে লেবেল করা .kt ফাইল থেকে ক্র্যাশ
দেখতে পাচ্ছি?
কোনও অ্যাপ এমন কোনও অবফাসকেটর ব্যবহার করলে যা ফাইল এক্সটেনশন প্রকাশ করে না,
Crashlytics ডিফল্ট হিসেবে .java ফাইল এক্সটেনশন সহ প্রতিটি সমস্যা জেনারেট করে।
যাতে Crashlytics সঠিক ফাইল এক্সটেনশন সহ সমস্যা তৈরি করতে পারে, আপনার অ্যাপ নিম্নলিখিত সেট-আপ ব্যবহার করছে কিনা তা নিশ্চিত করুন:
- Android Gradle 4.2.0 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করে
- অফস্কেশন চালু করে R8 ব্যবহার করে। আপনার অ্যাপকে R8-এ আপডেট করতে, এই ডকুমেন্টেশন অনুসরণ করুন।
মনে রাখবেন, উপরে বর্ণিত সেট-আপে আপডেট করার পরে, আপনি হয়ত
নতুন .kt সমস্যা দেখতে পেতে পারেন যা আগে থেকে থাকা .java সমস্যার ডুপ্লিকেট। সেই পরিস্থিতি সম্পর্কে আরও জানতে
প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।
আমি কেন
.kt এমন সমস্যা দেখতে পাচ্ছি যা আগে থেকেই থাকা
.java সমস্যার ডুপ্লিকেট?
২০২১ সালের ডিসেম্বর মাসের মাঝামাঝি থেকে, Kotlin ব্যবহার করে এমন Crashlyticsঅ্যাপ্লিকেশনের জন্য উন্নত সহায়তা উপলভ্য।
সম্প্রতি পর্যন্ত, উপলভ্য অবফাসকেটর ফাইল এক্সটেনশন প্রকাশ করত না, তাই
Crashlytics ডিফল্ট হিসেবে .java ফাইল এক্সটেনশন সহ প্রতিটি সমস্যা তৈরি করত।
তবে, Android Gradle 4.2.0 থেকে, R8 ফাইল এক্সটেনশন সাপোর্ট করে।
এই আপডেটের মাধ্যমে, Crashlytics এখন নির্ধারণ করতে পারবে যে অ্যাপের মধ্যে ব্যবহৃত প্রতিটি ক্লাস
Kotlin-এ লেখা হয়েছে কিনা এবং সমস্যার
সিগনেচারে সঠিক ফাইলের নাম অন্তর্ভুক্ত করতে পারবে। আপনার অ্যাপে নিম্নলিখিত সেট-আপ থাকলে, ক্র্যাশ এখন সঠিকভাবে .kt ফাইলে (যেমন উপযুক্ত)
অ্যাট্রিবিউট করা হয়:
- আপনার অ্যাপ Android Gradle 4.2.0 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করে।
- আপনার অ্যাপে R8 ব্যবহার করা হয় এবং তাতে অবফাসকেশন চালু করা আছে।
যেহেতু নতুন ক্র্যাশ এখন তাদের সমস্যা
সিগনেচারে সঠিক ফাইল এক্সটেনশন অন্তর্ভুক্ত করে, তাই আপনি নতুন .kt সমস্যা দেখতে পেতে পারেন যা আসলে আগে থেকে থাকা .java-লেবেলযুক্ত সমস্যার
ডুপ্লিকেট। Firebase কনসোলে, আমরা শনাক্ত করার চেষ্টা করি
এবং কোনও নতুন .kt সমস্যা যদি কোনও
আগে থেকে থাকা .java-লেবেলযুক্ত সমস্যার সম্ভাব্য ডুপ্লিকেট হয়, তাহলে আপনাকে জানাই।
Dexguard-এর সাথে ক্র্যাশ হচ্ছে না
আপনি যদি নিম্নলিখিত ব্যতিক্রম দেখতে পান, তাহলে সম্ভবত আপনি 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
Crashlytics Gradle plugin v3-তে কীভাবে আপগ্রেড করবেন?
Crashlytics Gradle প্লাগ-ইনের লেটেস্ট রিলিজ হল একটি মেজর ভার্সন (v3.0.0) এবং এটি Gradle ও Android Gradle প্লাগ-ইনের আগের ভার্সনের জন্য সহায়তা বন্ধ করে SDK-কে আরও আধুনিক করে তোলে। এছাড়াও, এই রিলিজের পরিবর্তনগুলি AGP v8.1+ সংক্রান্ত সমস্যার সমাধান করে এবং নেটিভ অ্যাপ ও কাস্টমাইজ করা বিল্ডের জন্য সহায়তা উন্নত করে।
ন্যূনতম প্রয়োজনীয়তা
Crashlytics Gradle plugin v3-এর নিম্নলিখিত ন্যূনতম প্রয়োজনীয়তা আছে:
Android Gradle প্লাগ-ইন 8.1+
Android Studio-এর লেটেস্ট ভার্সনে Android Gradle প্লাগ-ইন আপগ্রেড অ্যাসিস্ট্যান্ট ব্যবহার করে এই প্লাগ-ইন আপগ্রেড করুন।Firebase-এর
google-servicesGradle প্লাগ-ইন 4.4.1+
আপনার প্রজেক্টের Gradle বিল্ড ফাইলে লেটেস্ট ভার্সন উল্লেখ করে এই প্লাগ-ইন আপগ্রেড করুন, যেমন:
Kotlin
plugins { id("com.android.application") version "8.1.4" apply false id("com.google.gms.google-services") version "4.5.0" apply false ... }
Groovy
plugins { id 'com.android.application' version '8.1.4' apply false id 'com.google.gms.google-services' version '4.5.0' apply false ... }
Crashlytics এক্সটেনশনে পরিবর্তন
Crashlytics Gradle প্লাগ-ইনের v3 ভার্সনে, Crashlytics এক্সটেনশনে নিম্নলিখিত ব্রেকিং পরিবর্তন করা হয়েছে:
defaultConfigAndroid ব্লক থেকে এক্সটেনশন সরিয়ে দেওয়া হয়েছে। পরিবর্তে, আপনাকে প্রতিটি ভেরিয়েন্ট কনফিগার করতে হবে।পুরনো হয়ে যাওয়া ফিল্ড
mappingFileসরিয়ে দেওয়া হয়েছে। পরিবর্তে, মার্জ করা ম্যাপিং ফাইল এখন অটোমেটিক প্রদান করা হয়।পুরনো হয়ে যাওয়া ফিল্ড
strippedNativeLibsDirসরিয়ে দেওয়া হয়েছে। পরিবর্তে, আপনাকে সব নেটিভ লাইব্রেরির জন্যunstrippedNativeLibsDirব্যবহার করতে হবে।unstrippedNativeLibsDirফিল্ডকে ক্রমবর্ধমান হিসেবে পরিবর্তন করা হয়েছে।একাধিক ডিরেক্টরি সহ একটি উদাহরণ দেখুন
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("MY/NATIVE/LIBS") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS") } } } }
টাস্ক শুধুমাত্রuploadCrashlyticsSymbolFilesBasicReleaseMY/NATIVE/LIBS-এর চিহ্ন আপলোড করবে, কিন্তুuploadCrashlyticsSymbolFilesFeatureXReleaseMY/NATIVE/LIBSওMY/FEATURE_X/LIBS, এই দু'টিরই চিহ্ন আপলোড করবে।বন্ধ করার ফিল্ড
symbolGeneratorদুটি নতুন টপ লেভেল ফিল্ড দিয়ে পরিবর্তন করা হয়েছে:symbolGeneratorType,"breakpad"(ডিফল্ট) বা"csym"-এর স্ট্রিং।breakpadBinary, একটি লোকালdump_symsবাইনারি ওভাররাইড ফাইল।
এক্সটেনশন কীভাবে আপগ্রেড করতে হয় তার উদাহরণ
Kotlin
| আগে |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGenerator( closureOf<SymbolGenerator> { symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } ) } } } |
| এখন v3 ভার্সনে |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Groovy
| আগে |
buildTypes { release { firebaseCrashlytics { // ... symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } } |
| এখন v3 ভার্সনে |
buildTypes { release { firebaseCrashlytics { // ... symbolGeneratorType "breakpad" breakpadBinary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Android-NDK নির্দিষ্ট সহায়তা
Crashlytics ড্যাশবোর্ড এবং logcat-এ NDK স্ট্যাক ট্রেসের মধ্যে পার্থক্য
LLVM এবং GNU টুলচেনের ডিফল্ট আলাদা আলাদা হয় এবং আপনার অ্যাপের বাইনারির রিড-অনলি সেগমেন্টের জন্য আলাদা আলাদা ট্রিটমেন্ট থাকে, যা Firebase কনসোলে ইনকনসিস্টেন্ট স্ট্যাক ট্রেস জেনারেট করতে পারে। এটি কমানোর জন্য, আপনার বিল্ড প্রসেসে নিম্নলিখিত লিঙ্কার ফ্ল্যাগ যোগ করুন:
আপনি LLVM টুলচেন থেকে
lldলিঙ্কার ব্যবহার করলে, এগুলি যোগ করুন:-Wl,--no-rosegmentআপনি যদি GNU টুলচেন থেকে
ld.goldলিঙ্কার ব্যবহার করেন, তাহলে এগুলি যোগ করুন:-Wl,--rosegment
আপনি যদি এখনও স্ট্যাক ট্রেস অসঙ্গতি দেখতে পান (অথবা যদি কোনও ফ্ল্যাগই আপনার টুলচেনের সাথে সম্পর্কিত না হয়), তাহলে আপনার বিল্ড প্রসেসে নিম্নলিখিতগুলি যোগ করার চেষ্টা করুন পরিবর্তে:
-fno-omit-frame-pointerNDK-এর জন্য আমার নিজস্ব Breakpad সিম্বল ফাইল জেনারেটর বাইনারি আমি কীভাবে ব্যবহার করব?
Crashlytics প্লাগ-ইনটি একটি
কাস্টমাইজ করা Breakpad প্রতীক ফাইল জেনারেটর বান্ডেল করে।
Breakpad সিম্বল ফাইল জেনারেট করার জন্য (যেমন, আপনি যদি সোর্স থেকে আপনার বিল্ড চেনে
সব নেটিভ এক্সিকিউটেবল বিল্ড করতে চান) নিজের বাইনারি ব্যবহার করতে চাইলে, এক্সিকিউটেবলের
পাথ নির্দিষ্ট করতে ঐচ্ছিক symbolGeneratorBinary এক্সটেনশন প্রপার্টি ব্যবহার করুন।
আপনি দু'টি উপায়ের মধ্যে একটি উপায়ে Breakpad সিম্বল ফাইল জেনারেটর বাইনারির পাথ নির্দিষ্ট করতে পারবেন:
বিকল্প ১: আপনার
build.gradleফাইলেfirebaseCrashlyticsএক্সটেনশনের মাধ্যমে পাথ নির্দিষ্ট করুনআপনার অ্যাপ-লেভেল
build.gradle.ktsফাইলে নিম্নলিখিতগুলি যোগ করুন:Gradle প্লাগ-ইন 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") } } } } }
বিকল্প ২: আপনার Gradle properties ফাইলে প্রপার্টি লাইনের মাধ্যমে পাথ নির্দিষ্ট করুন
এক্সিকিউটেবল ফাইলের পাথ নির্দিষ্ট করতে আপনি
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
Crashlytics কি armeabi-কে সাপোর্ট করে?
Firebase Crashlytics NDK, ARMv5 (armeabi) সাপোর্ট করে না। NDK r17 থেকে এই ABI-এর জন্য সহায়তা সরিয়ে দেওয়া হয়েছে।
Unity সহায়তা
Crashlytics ড্যাশবোর্ডে Android অ্যাপের জন্য আনসিম্বোলাইজড স্ট্যাক ট্রেস দেখা
আপনি Unity IL2CPP ব্যবহার করলে এবং আনসিম্বোলাইজড স্ট্যাক ট্রেস দেখতে পেলে, এগুলি করে দেখুন:
Crashlytics Unity SDK-এর v8.6.1 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করছেন কিনা তা ভালোভাবে দেখে নিন।
আপনার প্রতীক ফাইল তৈরি ও আপলোড করার জন্য Firebase CLI
crashlytics:symbols:uploadকমান্ড সেট-আপ ও রান করছেন কিনা তা নিশ্চিত করুন।আপনি যখনই কোনও রিলিজ বিল্ড বা এমন কোনও বিল্ড তৈরি করবেন যার জন্য আপনি Firebase কনসোলে সিম্বল সহ স্ট্যাক ট্রেস দেখতে চান, আপনাকে প্রতিবার এই CLI কমান্ড রান করাতে হবে। সহজে পাঠযোগ্য ক্র্যাশ রিপোর্ট পান লিঙ্কে গিয়ে আরও জানুন।
IL2CPP ব্যবহার করে এমন অ্যাপের সাথে Crashlytics ব্যবহার করা যাবে?
হ্যাঁ, Crashlytics আপনার অ্যাপের জন্য সিম্বলযুক্ত স্ট্যাক ট্রেস দেখাতে পারে যেগুলি IL2CPP ব্যবহার করে। এই সুবিধা Android বা Apple প্ল্যাটফর্মে রিলিজ করা অ্যাপের জন্য উপলভ্য। আপনাকে যা করতে হবে:
Crashlytics Unity SDK-এর v8.6.0 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করছেন কিনা তা ভালোভাবে দেখে নিন।
আপনার প্ল্যাটফর্মের জন্য প্রয়োজনীয় টাস্ক সম্পূর্ণ করুন:
Apple প্ল্যাটফর্মের অ্যাপের জন্য: কোনও বিশেষ অ্যাকশন নেওয়ার প্রয়োজন নেই। Apple প্ল্যাটফর্ম অ্যাপের জন্য, Firebase Unity Editor প্লাগ-ইন অটোমেটিক সিম্বল আপলোড করার জন্য আপনার Xcode প্রোজেক্ট কনফিগার করে।
Android অ্যাপের জন্য: আপনার সিম্বল ফাইল তৈরি ও আপলোড করার জন্য Firebase CLI
crashlytics:symbols:uploadকমান্ড সেট-আপ ও রান করছেন কিনা তা ভালোভাবে দেখে নিন।আপনি যখনই কোনও রিলিজ বিল্ড বা এমন কোনও বিল্ড তৈরি করবেন যার জন্য আপনি Firebase কনসোলে সিম্বল সহ স্ট্যাক ট্রেস দেখতে চান, আপনাকে প্রতিবার এই CLI কমান্ড রান করাতে হবে। সহজে পাঠযোগ্য ক্র্যাশ রিপোর্ট পান লিঙ্কে গিয়ে আরও জানুন।
আগে বোঝা যায়নি এমন সমস্যাকে গুরুতর সমস্যা হিসেবে রিপোর্ট করা
Crashlytics থেকে, আনকড ব্যতিক্রমগুলিকে মারাত্মক সমস্যা হিসেবে রিপোর্ট করা যেতে পারে (Unity SDK-এর v10.4.0 থেকে শুরু করে)। এই ফিচার ব্যবহার করার কারণ ও পেশাদার পদ্ধতি সম্পর্কে নিম্নলিখিত প্রায়শই জিজ্ঞাসিত প্রশ্ন থেকে জানতে পারবেন।
কেন কোনও অ্যাপকে আনকড ব্যতিক্রমকে মারাত্মক হিসেবে রিপোর্ট করতে হবে?
আনক্যাচড ব্যতিক্রমগুলিকে মারাত্মক হিসেবে রিপোর্ট করার মাধ্যমে, আপনি আরও বাস্তবসম্মত ইঙ্গিত পান যে কোন ব্যতিক্রমের ফলে গেমটি খেলার অযোগ্য হয়ে যেতে পারে – এমনকি অ্যাপটি চালু থাকলেও।
মনে রাখবেন, আপনি যদি গুরুতর সমস্যা সম্পর্কে রিপোর্ট করা শুরু করেন, তাহলে আপনার ক্র্যাশ-ফ্রি ব্যবহারকারীর (CFU) শতাংশ কমে যেতে পারে, কিন্তু CFU মেট্রিক আপনার অ্যাপের সাথে এন্ড-ইউজারদের অভিজ্ঞতার আরও ভাল প্রতিনিধিত্ব করবে।
কোন কোন ব্যতিক্রমকে মারাত্মক হিসেবে রিপোর্ট করা হবে?
Crashlytics-এর কোনও ধরা না পড়া ব্যতিক্রমকে মারাত্মক হিসেবে রিপোর্ট করার জন্য, নিচে উল্লেখ করা দুটি শর্ত পূরণ করতে হবে:
আপনার অ্যাপে ইনিশিয়ালাইজেশনের সময়,
ReportUncaughtExceptionsAsFatalপ্রপার্টিtrueহিসেবে সেট করতে হবে।আপনার অ্যাপ (বা অন্তর্ভুক্ত লাইব্রেরি) এমন একটি ব্যতিক্রম তৈরি করে যা ধরা পড়েনি। তৈরি করা হয়েছে, কিন্তু থ্রো করা হয়নি, এমন ব্যতিক্রমকে আনকড হিসেবে বিবেচনা করা হয় না।
ফ্যাটাল হিসেবে ধরা না পড়া ব্যতিক্রমের রিপোর্টিং চালু করার পরে, এখন আমার কাছে অনেক নতুন ফ্যাটাল আছে। আমি কীভাবে এই ব্যতিক্রমগুলি সঠিকভাবে ম্যানেজ করব?
আপনার আনক্যাচড ব্যতিক্রমের রিপোর্ট যখন ফেটাল হিসেবে পেতে শুরু করবেন, তখন এখানে এইসব আনক্যাচড ব্যতিক্রম হ্যান্ডেল করার কিছু বিকল্প দেওয়া হল:
- এইসব আনকড ব্যতিক্রম কীভাবে ধরা ও ম্যানেজ করা যায় তা ভেবে দেখুন।
- Unity ডিবাগ কনসোল এবং Crashlytics-এ ব্যতিক্রম লগ করার জন্য বিভিন্ন বিকল্প বিবেচনা করুন।
থ্রো করা ব্যতিক্রম ক্যাচ ও হ্যান্ডেল করা
অপ্রত্যাশিত বা ব্যতিক্রমী অবস্থা দেখানোর জন্য ব্যতিক্রম তৈরি ও থ্রো করা হয়। থ্রো করা ব্যতিক্রমের মাধ্যমে প্রতিফলিত সমস্যাগুলি সমাধান করার মধ্যে প্রোগ্রামটিকে একটি পরিচিত অবস্থায় ফিরিয়ে আনা জড়িত (এই প্রক্রিয়াটি ব্যতিক্রম হ্যান্ডেলিংনামে পরিচিত)।
সমস্ত পূর্বানুমানিত ব্যতিক্রম ধরা ও ম্যানেজ করাই হল পেশাদার পদ্ধতি, যদি না প্রোগ্রামটি পরিচিত অবস্থায় ফিরিয়ে আনা যায়।
কোন ধরনের ব্যতিক্রম কোন কোড দ্বারা ধরা ও ম্যানেজ করা হবে তা নিয়ন্ত্রণ করতে,
try-catch ব্লকে ব্যতিক্রম তৈরি করতে পারে এমন কোড র্যাপ করুন।
catch বিবৃতিতে উল্লেখ করা শর্তগুলি যেন যতটা সম্ভব
নির্দিষ্ট হয়, তা নিশ্চিত করুন যাতে নির্দিষ্ট ব্যতিক্রমগুলি যথাযথভাবে ম্যানেজ করা যায়।
Unity-তে ব্যতিক্রম লগ করা অথবা Crashlytics
Unity বা Crashlytics-এ ব্যতিক্রম রেকর্ড করার একাধিক উপায় আছে, যা সমস্যা ডিবাগ করতে সাহায্য করে।
Crashlytics ব্যবহার করার সময়, এখানে দুটি সবচেয়ে সাধারণ ও সাজেস্ট করা বিকল্প দেওয়া হল:
বিকল্প ১: Unity কনসোলে প্রিন্ট করুন, কিন্তু ডেভেলপমেন্ট বা সমস্যা সমাধান করার সময় Crashlytics-এ রিপোর্ট করবেন না
Debug.Log(exception),Debug.LogWarning(exception)ওDebug.LogError(exception)ব্যবহার করে Unity কনসোলে প্রিন্ট করুন, যা Unity কনসোলে ব্যতিক্রমের কন্টেন্ট প্রিন্ট করে এবং ব্যতিক্রমটি আবার থ্রো করে না।
বিকল্প ২: নিম্নলিখিত পরিস্থিতির জন্য Crashlytics ড্যাশবোর্ডে একত্রিত রিপোর্টিংয়ের জন্য Crashlytics-এ আপলোড করুন:
- সম্ভাব্য পরবর্তী
Crashlytics ইভেন্ট ডিবাগ করার জন্য কোনও ব্যতিক্রম লগ করার মতো হলে,
Crashlytics.Log(exception.ToString())ব্যবহার করুন। - যদি কোনও ব্যতিক্রম ধরা ও হ্যান্ডেল করা সত্ত্বেও Crashlytics-এ
রিপোর্ট করতে হয়, তাহলে এটিকে একটি নন-ফ্যাটাল ইভেন্ট হিসেবে লগ করতে
Crashlytics.LogException(exception)ব্যবহার করুন।
- সম্ভাব্য পরবর্তী
Crashlytics ইভেন্ট ডিবাগ করার জন্য কোনও ব্যতিক্রম লগ করার মতো হলে,
তবে, আপনি যদি Unity Cloud
Diagnostics-এ কোনও মারাত্মক ইভেন্ট সম্পর্কে ম্যানুয়ালি রিপোর্ট করতে চান, তাহলে Debug.LogException ব্যবহার করতে পারেন। এই বিকল্পটি ১ নম্বর বিকল্পের মতো Unity কনসোলে ব্যতিক্রম
প্রিন্ট করে, কিন্তু এটি ব্যতিক্রমও দেখায়
(এটি এখনও দেখানো বা ধরা হয়েছে কিনা)। এটি
nonlocally সংক্রান্ত সমস্যা দেখায়। এর অর্থ হল, Debug.LogException(exception)
সহ try-catch ব্লক থাকলেও, তা থেকে এখনও আনক্যাচড ব্যতিক্রম তৈরি হয়।
তাই, আপনি যদি নিম্নলিখিত সব কাজ করতে চান, তাহলেই Debug.LogException নম্বরে কল করুন:
- Unity কনসোলে ব্যতিক্রম প্রিন্ট করতে।
- Crashlytics-এ ব্যতিক্রমকে একটি মারাত্মক ইভেন্ট হিসেবে আপলোড করতে।
- ব্যতিক্রমটি থ্রো করতে, এটিকে ক্যাচ করা হয়নি এমন ব্যতিক্রম হিসেবে বিবেচনা করুন এবং Unity Cloud Diagnostics-এ রিপোর্ট করুন।
মনে রাখবেন, আপনি যদি Unity কনসোলে ধরা পড়া ব্যতিক্রম প্রিন্ট করতে চান এবং 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
//
}
ইন্টিগ্রেশন সহায়তা
অ্যাপটি Google Mobile Ads SDK ব্যবহার করে কিন্তু ক্র্যাশ হয় না
আপনার প্রোজেক্টে Google Mobile Ads SDK-এর সাথে Crashlytics ব্যবহার করা হলে,
ক্র্যাশ রিপোর্টাররা সম্ভবত ব্যতিক্রম হ্যান্ডলার রেজিস্টার করার
সময় হস্তক্ষেপ করছে। সমস্যার সমাধান করতে, disableSDKCrashReporting কল করে Mobile Ads SDK-তে
ক্র্যাশ রিপোর্টিং বন্ধ করুন।
আমার BigQuery ডেটাসেট কোথায় আছে?
Firebase, BigQuery-এ ডেটা এক্সপোর্ট করার সুবিধা সেট-আপ করার সময় আপনার বেছে নেওয়া ডেটাসেট লোকেশনে ডেটা এক্সপোর্ট করে।
এই লোকেশনটি Crashlytics ডেটাসেট এবং Firebase সেশন ডেটাসেট (সেশন ডেটা এক্সপোর্ট করার জন্য চালু করা থাকলে) উভয়ের ক্ষেত্রেই প্রযোজ্য।
এই লোকেশনটি শুধুমাত্র BigQuery-এ এক্সপোর্ট করা ডেটার ক্ষেত্রে প্রযোজ্য এবং এটি Firebase কনসোলের Crashlytics ড্যাশবোর্ড বা Android Studio-তে ব্যবহারের জন্য সেভ করা ডেটার লোকেশনের উপর কোনও প্রভাব ফেলে না।
ডেটা সেট তৈরি করার পরে, এর লোকেশন পরিবর্তন করা যায় না, তবে আপনি ডেটা সেটটি অন্য লোকেশনে কপি করতে বা অন্য লোকেশনে ম্যানুয়ালি ডেটা সেটটি সরাতে (আবার তৈরি করতে) পারবেন। আরও জানতে, আগে থেকে এক্সপোর্ট করা ডেটার লোকেশন পরিবর্তন করুন দেখুন।
BigQuery-এর জন্য নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করার পরে সমস্যা হচ্ছে?
অক্টোবর ২০২৪-এর মাঝামাঝি সময়ে, Crashlytics থেকে BigQuery-এ ব্যাচ এক্সপোর্ট করার জন্য Crashlytics একটি নতুন পরিকাঠামো লঞ্চ করেছে।
২ মার্চ, ২০২৬ পর্যন্ত সব Firebase প্রোজেক্টকে নতুন ব্যাচ এক্সপোর্ট ইনফ্রাস্ট্রাকচারে অটোমেটিক আপগ্রেড করা হয়েছে।
পুরনো ও নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারের মধ্যে গুরুত্বপূর্ণ পার্থক্য
নতুন ইনফ্রাস্ট্রাকচার Crashlytics মার্কিন যুক্তরাষ্ট্রের বাইরে ডেটাসেট লোকেশন সাপোর্ট করে।
২০২৪ সালের অক্টোবর মাসের মাঝামাঝি আগে এক্সপোর্ট করার সুবিধা চালু করা হয়েছে এবং নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করা হয়েছে — আপনি এখন ঐচ্ছিকভাবে ডেটা এক্সপোর্টের লোকেশন পরিবর্তন করতে পারবেন।
২০২৪ সালের অক্টোবর মাসের মাঝামাঝি সময় বা তার পরে এক্সপোর্ট করার সুবিধা চালু করা হয়েছে — সেট-আপ করার সময় আপনাকে ডেটা এক্সপোর্ট করার জন্য লোকেশন বেছে নিতে বলা হয়েছে।
আপনি এক্সপোর্ট চালু করার আগের ডেটা নতুন ইনফ্রাস্ট্রাকচারে ব্যাকফিল করা যায় না।
আপনি এক্সপোর্ট চালু করার তারিখের ৩০ দিন আগে পর্যন্ত পুরনো ইনফ্রাস্ট্রাকচার ব্যাকফিল কাজ করত।
নতুন ইনফ্রাস্ট্রাকচার ব্যাকফিল সর্বাধিক গত ৩০ দিনের জন্য অথবা আপনি BigQuery-এ এক্সপোর্ট চালু করার সবচেয়ে সাম্প্রতিক তারিখ পর্যন্ত (যেটি সবচেয়ে সাম্প্রতিক) ডেটা সাপোর্ট করে।
নতুন ইনফ্রাস্ট্রাকচার BigQuery ব্যাচ টেবিল ব্যবহার করে আপনার Firebase প্রোজেক্টে Firebase অ্যাপের জন্য সেট করা শনাক্তকারী।
পুরনো ইনফ্রাস্ট্রাকচার, বান্ডেল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে ব্যাচ টেবিলের ডেটা লেখে যা আপনার অ্যাপের বাইনারিতে থাকে।
নতুন ইনফ্রাস্ট্রাকচার বান্ডেল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে আপনার Firebase প্রোজেক্টে রেজিস্টার করা Firebase অ্যাপের জন্য সেট করা নামের সাথে ব্যাচ টেবিলে ডেটা লেখে।
আপনার লিগ্যাসি ব্যাচ টেবিলের নাম Firebase অ্যাপ আইডেন্টিফায়ারের সাথে না মিললে
আপনার রেজিস্টার করা Firebase অ্যাপের জন্য সেট করা বান্ডেল আইডি বা প্যাকেজের নামের সাথে আপনার লিগ্যাসি ব্যাচ টেবিলের নাম না মিললে, আপনার এক্সপোর্ট করা ব্যাচ ডেটাতে আরও বিঘ্ন এড়াতে এইসব বিকল্পের মধ্যে একটি প্রয়োগ করুন।
এক্সপোর্ট ইনফ্রাস্ট্রাকচার কীভাবে BigQuery টেবিলে ডেটা লেখার জন্য শনাক্তকারী ব্যবহার করে তা জানুন
দুটি এক্সপোর্ট ইনফ্রাস্ট্রাকচার কীভাবে Crashlytics ডেটা BigQuery ব্যাচ টেবিলে লেখে তা এখানে দেওয়া হল:
পুরনো এক্সপোর্ট ইনফ্রাস্ট্রাকচার: এমন একটি টেবিলে ডেটা লিখেছে যার নাম আপনার অ্যাপের বাইনারিতে বান্ডেল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে তৈরি করা হয়েছে।
নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার: এমন একটি টেবিলে ডেটা লেখে যার নাম বান্ডেল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে আপনার Firebase প্রোজেক্টে রেজিস্টার করা Firebase অ্যাপের জন্য সেট করা হয়েছে।
দুর্ভাগ্যবশত, কখনও কখনও আপনার অ্যাপের বাইনারিতে বান্ডেল আইডি বা প্যাকেজের নাম আপনার Firebase প্রোজেক্টে রেজিস্টার করা Firebase অ্যাপের জন্য সেট করা বান্ডেল আইডি বা প্যাকেজের নামের সাথে মেলে না। অ্যাপ রেজিস্ট্রেশনের সময় কেউ আসল শনাক্তকারী না লিখলে সাধারণত এটি ঘটে।
আপগ্রেড করার আগে এটি ঠিক করা না হলে কী হবে?
এই দুটি লোকেশনের শনাক্তকারী না মিললে, নিম্নলিখিত ঘটনাগুলি ঘটেছে:
আপনার Crashlytics ডেটা এখন নতুন BigQuery ব্যাচ টেবিলে লেখা হয় — অর্থাৎ, বান্ডেল আইডি বা প্যাকেজ নামের উপর ভিত্তি করে তৈরি করা একটি নতুন টেবিল যা আপনার Firebase প্রোজেক্টে রেজিস্টার করা Firebase অ্যাপের জন্য সেট করা হয় ।
আপনার অ্যাপের বাইনারিতে আইডেন্টিফায়ারের উপর ভিত্তি করে নাম দেওয়া আগে থেকে থাকা "লেগ্যাসি" টেবিলে আর ডেটা লেখা হয় না।
ম্যাচ না করা শনাক্তকারী সংক্রান্ত পরিস্থিতির উদাহরণ
মনে রাখবেন, BigQuery ব্যাচ টেবিলের নামের সাথে অ্যাপের প্ল্যাটফর্ম বোঝাতে অটোমেটিক
_IOS বা _ANDROID যোগ করা হয়।
| আপনার অ্যাপের বাইনারিতে শনাক্তকারী | আপনার Firebase অ্যাপের জন্য সেট করা শনাক্তকারী | পুরনো আচরণ | নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করার পরে আচরণ |
সমাধান |
|---|---|---|---|---|
foo |
bar |
অ্যাপের
বাইনারিতে (foo) শনাক্তকারীর নামে একটি টেবিলে লেখে
|
Firebase অ্যাপের (bar) জন্য সেট করা আইডেন্টিফায়ারের নামে একটি সিঙ্গেল টেবিল তৈরি করে তাতে লেখে
|
নিচে বর্ণিত বিকল্প ১ বা ২ প্রয়োগ করুন। |
foo |
bar, qux, ইত্যাদি। |
অ্যাপের
বাইনারিতে (foo) শনাক্তকারীর নামে একটি টেবিলে লেখে
|
Firebase অ্যাপের জন্য সেট করা শনাক্তকারী (bar, qux,
ইত্যাদি) অনুযায়ী নাম দেওয়া একাধিক টেবিল তৈরি* করে, তারপর সেগুলিতে লেখে
|
নিচে বর্ণিত বিকল্প ২ প্রয়োগ করুন। |
foo, baz, ইত্যাদি। |
bar |
অ্যাপের বাইনারিতে (foo, baz ইত্যাদি) একাধিক শনাক্তকারী
নামে একাধিক টেবিলে লেখে
|
তৈরি করে** তারপর Firebase অ্যাপের (bar) জন্য সেট করা আইডেন্টিফায়ারের পরে
প্রতিটি অ্যাপের ডেটা একটি টেবিলে লেখে
|
কোনও বিকল্পই প্রয়োগ করা যাবে না।
আপনি এখনও একটি টেবিলের মধ্যে প্রতিটি অ্যাপের ডেটা আলাদা করতে পারবেন।
এর জন্য, ডেটার সাথে এক্সপোর্ট করা অ্যাপের |
* আপনার অ্যাপের বাইনারিতে থাকা শনাক্তকারী যদি Firebase অ্যাপের জন্য সেট করা শনাক্তকারীর সাথে মিলে যায়, তাহলে নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার সেই শনাক্তকারীর জন্য নতুন টেবিল তৈরি করেনি। পরিবর্তে, এটি সেই নির্দিষ্ট অ্যাপের জন্য ডেটা লেখা চালিয়ে যাবে। অন্যান্য সব অ্যাপ নতুন টেবিলে লেখা হবে।
** আপনার অ্যাপের বাইনারিতে থাকা কোনও একটি শনাক্তকারী যদি Firebase অ্যাপের জন্য সেট করা শনাক্তকারীর সাথে মিলে যায়, তাহলে নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার নতুন টেবিল তৈরি করেনি। পরিবর্তে, এটি সেই টেবিলটি বজায় রাখবে এবং এতে সব অ্যাপের জন্য ডেটা লিখতে শুরু করবে।
বিঘ্ন কমানোর বিকল্প
বিকল্প ১:
নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার দ্বারা তৈরি নতুন টেবিল ব্যবহার করুন। আপনি পুরনো টেবিল থেকে নতুন টেবিলে ডেটা কপি করবেন।Google Cloud কনসোলে, ইনফ্রাস্ট্রাকচার আপগ্রেড করার সময় তৈরি হওয়া নতুন টেবিলে আপনার লেগ্যাসি টেবিল থেকে সব ডেটা কপি করুন।
আপনার ব্যাচ টেবিলের উপর নির্ভর করে এমন কোনও ডাউনস্ট্রিম ডিপেন্ডেন্সি থাকলে, সেগুলি পরিবর্তন করে নতুন টেবিল ব্যবহার করুন।
বিকল্প ২:
আপনার পুরনো টেবিলে আবার লেখার জন্য রিকনফিগার করুন। এটি করতে হলে, আপনাকে BigQuery কনফিগে কিছু ডিফল্ট ওভাররাইড করতে হবে।Firebase কনসোলে, ভুল করে দেওয়া ব্যাচ টেবিলের নাম ও শনাক্তকারী সহ অ্যাপের Firebase অ্যাপ আইডি (যেমন,
1:1234567890:ios:321abc456def7890) খুঁজে বের করে নোট নিন:
আপনার settings প্রোজেক্ট সেটিংস-এ যান, তারপর আপনার সব Firebase অ্যাপ ও সেগুলির তথ্য দেখতে আপনার অ্যাপ কার্ডে যান।Google Cloud কনসোলে, পরিকাঠামো আপগ্রেড করার ফলে তৈরি হওয়া নতুন "ডেটা ট্রান্সফার কনফিগারেশন" পরিবর্তন করুন, যাতে আপনার লিগ্যাসি টেবিলে ডেটা লেখা যায়:
আপনার "ডেটা ট্রান্সফার কনফিগারেশন " দেখতে BigQuery> ডেটা ট্রান্সফার বিকল্পে যান।
যে কনফিগারেশনে সোর্স
Firebase Crashlytics with Multi-Region Supportআছে সেটি বেছে নিন।উপরে ডানদিকের কোণে এডিট করুন বিকল্পে ক্লিক করুন।
ডেটা সোর্সের বিবরণ বিভাগে, gmp_app_id ও client_namespace-এর তালিকা খুঁজে দেখুন।
BigQuery-এ, Firebase অ্যাপ আইডিকে
gmp_app_idবলা হয়। ডিফল্ট হিসেবে, BigQuery-এclient_namespaceভ্যালু হল অ্যাপের অনন্য বান্ডেল আইডি / প্যাকেজ নাম, কিন্তু আপনি এই ডিফল্ট কনফিগারেশন ওভাররাইড করবেন।BigQuery, প্রতিটি লিঙ্ক করা Firebase অ্যাপ যে ব্যাচ টেবিলে লেখে, সেটির নামের জন্য
client_namespaceভ্যালু ব্যবহার করে।আপনি যে Firebase অ্যাপের ডিফল্ট সেটিংস ওভাররাইড করতে চান সেটির gmp_app_id খুঁজে নিন। এর client_namespace ভ্যালু পরিবর্তন করে Firebase অ্যাপ যে টেবিলে লিখতে চায় সেটির নাম করুন (সাধারণত এটি হল সেই পুরনো টেবিলের নাম যেখানে অ্যাপটি পুরনো এক্সপোর্ট ইনফ্রাস্ট্রাকচার ব্যবহার করে লিখত)।
কনফিগারেশনে করা পরিবর্তন সেভ করুন।
আপনার লিগ্যাসি টেবিলে যেসব দিনের ডেটা নেই, সেগুলির জন্য ব্যাকফিল শিডিউল করুন।
ব্যাকফিল করা হয়ে গেলে, নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার দ্বারা অটোমেটিক তৈরি করা নতুন টেবিলটি মুছে দিন।