এই পৃষ্ঠায় Crashlytics ব্যবহার করা সম্পর্কে সমস্যার সমাধানকরণে সহায়তা ও প্রায়শই জিজ্ঞাসিত প্রশ্নের উত্তর দেওয়া আছে। আপনি যা খুঁজছেন তা খুঁজে না পেলে বা অতিরিক্ত সাহায্যের প্রয়োজন হলে, Firebase সহায়তা টিমের সাথে যোগাযোগ করুন।
এই পৃষ্ঠায়, আপনি নিম্নলিখিত ধরনের বিষয় সম্পর্কে তথ্য পাবেন:
সমস্যার সমাধানকরণ সংক্রান্ত সাধারণ প্রশ্ন, যার মধ্যে ডেটা দেখানো বা Firebase কনসোলে ডেটা নিয়ে কাজ করা এবং রিগ্রেশন সংক্রান্ত সমস্যা সম্পর্কে প্রশ্ন অন্তর্ভুক্ত।
প্ল্যাটফর্ম-নির্দিষ্ট সহায়তা, যার মধ্যে Apple প্ল্যাটফর্ম, Android এবং Unity-এর মতো নির্দিষ্ট প্ল্যাটফর্মের প্রশ্নও অন্তর্ভুক্ত।
ইন্টিগ্রেশন সংক্রান্ত সহায়তা, যার মধ্যে BigQuery সম্পর্কিত প্রশ্নও অন্তর্ভুক্ত।
সাধারণ সমস্যা সমাধান/FAQ
সমস্যা সারণীতে কিছু সমস্যার জন্য বিভিন্ন ফর্ম্যাট (এবং কখনও কখনও "ভেরিয়েন্ট") দেখা
Firebase কনসোলের সমস্যা সারণীতে তালিকাভুক্ত সমস্যার জন্য আপনি দুটি ভিন্ন ফর্ম্যাট লক্ষ্য করতে পারেন। এছাড়াও, আপনার কিছু সমস্যার মধ্যে "ভেরিয়েন্ট" নামক ফিচার দেখতে পেতে পারেন। এখানে কারণ বলা আছে!
২০২৩ সালের প্রথম দিকে, আমরা ইভেন্টগুলিকে গ্রুপ করার জন্য একটি উন্নত বিশ্লেষণ ইঞ্জিন চালু করেছি পাশাপাশি একটি আপডেট করা ডিজাইন এবং নতুন সমস্যার জন্য কিছু উন্নত ফিচার (যেমন ভেরিয়েন্ট!)। সব বিবরণ জানতে আমাদের সাম্প্রতিক ব্লগ পোস্ট দেখুন, তবে হাইলাইটগুলি আপনি নিচে পড়তে পারেন।
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)।
Apple প্ল্যাটফর্ম ও Android অ্যাপের ক্ষেত্রে, বিশেষ করে চেক করে নিন যে আপনি Google Analytics-এর জন্য Firebase SDK-এর কমপক্ষে নিম্নলিখিত ভার্সন ব্যবহার করছেন:
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 অ্যাডমিন
নিম্নলিখিত যেকোনও ভূমিকায় থাকা প্রোজেক্ট মেম্বাররা কোনও সমস্যার বিষয়ে পোস্ট করা নোট দেখতে পারবেন, তবে তারা নোট মুছতে বা লিখতে পারবেন না।
- প্রোজেক্ট Viewer, Firebase Viewer, Quality Viewer, অথবা Crashlytics Viewer
রিগ্রেসড সমস্যা বলতে কী বোঝায়?
আপনি আগে কোনও সমস্যা বন্ধ করে দেওয়ার পরেও যদি Crashlytics-এর কাছে সেই সমস্যা আবার হওয়ার নতুন রিপোর্ট আসে, তাহলে সেই সমস্যাকে রিগ্রেশন বলা হয়। Crashlytics অটোমেটিক এইসব রিগ্রেসড সমস্যা আবার খুলে দেয় যাতে আপনি আপনার অ্যাপের জন্য উপযুক্তভাবে সেগুলির সমাধান করতে পারেন।
এখানে একটি উদাহরণ দেওয়া হল যা থেকে বোঝা যাবে যে কীভাবে Crashlytics কোনও সমস্যাকে রিগ্রেশন হিসেবে শ্রেণীবদ্ধ করে:
- প্রথমবারের জন্য, Crashlytics ক্র্যাশ "A" সম্পর্কে ক্র্যাশ রিপোর্ট পায়। Crashlytics সেই ক্র্যাশের জন্য একটি সংশ্লিষ্ট সমস্যা খোলে (সমস্যা "A")।
- আপনি দ্রুত এই সমস্যার সমাধান করে, সমস্যা "ক" বন্ধ করে দেন এবং তারপরে আপনার অ্যাপের একটি নতুন ভার্সন রিলিজ করেন।
- আপনি সমস্যাটি বন্ধ করার পরে Crashlytics "A" সমস্যা সম্পর্কে আরেকটি রিপোর্ট পায়।
- আপনি সমস্যাটি বন্ধ করার সময় যদি অ্যাপের এমন কোনও ভার্সন থেকে রিপোর্ট পায়, যেটি সম্পর্কে Crashlytics জানত (অর্থাৎ, যেকোনও ক্র্যাশের জন্য ভার্সনটি ক্র্যাশ রিপোর্ট পাঠিয়েছিল), তাহলে Crashlytics সমস্যাটিকে রিগ্রেশন হিসেবে বিবেচনা করবে না। সমস্যাটি বন্ধই থাকবে।
- আপনি সমস্যাটি বন্ধ করার সময় Crashlytics যে অ্যাপ ভার্সন সম্পর্কে জানত না (অর্থাৎ, যে ভার্সনটি কোনও ক্র্যাশের জন্য কখনও কোনও ক্র্যাশ রিপোর্ট পাঠায়নি), সেই ভার্সন থেকে রিপোর্টটি পাঠানো হলে, Crashlytics সমস্যাটিকে রিগ্রেসড হিসেবে বিবেচনা করে এবং সমস্যাটি আবার খুলবে।
কোনও সমস্যা রিগ্রেস করলে, আমরা রিগ্রেশন শনাক্তকরণ অ্যালার্ট পাঠাই এবং সমস্যাটিতে একটি রিগ্রেশন সিগন্যাল যোগ করি যাতে আপনি জানতে পারেন যে Crashlytics সমস্যাটি আবার খুলেছে। আমাদের রিগ্রেশন অ্যালগরিদমের কারণে আপনি যদি কোনও সমস্যা আবার খুলতে না চান, তাহলে সমস্যাটি বন্ধ করার পরিবর্তে "মিউট" করুন।
আমি কেন অ্যাপের পুরনো ভার্সনে রিগ্রেশন সংক্রান্ত সমস্যা দেখতে পাচ্ছি?
আপনি সমস্যাটি বন্ধ করার সময় যদি কোনও রিপোর্ট এমন একটি পুরানো অ্যাপ ভার্সন থেকে আসে যা কখনও কোনও ক্র্যাশ রিপোর্ট পাঠায়নি, তাহলে Crashlytics সমস্যাটিকে রিগ্রেসড বলে বিবেচনা করে এবং সমস্যাটি আবার খুলবে।
এই পরিস্থিতি নিম্নলিখিত কারণে হতে পারে: আপনি কোনও সমস্যার সমাধান করে আপনার অ্যাপের নতুন ভার্সন রিলিজ করেছেন, কিন্তু এখনও কিছু ব্যবহারকারী আগের ভার্সন ব্যবহার করছেন যেখানে সমস্যার সমাধান করা হয়নি। যদি, কোনও কারণে, আপনি সমস্যাটি বন্ধ করার সময় সেই আগের ভার্সনগুলির মধ্যে একটিও ক্র্যাশ রিপোর্ট না পাঠিয়ে থাকে এবং সেই ব্যবহারকারীরা বাগটির সম্মুখীন হতে শুরু করে, তাহলে সেই ক্র্যাশ রিপোর্টগুলি একটি রিগ্রেসড সমস্যা ট্রিগার করবে।
আমাদের রিগ্রেশন অ্যালগরিদমের কারণে আপনি যদি কোনও সমস্যা আবার খুলতে না চান, তাহলে সমস্যাটি বন্ধ করার পরিবর্তে "মিউট" করুন।
প্ল্যাটফর্ম-নির্দিষ্ট সহায়তা
নিম্নলিখিত বিভাগগুলি প্ল্যাটফর্ম-নির্দিষ্ট সমস্যা সমাধান এবং প্রায়শই জিজ্ঞাসিত প্রশ্নের জন্য সহায়তা প্রদান করে: iOS+ | Android | Unity.
Apple প্ল্যাটফর্ম সহায়তা
dSYMs নেই/আপলোড হচ্ছে না
আপনার প্রোজেক্টের dSYMs আপলোড করতে এবং ভার্বোস আউটপুট পেতে, নিম্নলিখিত বিষয়গুলি চেক করুন:
আপনার প্রোজেক্টের বিল্ড ফেজে Crashlytics রান স্ক্রিপ্ট আছে কিনা তা নিশ্চিত করুন, যা Xcode-কে বিল্ড টাইমে আপনার প্রোজেক্টের dSYMs আপলোড করার অনুমতি দেয় (স্ক্রিপ্ট যোগ করার নির্দেশাবলীর জন্য Crashlytics শুরু করা পড়ুন)। আপনার প্রোজেক্ট আপডেট করার পরে, ক্র্যাশ করতে বাধ্য করুন এবং কনফার্ম করুন যে ক্র্যাশটি Crashlytics ড্যাশবোর্ডে দেখা যাচ্ছে।
Firebase কনসোলে "dSYM নেই" সংক্রান্ত সতর্কতা দেখতে পেলে, বিল্ডের জন্য সঠিকভাবে dSYM তৈরি হচ্ছে কিনা তা নিশ্চিত করতে Xcode চেক করুন।
Xcode যদি সঠিকভাবে dSYM তৈরি করে এবং আপনি এখনও dSYM দেখতে না পান, তাহলে dSYM আপলোড করার সময় রান স্ক্রিপ্ট টুলটি আটকে যাওয়ার সম্ভাবনা রয়েছে। এই ক্ষেত্রে, নিম্নলিখিত প্রতিটি ধাপ অনুসরণ করে দেখুন:
আপনি Crashlytics-এর লেটেস্ট ভার্সন ব্যবহার করছেন কিনা তা নিশ্চিত করুন।
ম্যানুয়ালি dSYM ফাইল আপলোড করুন:
- বিকল্প ১: অনুপস্থিত dSYM ফাইল সহ জিপ আর্কাইভ আপলোড করতে dSYMs ট্যাবে কনসোল-ভিত্তিক "টেনে এনে রাখুন" বিকল্প ব্যবহার করুন।
- বিকল্প ২: dSYMs ট্যাবে
প্রদান করা UUID-এর জন্য,
upload-symbolsস্ক্রিপ্ট ব্যবহার করে অনুপস্থিত dSYM ফাইল আপলোড করুন।
আপনি যদি এখনও dSYMs দেখতে না পান বা আপলোড এখনও সফল না হয়, Firebase সহায়তা টিমের সাথে যোগাযোগ করুন এবং আপনার লগ অন্তর্ভুক্ত করতে ভুলবেন না।
ক্র্যাশগুলি খারাপভাবে সিম্বল করা হয়েছে
আপনার স্ট্যাক ট্রেস যদি খারাপভাবে সিম্বল করা হয়েছে বলে মনে হয়, তাহলে নিম্নলিখিতগুলি চেক করুন:
আপনার অ্যাপের লাইব্রেরির ফ্রেমগুলিতে আপনার অ্যাপের কোডের রেফারেন্স না থাকলে, নিশ্চিত করুন যে
কম্পাইলেশন ফ্ল্যাগ হিসেবে সেট করা নেই।-fomit-frame-pointerআপনার অ্যাপের লাইব্রেরির জন্য একাধিক
(Missing)ফ্রেম দেখতে পেলে, Firebase কনসোলের Crashlytics dSYMs ট্যাবে (প্রভাবিত অ্যাপ ভার্সনের জন্য) ঐচ্ছিক dSYMs মিসিং হিসেবে তালিকাভুক্ত আছে কিনা তা চেক করুন। যদি তাই হয়, তাহলে এই পৃষ্ঠার dSYM নেই/আপলোড হচ্ছে না সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্ন থেকে "dSYM নেই সংক্রান্ত সতর্কতা" সমস্যার সমাধান করার ধাপ অনুসরণ করুন। মনে রাখবেন যে এইসব dSYM আপলোড করলে ইতিমধ্যে হওয়া ক্র্যাশ সিম্বলিকেট হবে না, তবে এটি ভবিষ্যতে হওয়া ক্র্যাশের সিম্বলিকেশন নিশ্চিত করতে সাহায্য করবে।
আমি কি macOS বা tvOS-এর জন্য Crashlytics ব্যবহার করতে পারি?
হ্যাঁ, আপনি macOS এবং tvOS প্রোজেক্টে Crashlytics প্রয়োগ করতে পারবেন। Google Analytics-এর জন্য Firebase SDK-এর v8.9.0+ ভার্সন অন্তর্ভুক্ত করতে ভুলবেন না যাতে ক্র্যাশগুলি Google Analytics-এর মাধ্যমে সংগ্রহ করা মেট্রিক্সে অ্যাক্সেস পায় (ক্র্যাশ-ফ্রি ব্যবহারকারী, লেটেস্ট রিলিজ, ভেলোসিটি অ্যালার্ট এবং ব্রেডক্রাম্ব লগ)।
আমি কি বিভিন্ন Apple প্ল্যাটফর্মে একাধিক অ্যাপ সহ Firebase প্রোজেক্টে Crashlytics ব্যবহার করতে পারি?
আপনি এখন একটি Firebase প্রোজেক্টে একাধিক অ্যাপের ক্র্যাশ রিপোর্ট করতে পারবেন, এমনকি অ্যাপগুলি বিভিন্ন Apple প্ল্যাটফর্মের জন্য তৈরি করা হলেও (যেমন, iOS, tvOS এবং Mac Catalyst)। আগে, একই বান্ডিল আইডি থাকলে, আপনাকে অ্যাপগুলিকে আলাদা আলাদা Firebase প্রোজেক্টে ভাগ করতে হতো।
Android সহায়তা
কেন ANR শুধুমাত্র Android 11+ ভার্সনের জন্য রিপোর্ট করা হয়?
Crashlytics Android 11 ও তার পরবর্তী যেকোনও ভার্সনে চলা ডিভাইস থেকে Android অ্যাপের জন্য ANR রিপোর্টিংয়ের সুবিধা দেয়। ANR সংগ্রহ করার জন্য আমরা যে অন্তর্নিহিত API ব্যবহার করি (getHistoricalProcessExitReasons) তা SIGQUIT বা ওয়াচডগ-ভিত্তিক পদ্ধতির চেয়ে বেশি নির্ভরযোগ্য। এই API শুধুমাত্র Android 11+ ডিভাইসে উপলভ্য।
কিছু ANR-এ কেন BuildId
নেই?
আপনার কিছু ANR-এ BuildId না থাকলে, নিম্নলিখিত উপায়ে সমস্যার সমাধান করুন:
আপনি আপ-টু-ডেট Crashlytics Android SDK এবং Crashlytics Gradle প্লাগ-ইন ভার্সন ব্যবহার করছেন কিনা তা নিশ্চিত করুন।
Android 11 এবং কিছু Android 12 ANR-এর জন্য
BuildIdনা থাকলে, সম্ভবত আপনি পুরনো SDK, Gradle প্লাগ-ইন বা দুটিই ব্যবহার করছেন। এইসব ANR-এর জন্য সঠিকভাবেBuildIdসংগ্রহ করতে, আপনাকে নিম্নলিখিত ভার্সন ব্যবহার করতে হবে:- Crashlytics Android SDK v18.3.5+ (Firebase BoM v31.2.2+)
- Crashlytics Gradle প্লাগ-ইন v2.9.4+
আপনার শেয়ার করা লাইব্রেরির জন্য কোনও নন-স্ট্যান্ডার্ড লোকেশন ব্যবহার করছেন কিনা তা চেক করুন।
আপনার অ্যাপের শেয়ার করা লাইব্রেরির জন্য শুধুমাত্র
BuildIdনা থাকলে, সম্ভবত আপনি শেয়ার করা লাইব্রেরির জন্য স্ট্যান্ডার্ড, ডিফল্ট লোকেশন ব্যবহার করছেন না। এমন হলে, Crashlytics হয়ত সংশ্লিষ্টBuildIdলোকেট করতে পারবে না। আমরা সাজেস্ট করি যে আপনি শেয়ার করা লাইব্রেরির জন্য স্ট্যান্ডার্ড লোকেশন ব্যবহার করার কথা বিবেচনা করুন।বিল্ড প্রসেস চলাকালীন আপনি যাতে
BuildIdস্ট্রিপ না করেন তা নিশ্চিত করুন।মনে রাখবেন যে নিম্নলিখিত সমস্যা সমাধানের পরামর্শ ANR এবং নেটিভ ক্র্যাশ উভয়ের ক্ষেত্রেই প্রযোজ্য।
আপনার বাইনারিতে
readelf -nরান করেBuildIdআছে কিনা তা চেক করুন। যদিBuildIdনা থাকে, তাহলে আপনার বিল্ড সিস্টেমের জন্য ফ্ল্যাগে-Wl,--build-idযোগ করুন।আপনার APK সাইজ কমানোর প্রচেষ্টায় আপনি অনিচ্ছাকৃতভাবে
BuildIdস্ট্রিপ করছেন কিনা তা চেক করুন।আপনি যদি কোনও লাইব্রেরির স্ট্রিপড ও আনস্ট্রিপড ভার্সন রাখেন, তাহলে আপনার কোডে সঠিক ভার্সনটি পয়েন্ট করতে ভুলবেন না।
Crashlytics ড্যাশবোর্ড এবং Google Play Console-এ ANR রিপোর্টের মধ্যে পার্থক্য
Google Play এবং Crashlytics-এর মধ্যে ANR-এর সংখ্যার মধ্যে অমিল থাকতে পারে। ANR ডেটা সংগ্রহ ও রিপোর্ট করার মেকানিজমে পার্থক্যের কারণে এটি প্রত্যাশিত। অ্যাপ পরের বার চালু হলে Crashlytics ANR-এর ব্যাপারে রিপোর্ট করে, যদিও Android Vitals, ANR হওয়ার পরেই ANR ডেটা পাঠায়।
এছাড়াও, Crashlytics শুধুমাত্র Android 11+ ভার্সনে চলা ডিভাইসে হওয়া ANR দেখায়, Google Play-এর সাথে তুলনা করলে, এটি Google Play পরিষেবা এবং ডেটা সংগ্রহের সম্মতি গ্রহণ করা ডিভাইস থেকে ANR দেখায়।
.java সমস্যা হিসেবে লেবেল করা .ktটি ফাইল থেকে
আমি কেন ক্র্যাশ দেখতে পাচ্ছি?
কোনও অ্যাপ যদি এমন কোনও অবফাসকেটর ব্যবহার করে যা ফাইল এক্সটেনশন প্রকাশ করে না, তাহলে
Crashlytics ডিফল্ট হিসেবে .java ফাইল এক্সটেনশন সহ প্রতিটি সমস্যা তৈরি করে।
যাতে Crashlytics সঠিক ফাইল এক্সটেনশন সহ সমস্যা তৈরি করতে পারে, আপনার অ্যাপ নিম্নলিখিত সেট-আপ ব্যবহার করছে কিনা তা নিশ্চিত করুন:
- Android Gradle 4.2.0 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করে
- অবফিউসকেশন চালু রেখে R8 ব্যবহার করে। আপনার অ্যাপ R8-এ আপডেট করতে, এই ডকুমেন্টেশন অনুসরণ করুন।
মনে রাখবেন, উপরে বর্ণিত সেট-আপে আপডেট করার পরে, আপনি হয়ত নতুন .ktটি সমস্যা দেখতে শুরু করবেন
যা আগে থেকে থাকা .javaটি সমস্যার ডুপ্লিকেট। সেই পরিস্থিতি সম্পর্কে আরও জানতে
প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।
আমি কেন
.ktটি সমস্যা দেখতে পাচ্ছি যা আগে থেকেই থাকা
.javaটি সমস্যার ডুপ্লিকেট?
২০২১ সালের ডিসেম্বরের মাঝামাঝি থেকে, Crashlytics Kotlin ব্যবহার করে এমন অ্যাপ্লিকেশনের জন্য উন্নত সহায়তা প্রদান করে।
সম্প্রতি পর্যন্ত, উপলভ্য অবফাসকেটর ফাইল এক্সটেনশন প্রকাশ করেনি, তাই
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 প্লাগ-ইন v3-এ কীভাবে আপগ্রেড করবেন?
Crashlytics Gradle প্লাগ-ইনের লেটেস্ট রিলিজ হল একটি মেজর ভার্সন (v3.0.0) এবং এটি Gradle ও Android Gradle প্লাগ-ইনের পুরনো ভার্সনের জন্য সহায়তা বন্ধ করে SDK-কে আধুনিক করে তোলে। এছাড়াও, এই রিলিজে করা পরিবর্তনগুলি AGP v8.1+ এর সাথে সম্পর্কিত সমস্যাগুলি সমাধান করে এবং নেটিভ অ্যাপ এবং কাস্টমাইজড বিল্ডের জন্য সহায়তা উন্নত করে।
ন্যূনতম প্রয়োজনীয়তা
Crashlytics Gradle প্লাগ-ইন 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 প্লাগ-ইন একটি
কাস্টমাইজ করা ব্রেকপ্যাড সিম্বল ফাইল জেনারেটর বান্ডেল করে।
আপনি যদি ব্রেকপ্যাড সিম্বল ফাইল তৈরি করার জন্য নিজের বাইনারি ব্যবহার করতে চান (যেমন, আপনি যদি সোর্স থেকে আপনার বিল্ড চেনে সব নেটিভ এক্সিকিউটেবল তৈরি করতে চান), তাহলে এক্সিকিউটেবলের পাথ নির্দিষ্ট করতে ঐচ্ছিক symbolGeneratorBinary এক্সটেনশন প্রপার্টি
ব্যবহার করুন।
আপনি দুটি উপায়ের মধ্যে একটির মাধ্যমে ব্রেকপ্যাড সিম্বল ফাইল জেনারেটর বাইনারির পাথ নির্দিষ্ট করতে পারেন:
বিকল্প ১: আপনার
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 প্রপার্টি ফাইলের একটি প্রপার্টি লাইনের মাধ্যমে পাথ নির্দিষ্ট করুন
এক্সিকিউটেবল ফাইলের পাথ নির্দিষ্ট করতে আপনি
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 ব্যবহার করতে পারেন। এই বিকল্পটি ব্যতিক্রমটি প্রিন্ট করে
ইউনিটি কনসোলে বিকল্প ১-এর মতো, কিন্তু এটি ব্যতিক্রমও ছুড়ে দেয়
(এটি এখনও ছুড়ে দেওয়া হয়েছে বা ধরা হয়েছে কিনা)। এটি নন-লোকালি
সমস্যা দেখায়। এর অর্থ হল, try-catch ব্লক সহ আশেপাশের Debug.LogException(exception)
এখনও একটি আনক্যাচড এক্সেপশন দেখায়।
তাই, আপনি যদি নিম্নলিখিত সবকটি কাজ করতে চান, তবেই
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 ডেটাসেট কোথায় আছে?
BigQuery-এ ডেটা এক্সপোর্ট সেট-আপ করার সময় আপনি যে ডেটাসেট লোকেশন বেছে নিয়েছিলেন, Firebase সেখানে ডেটা এক্সপোর্ট করে।
এই লোকেশন Crashlytics ডেটাসেট এবং Firebase সেশন ডেটাসেট (সেশন ডেটা এক্সপোর্ট করার জন্য চালু করা থাকলে) দুটির ক্ষেত্রেই প্রযোজ্য।
এই লোকেশন শুধুমাত্র BigQuery-এ এক্সপোর্ট করা ডেটার ক্ষেত্রে প্রযোজ্য এবং Firebase কনসোলের Crashlytics ড্যাশবোর্ডে বা Android Studio-তে ব্যবহারের জন্য সেভ করা ডেটার লোকেশনের উপর এর কোনও প্রভাব পড়ে না।
ডেটাসেট তৈরি করার পরে, এর লোকেশন পরিবর্তন করা যাবে না, তবে আপনি অন্য লোকেশনে ডেটাসেট কপি করতে পারবেন অথবা অন্য লোকেশনে ম্যানুয়ালি ডেটাসেট সরিয়ে (আবার তৈরি) নিতে পারবেন। আরও জানতে, আগে থেকে থাকা এক্সপোর্টের লোকেশন পরিবর্তন করুন বিকল্প দেখুন।
BigQuery-এর জন্য নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করার পরে সমস্যা হচ্ছে?
২০২৪ সালের অক্টোবরের মাঝামাঝি সময়ে, Crashlytics BigQuery-এ Crashlytics ডেটার ব্যাচ এক্সপোর্ট করার জন্য একটি নতুন পরিকাঠামো চালু করেছে।
২ মার্চ, ২০২৬ থেকে সমস্ত Firebase প্রোজেক্ট অটোমেটিক নতুন ব্যাচ এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করা হয়েছে।
পুরনো এক্সপোর্ট ইনফ্রাস্ট্রাকচার এবং নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারের মধ্যে গুরুত্বপূর্ণ পার্থক্য
নতুন পরিকাঠামো মার্কিন যুক্তরাষ্ট্রের বাইরে Crashlyticsটি ডেটাসেট লোকেশনকে সমর্থন করে।
অক্টোবর ২০২৪-এর মাঝামাঝি সময়ের আগে এক্সপোর্ট চালু করা হয়েছে এবং নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচারে আপগ্রেড করা হয়েছে — আপনি এখন বিকল্প হিসেবে ডেটা এক্সপোর্টের লোকেশন পরিবর্তন করতে পারবেন।
অক্টোবর ২০২৪-এর মাঝামাঝি বা তার পরে এক্সপোর্ট চালু করা হয়েছে — সেট-আপ করার সময় আপনাকে ডেটা এক্সপোর্টের জন্য লোকেশন বেছে নিতে প্রম্পট করা হয়েছিল।
আপনি এক্সপোর্ট করার সুবিধা চালু করার আগে থেকে ডেটার ব্যাকফিল নতুন পরিকাঠামোয় কাজ করে না।
পুরানো ইনফ্রাস্ট্রাকচার, আপনি এক্সপোর্ট চালু করার তারিখের ৩০ দিন আগে পর্যন্ত ব্যাকফিল সাপোর্ট করত।
নতুন পরিকাঠামো গত ৩০ দিন পর্যন্ত ব্যাকফিল অথবা আপনি BigQuery-এ এক্সপোর্ট করার সুবিধা চালু করার পর থেকে সবচেয়ে সাম্প্রতিক তারিখ পর্যন্ত (যেটি সবচেয়ে সাম্প্রতিক) ডেটা ব্যাকফিল করতে পারে।
নতুন ইনফ্রাস্ট্রাকচার আপনার Firebase প্রোজেক্টে Firebase অ্যাপের জন্য সেট করা শনাক্তকারী ব্যবহার করে BigQuery ব্যাচ টেবিলের নাম দেয়।
পুরানো ইনফ্রাস্ট্রাকচার আপনার অ্যাপের বাইনারিতে বান্ডিল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে ব্যাচ টেবিলে ডেটা লিখেছে।
নতুন ইনফ্রাস্ট্রাকচার, বান্ডিল আইডি বা প্যাকেজের নামের উপর ভিত্তি করে ব্যাচ টেবিলে ডেটা লেখে যা আপনার 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,
client_namespaceভ্যালু ব্যবহার করে ব্যাচ টেবিলের নাম তৈরি করে, যেখানে প্রতিটি লিঙ্ক করা Firebase অ্যাপ ডেটা লেখে।Firebase অ্যাপের gmp_app_id খুঁজুন যার জন্য আপনি ডিফল্ট সেটিংস ওভাররাইড করতে চান। এর client_namespace ভ্যালু পরিবর্তন করে সেই টেবিলের নাম লিখুন যেখানে আপনি Firebase অ্যাপকে লিখতে চান (সাধারণত এটি হল সেই লিগ্যাসি টেবিলের নাম যেখানে অ্যাপটি লিগ্যাসি এক্সপোর্ট ইনফ্রাস্ট্রাকচারের মাধ্যমে লিখছিল)।
কনফিগারেশনে করা পরিবর্তন সেভ করুন।
আপনার লিগ্যাসি টেবিলে যেসব দিনের ডেটা নেই, সেগুলির জন্য ব্যাকফিল শিডিউল করুন।
ব্যাকফিল করা হয়ে গেলে, নতুন টেবিলটি মুছে দিন যা নতুন এক্সপোর্ট ইনফ্রাস্ট্রাকচার অটোমেটিক তৈরি করেছে।