این صفحه، راهنمایی برای عیبیابی و پاسخ به سوالات متداول در مورد استفاده از Crashlytics را ارائه میدهد. اگر نمیتوانید آنچه را که به دنبالش هستید پیدا کنید یا به کمک بیشتری نیاز دارید، با پشتیبانی Firebase تماس بگیرید.
عیبیابی عمومی/سوالات متداول
ممکن است متوجه دو فرمت مختلف برای مشکلات ذکر شده در جدول مشکلات خود در کنسول Firebase شوید. و همچنین ممکن است متوجه ویژگیای به نام "انواع" در برخی از مشکلات خود شوید. دلیل آن این است!
در اوایل سال ۲۰۲۳، ما یک موتور تحلیل بهبود یافته برای گروهبندی رویدادها و همچنین یک طراحی بهروز شده و برخی ویژگیهای پیشرفته برای مسائل جدید (مانند انواع مختلف!) را ارائه دادیم. برای جزئیات بیشتر، به پست وبلاگ اخیر ما مراجعه کنید، اما میتوانید نکات برجسته را در زیر بخوانید.
Crashlytics تمام رویدادهای برنامه شما (مانند خرابیها، خطاهای غیرفاجعهآمیز و ANRها) را تجزیه و تحلیل میکند و گروههایی از رویدادها به نام مشکلات (issues ) ایجاد میکند - همه رویدادهای یک مشکل (issue) یک نقطه شکست مشترک دارند.
برای گروهبندی رویدادها در این مسائل، موتور تحلیل بهبود یافته اکنون جنبههای زیادی از رویداد، از جمله فریمهای موجود در ردیابی پشته، پیام استثنا، کد خطا و سایر ویژگیهای پلتفرم یا نوع خطا را بررسی میکند.
با این حال، در این گروه از رویدادها، ممکن است ردپاهای پشته منجر به خرابی متفاوت باشند. یک ردپای پشته متفاوت میتواند به معنای علت ریشهای متفاوت باشد. برای نمایش این تفاوت احتمالی در یک مسئله، اکنون انواعی را در مسائل ایجاد میکنیم - هر نوع، زیرگروهی از رویدادها در یک مسئله است که نقطه خرابی یکسانی دارند و یک ردپای پشته مشابه. با انواع، میتوانید رایجترین ردپاهای پشته را در یک مسئله اشکالزدایی کنید و تعیین کنید که آیا علل ریشهای متفاوتی منجر به خرابی میشوند یا خیر.
در اینجا چیزی است که با این پیشرفتها تجربه خواهید کرد:
فرادادههای اصلاحشده در ردیف مشکل نمایش داده میشوند
اکنون درک و اولویتبندی مشکلات در برنامه شما آسانتر است.مسائل تکراری کمتر
تغییر شماره خط منجر به مشکل جدیدی نمیشود.اشکالزدایی آسانتر مسائل پیچیده با علل ریشهای مختلف
از انواع مختلف برای اشکالزدایی رایجترین ردپاهای پشته در یک مسئله استفاده کنید.هشدارها و سیگنالهای معنادارتر
یک مشکل جدید در واقع نشان دهنده یک باگ جدید است.جستجوی قدرتمندتر
هر شماره شامل فرادادههای قابل جستجوی بیشتری مانند نوع استثنا و نام بسته است.
نحوهی اعمال این بهبودها به شرح زیر است:
وقتی رویدادهای جدیدی از برنامه شما دریافت میکنیم، بررسی میکنیم که آیا با مشکل موجود مطابقت دارند یا خیر.
اگر هیچ تطابقی وجود نداشته باشد، ما به طور خودکار الگوریتم گروهبندی رویداد هوشمندتر خود را برای رویداد اعمال میکنیم و یک issue جدید با طراحی فراداده اصلاحشده ایجاد میکنیم.
این اولین بهروزرسانی بزرگی است که ما در گروهبندی رویدادهای خود انجام میدهیم. اگر بازخوردی دارید یا با مشکلی مواجه شدهاید، با ثبت گزارش به ما اطلاع دهید.
اگر گزارشهای breadcrumb را مشاهده نمیکنید ( iOS+ | Android | Flutter | Unity )، توصیه میکنیم پیکربندی برنامه خود را برای Google Analytics بررسی کنید. مطمئن شوید که شرایط زیر را برآورده میکنید:
شما اشتراکگذاری دادهها را برای Google Analytics فعال کردهاید. برای اطلاعات بیشتر در مورد این تنظیم، به مدیریت تنظیمات اشتراکگذاری دادههای آنالیتیکس خود مراجعه کنید.
شما کیت توسعه نرمافزار Firebase برای Google Analytics را به برنامه خود اضافه کردهاید: iOS+ | اندروید | فلاتر | یونیتی .
این SDK باید علاوه بر Crashlytics SDK اضافه شود.شما از آخرین نسخههای Firebase SDK برای تمام محصولاتی که در برنامه خود استفاده میکنید ( iOS+ | Android | Flutter | Unity ) استفاده میکنید.
برای پلتفرمهای اپل و برنامههای اندروید، به خصوص بررسی کنید که حداقل از نسخه زیر از Firebase SDK برای Google Analytics استفاده میکنید:
iOS+ — نسخه ۶.۳.۱+ (نسخه ۸.۹.۰+ برای macOS و tvOS) | اندروید — نسخه 17.2.3+ ( BoM v24.7.1+).
اگر هشدارهای سرعت را نمیبینید، مطمئن شوید که از ... استفاده میکنید.
اگر معیارهای بدون خرابی (مانند کاربران و جلسات بدون خرابی) را نمیبینید یا معیارهای غیرقابل اعتمادی را میبینید، موارد زیر را بررسی کنید:
مطمئن شوید که از ... استفاده میکنید
مطمئن شوید که تنظیمات جمعآوری دادههای شما بر کیفیت معیارهای بدون خرابی شما تأثیر نمیگذارد:
اگر با غیرفعال کردن گزارش خودکار خرابی، گزارشدهی اختیاری را فعال کنید ، اطلاعات خرابی فقط از کاربرانی که صریحاً در جمعآوری دادهها مشارکت داشتهاند، میتواند به Crashlytics ارسال شود. بنابراین، دقت معیارهای بدون خرابی تحت تأثیر قرار خواهد گرفت زیرا Crashlytics فقط اطلاعات خرابی این کاربران انتخابی (و نه همه کاربران شما) را دارد. این بدان معناست که معیارهای بدون خرابی شما ممکن است کمتر قابل اعتماد باشند و کمتر نشاندهنده پایداری کلی برنامه شما باشند.
اگر جمعآوری خودکار دادهها را غیرفعال کردهاید، میتوانید
sendUnsentReportsبرای ارسال گزارشهای ذخیرهشده روی دستگاه به Crashlytics استفاده کنید. استفاده از این روش، دادههای خرابی را به Crashlytics ارسال میکند، اما دادههای جلسات را نه، که باعث میشود نمودارهای کنسول مقادیر کم یا صفر را برای معیارهای بدون خرابی نشان دهند.
به بخش «معیارهای بدون خرابی را درک کنید» مراجعه کنید.
یادداشتها به اعضای پروژه اجازه میدهند تا در مورد مسائل خاص با سوالات، بهروزرسانی وضعیت و غیره اظهار نظر کنند.
وقتی یکی از اعضای پروژه یادداشتی ارسال میکند، ایمیل حساب گوگل او روی آن یادداشت برچسبگذاری میشود. این آدرس ایمیل، به همراه یادداشت، برای همه اعضای پروژه که دسترسی مشاهده یادداشت را دارند، قابل مشاهده است.
در ادامه، دسترسیهای لازم برای مشاهده، نوشتن و حذف یادداشتها شرح داده شده است:
اعضای پروژه با هر یک از نقشهای زیر میتوانند یادداشتهای موجود را مشاهده و حذف کنند و یادداشتهای جدیدی در مورد یک مسئله بنویسند.
- مالک یا ویرایشگر پروژه، مدیر Firebase ، مدیر Quality یا مدیر Crashlytics
اعضای پروژه با هر یک از نقشهای زیر میتوانند یادداشتهای ارسال شده در مورد یک مسئله را مشاهده کنند، اما نمیتوانند یادداشتی را حذف یا بنویسند.
- نمایشگر پروژه، نمایشگر فایربیس ، نمایشگر کیفیت یا نمایشگر Crashlytics
زمانی که قبلاً یک مشکل را بستهاید، اما Crashlytics گزارش جدیدی مبنی بر وقوع مجدد آن مشکل دریافت میکند، یک مشکل پسرفت داشته است. Crashlytics بهطور خودکار این مشکلات پسرفتشده را دوباره باز میکند تا بتوانید آنها را متناسب با برنامه خود برطرف کنید.
در اینجا یک سناریوی مثالی آورده شده است که توضیح میدهد چگونه Crashlytics یک مسئله را به عنوان یک رگرسیون طبقهبندی میکند:
- برای اولین بار، Crashlytics گزارشی از خرابی مربوط به خرابی "A" دریافت میکند. Crashlytics یک شماره مربوطه برای آن خرابی (شماره "A") ایجاد میکند.
- شما این اشکال را سریع برطرف میکنید، مشکل «الف» را میبندید و سپس نسخه جدیدی از برنامه خود را منتشر میکنید.
- Crashlytics پس از اینکه مشکل را بستید، گزارش دیگری در مورد مشکل «الف» دریافت میکند.
- اگر گزارش از نسخهای از برنامه باشد که Crashlytics هنگام بستن مشکل از آن مطلع بوده است (به این معنی که آن نسخه برای هرگونه خرابی، گزارش خرابی ارسال کرده است)، Crashlytics مشکل را به عنوان مشکل رفعشده در نظر نمیگیرد. مشکل بسته باقی خواهد ماند.
- اگر گزارش از نسخهای از برنامه باشد که Crashlytics هنگام بستن مشکل از آن اطلاعی نداشته است (به این معنی که آن نسخه هرگز هیچ گزارش خرابی برای هیچ خرابی ارسال نکرده است)، Crashlytics مشکل را رفع شده در نظر میگیرد و دوباره آن را باز میکند.
وقتی یک مشکل دوباره حل میشود، ما یک هشدار تشخیص حل مشکل ارسال میکنیم و یک سیگنال حل مشکل به مشکل اضافه میکنیم تا به شما اطلاع دهیم که Crashlytics مشکل را دوباره باز کرده است. اگر نمیخواهید مشکلی به دلیل الگوریتم حل مشکل ما دوباره باز شود، به جای بستن آن، آن را «بیصدا» کنید.
اگر گزارشی از نسخه قدیمی برنامه باشد که هنگام بستن مشکل، هیچ گزارش خرابی ارسال نکرده باشد، Crashlytics مشکل را برطرف شده در نظر میگیرد و آن را دوباره باز میکند.
این وضعیت میتواند در شرایط زیر اتفاق بیفتد: شما یک اشکال را برطرف کردهاید و نسخه جدیدی از برنامه خود را منتشر کردهاید، اما هنوز کاربرانی در نسخههای قبلی بدون رفع اشکال دارید. اگر به طور اتفاقی، یکی از آن نسخههای قبلی هنگام بستن مشکل، هیچ گزارش خرابی ارسال نکرده باشد و آن کاربران با اشکال مواجه شوند، آن گزارشهای خرابی باعث ایجاد یک مشکل رگرسیون میشوند.
اگر نمیخواهید به دلیل الگوریتم رگرسیون ما، مسئله دوباره باز شود، به جای بستن آن، آن را «بیصدا» کنید.
اگر پروژه شما از Crashlytics در کنار SDK Google Mobile Ads استفاده میکند، احتمالاً گزارشدهندههای خرابی هنگام ثبت کنترلکنندههای خطا تداخل ایجاد میکنند. برای رفع این مشکل، با فراخوانی disableSDKCrashReporting ، گزارش خرابی را در SDK Mobile Ads غیرفعال کنید.
پس از اینکه Crashlytics به BigQuery پیوند دادید، مجموعه دادههای جدیدی که ایجاد میکنید، صرف نظر از موقعیت مکانی پروژه Firebase شما، به طور خودکار در ایالات متحده قرار میگیرند.
پشتیبانی ویژه پلتفرم
بخشهای زیر پشتیبانی از عیبیابی و سوالات متداول مختص پلتفرم را ارائه میدهند: iOS+ | اندروید | یونیتی .
پشتیبانی از پلتفرمهای اپل
برای آپلود dSYM های پروژه خود و دریافت خروجی واضح، موارد زیر را بررسی کنید:
مطمئن شوید که مرحله ساخت پروژه شما شامل اسکریپت اجرای Crashlytics است، که به Xcode اجازه میدهد dSYM های پروژه شما را در زمان ساخت آپلود کند (برای دستورالعملهای افزودن اسکریپت، بخش «راهنمای اولیه Crashlytics » را مطالعه کنید). پس از بهروزرسانی پروژه، یک کرش اجباری ایجاد کنید و تأیید کنید که کرش در داشبورد Crashlytics ظاهر میشود.
اگر در کنسول Firebase هشدار "Missing dSYM" را مشاهده کردید، Xcode را بررسی کنید تا مطمئن شوید که dSYM های لازم برای ساخت را به درستی تولید میکند .
اگر Xcode به درستی dSYM ها را تولید میکند، و شما هنوز dSYM های از دست رفته را میبینید، احتمالاً ابزار اجرای اسکریپت هنگام آپلود dSYM ها گیر کرده است. در این حالت، هر یک از موارد زیر را امتحان کنید:
مطمئن شوید که از آخرین نسخه Crashlytics استفاده میکنید.
فایلهای dSYM مفقود شده را به صورت دستی آپلود کنید:
- گزینه ۱: از گزینه «کشیدن و رها کردن» مبتنی بر کنسول در تب dSYMs برای آپلود یک آرشیو زیپ حاوی فایلهای dSYM مفقود شده استفاده کنید.
- گزینه ۲: از اسکریپت
upload-symbolsبرای آپلود فایلهای dSYM مفقود شده، برای UUID های ارائه شده در تب dSYMs، استفاده کنید.
اگر همچنان dSYM های از دست رفته را مشاهده میکنید، یا آپلودها هنوز ناموفق هستند، با پشتیبانی Firebase تماس بگیرید و حتماً گزارشهای خود را وارد کنید.
اگر به نظر میرسد که نشانههای پشته شما به خوبی نمادینسازی نشدهاند، موارد زیر را بررسی کنید:
اگر فریمهای کتابخانه برنامه شما فاقد ارجاع به کد برنامه هستند، مطمئن شوید که
-fomit-frame-pointerبه عنوان یک پرچم کامپایل تنظیم نشده است.اگر چندین فریم
(Missing)برای کتابخانه برنامه خود مشاهده میکنید، بررسی کنید که آیا dSYM های اختیاری به عنوان گمشده (برای نسخه برنامه آسیبدیده) در برگه dSYM های Crashlytics در کنسول Firebase وجود دارد یا خیر. در این صورت، مرحله عیبیابی "هشدار dSYM گمشده" را در بخش سوالات متداول dSYM های گمشده/ آپلود نشده در این صفحه دنبال کنید. توجه داشته باشید که آپلود این dSYM ها، خرابیهایی را که قبلاً رخ دادهاند، نمادین نمیکند، اما این به تضمین نمادینسازی برای خرابیهای آینده کمک میکند.
بله، میتوانید Crashlytics در پروژههای macOS و tvOS پیادهسازی کنید. مطمئن شوید که نسخه ۸.۹.۰+ از Firebase SDK for Google Analytics را شامل میشود تا خرابیها به معیارهای جمعآوریشده توسط Google Analytics (کاربران بدون خرابی، آخرین نسخه، هشدارهای سرعت و گزارشهای breadcrumb) دسترسی داشته باشند.
اکنون میتوانید خرابیها را برای چندین برنامه در یک پروژه Firebase گزارش دهید، حتی زمانی که برنامهها برای پلتفرمهای مختلف اپل (مثلاً iOS، tvOS و Mac Catalyst) ساخته شدهاند. پیش از این، اگر برنامهها دارای شناسه بسته یکسانی بودند، باید آنها را به پروژههای Firebase جداگانه تقسیم میکردید.
پشتیبانی از اندروید
Crashlytics از گزارشدهی ANR برای برنامههای اندروید از دستگاههایی که اندروید ۱۱ و بالاتر را اجرا میکنند، پشتیبانی میکند. API زیربنایی که ما برای جمعآوری ANRها استفاده میکنیم ( getHistoricalProcessExitReasons ) نسبت به رویکردهای مبتنی بر SIGQUIT یا watchdog قابل اعتمادتر است. این API فقط در دستگاههای اندروید ۱۱+ در دسترس است.
اگر برخی از ANR های شما BuildId های خود را ندارند، به روش زیر عیب یابی کنید:
مطمئن شوید که از نسخه بهروز Crashlytics Android SDK و افزونه Crashlytics Gradle استفاده میکنید.
اگر
BuildIdهای اندروید ۱۱ و برخی از ANR های اندروید ۱۲ را ندارید، احتمالاً از SDK، افزونه Gradle یا هر دوی آنها استفاده میکنید که قدیمی هستند. برای جمعآوری صحیحBuildIdهای این ANR ها، باید از نسخههای زیر استفاده کنید:- Crashlytics Android SDK نسخه ۱۸.۳.۵+ ( Firebase BoM نسخه ۳۱.۲.۲+)
- افزونه Crashlytics Gradle نسخه ۲.۹.۴+
بررسی کنید که آیا از مکان غیر استانداردی برای کتابخانههای اشتراکی خود استفاده میکنید یا خیر.
اگر فقط
BuildIdهای کتابخانههای اشتراکی برنامهتان را ندارید، احتمالاً از مکان استاندارد و پیشفرض برای کتابخانههای اشتراکی استفاده نمیکنید. در این صورت، Crashlytics ممکن است نتواندBuildIdمرتبط را پیدا کند. توصیه میکنیم از مکان استاندارد برای کتابخانههای اشتراکی استفاده کنید.مطمئن شوید که
BuildIdرا در طول فرآیند ساخت حذف نمیکنید.توجه داشته باشید که نکات عیبیابی زیر هم برای ANRها و هم برای خرابیهای بومی (native crashes) کاربرد دارند.
با اجرای
readelf -nروی فایلهای باینری خود، وجودBuildIdرا بررسی کنید. اگرBuildIdها وجود ندارند،-Wl,--build-idرا به پرچمهای سیستم ساخت خود اضافه کنید.بررسی کنید که ناخواسته برای کاهش حجم APK،
BuildIdها را حذف نکنید.اگر نسخههای ساده و بدون تغییر یک کتابخانه را نگه میدارید، حتماً در کد خود به نسخه صحیح اشاره کنید.
ممکن است بین تعداد ANR های گوگل پلی و Crashlytics اختلاف وجود داشته باشد. این به دلیل تفاوت در مکانیسم جمعآوری و گزارش دادههای ANR قابل پیشبینی است. Crashlytics دادههای ANR را هنگام راهاندازی مجدد برنامه گزارش میدهد، در حالی که Android Vitals دادههای ANR را پس از وقوع ANR ارسال میکند.
علاوه بر این، Crashlytics فقط ANRهایی را نمایش میدهد که در دستگاههای دارای اندروید ۱۱+ رخ میدهند، در مقایسه با Google Play که ANRهایی را از دستگاههایی با سرویسهای Google Play و رضایت جمعآوری دادهها که پذیرفته شدهاند، نمایش میدهد.
وقتی یک برنامه از یک مبهمساز استفاده میکند که پسوند فایل را افشا نمیکند، Crashlytics به طور پیشفرض هر مشکل را با پسوند فایل .java تولید میکند.
برای اینکه Crashlytics بتواند با پسوند صحیح فایل مشکل ایجاد کند، مطمئن شوید که برنامه شما از تنظیمات زیر استفاده میکند:
- از اندروید Gradle نسخه ۴.۲.۰ یا بالاتر استفاده میکند
- از R8 با قابلیت مبهمسازی فعال استفاده میکند. برای بهروزرسانی برنامه خود به R8، این مستندات را دنبال کنید.
توجه داشته باشید که پس از بهروزرسانی به تنظیمات شرح داده شده در بالا، ممکن است با مشکلات جدید .kt مواجه شوید که تکرار مشکلات موجود .java هستند. برای کسب اطلاعات بیشتر در مورد این شرایط، به سوالات متداول مراجعه کنید.
از اواسط دسامبر ۲۰۲۱، Crashlytics پشتیبانی از برنامههایی که از Kotlin استفاده میکنند را بهبود بخشید.
تا همین اواخر، ابزارهای مبهمسازی موجود، پسوند فایل را نمایش نمیدادند، بنابراین Crashlytics هر مشکل را به طور پیشفرض با پسوند فایل .java تولید میکرد. با این حال، از اندروید Gradle 4.2.0 به بعد، R8 از پسوند فایل پشتیبانی میکند.
با این بهروزرسانی، Crashlytics اکنون میتواند تشخیص دهد که آیا هر کلاس مورد استفاده در برنامه با کاتلین نوشته شده است یا خیر و نام فایل صحیح را در امضای مشکل لحاظ کند. اگر برنامه شما تنظیمات زیر را داشته باشد، اکنون خرابیها به درستی به فایلهای .kt (به صورت مناسب) نسبت داده میشوند:
- برنامه شما از اندروید Gradle نسخه ۴.۲.۰ یا بالاتر استفاده میکند.
- برنامه شما از 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
پشتیبانی ویژه از Android-NDK
زنجیره ابزارهای LLVM و GNU پیشفرضها و رویههای متمایزی برای بخش فقط خواندنی فایلهای باینری برنامه شما دارند که ممکن است باعث ایجاد ردپاهای پشتهای متناقض در کنسول Firebase شود. برای کاهش این مشکل، پرچمهای پیونددهنده زیر را به فرآیند ساخت خود اضافه کنید:
اگر از لینکر
lldاز مجموعه ابزار LLVM استفاده میکنید، موارد زیر را اضافه کنید:-Wl,--no-rosegmentاگر از لینکر
ld.goldاز مجموعه ابزار GNU استفاده میکنید، موارد زیر را اضافه کنید:-Wl,--rosegment
اگر هنوز شاهد ناسازگاریهای ردیابی پشته هستید (یا اگر هیچ یک از پرچمها به زنجیره ابزار شما مربوط نمیشوند)، سعی کنید موارد زیر را به فرآیند ساخت خود اضافه کنید:
-fno-omit-frame-pointer افزونهی Crashlytics یک مولد فایل نماد Breakpad سفارشیسازیشده را در خود جای داده است. اگر ترجیح میدهید از فایل باینری خودتان برای تولید فایلهای نماد Breakpad استفاده کنید (برای مثال، اگر ترجیح میدهید تمام فایلهای اجرایی بومی را در زنجیرهی ساخت خود از منبع بسازید)، از ویژگی افزونهی اختیاری symbolGeneratorBinary برای مشخص کردن مسیر فایل اجرایی استفاده کنید.
شما میتوانید مسیر فایل باینری تولیدکننده فایل نماد Breakpad را به یکی از دو روش زیر مشخص کنید:
گزینه ۱ : مسیر را از طریق افزونه
firebaseCrashlyticsدر فایلbuild.gradleخود مشخص کنیدموارد زیر را به فایل
build.gradle.ktsدر سطح برنامه خود اضافه کنید:افزونه Gradle نسخه ۳.۰.۰+
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
Firebase Crashlytics NDK از ARMv5 (armeabi) پشتیبانی نمیکند. پشتیبانی از این ABI از NDK r17 حذف شده است.
پشتیبانی از یونیتی
اگر از Unity IL2CPP استفاده میکنید و ردپاهای پشته بدون نماد را مشاهده میکنید، موارد زیر را امتحان کنید:
مطمئن شوید که از نسخه ۸.۶.۱ یا بالاتر Crashlytics Unity SDK استفاده میکنید.
مطمئن شوید که برای تولید و آپلود فایل نماد خود، دستور
crashlytics:symbols:uploadدر Firebase CLI را تنظیم و اجرا کردهاید.شما باید هر بار که یک نسخه آزمایشی یا هر نسخهای که میخواهید ردپاهای پشته نمادین آن را در کنسول Firebase ببینید، ایجاد میکنید، این دستور CLI را اجرا کنید. برای کسب اطلاعات بیشتر به بخش «گزارشهای خرابی خوانا» مراجعه کنید.
بله، Crashlytics میتواند ردیابیهای پشته نمادین را برای برنامههای شما که از IL2CPP استفاده میکنند، نمایش دهد. این قابلیت برای برنامههای منتشر شده در پلتفرمهای اندروید یا اپل در دسترس است. در اینجا کاری که باید انجام دهید آمده است:
مطمئن شوید که از نسخه ۸.۶.۰ یا بالاتر Crashlytics Unity SDK استفاده میکنید.
وظایف لازم برای پلتفرم خود را انجام دهید:
برای برنامههای پلتفرم اپل : هیچ اقدام خاصی لازم نیست. برای برنامههای پلتفرم اپل، افزونه Firebase Unity Editor به طور خودکار پروژه Xcode شما را برای آپلود نمادها پیکربندی میکند.
برای برنامههای اندروید : مطمئن شوید که برای ایجاد و آپلود فایل نماد خود، دستور
crashlytics:symbols:uploadدر Firebase CLI را تنظیم و اجرا کردهاید.شما باید هر بار که یک نسخه آزمایشی یا هر نسخهای که میخواهید ردپاهای پشته نمادین آن را در کنسول Firebase ببینید، ایجاد میکنید، این دستور CLI را اجرا کنید. برای کسب اطلاعات بیشتر به بخش «گزارشهای خرابی خوانا» مراجعه کنید.
گزارش استثنائاتِ بررسی نشده به عنوان خطاهای مهلک
Crashlytics میتواند استثنائاتِ نادیده گرفته شده را به عنوان خطاهای مهلک گزارش دهد (از نسخه ۱۰.۴.۰ کیت توسعه نرمافزار Unity). سوالات متداول زیر به توضیح منطق و بهترین شیوههای استفاده از این ویژگی کمک میکند.
با گزارش استثنائاتِ شناسایینشده به عنوان مواردِ بحرانی، شما میتوانید نشانهی واقعبینانهتری از اینکه چه استثنائاتی ممکن است منجر به غیرقابلبازی شدن بازی شوند، حتی اگر برنامه همچنان به اجرا ادامه دهد، داشته باشید.
توجه داشته باشید که اگر شروع به گزارش تصادفات منجر به فوت کنید، احتمالاً درصد کاربران بدون تصادف (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 چاپ میکند، اما استثنا را نیز ارسال میکند (چه هنوز ارسال شده باشد و چه دریافت شده باشد). این خطا را به صورت غیر محلی ارسال میکند. این بدان معناست که حتی یک 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
//
}