تحديد المشاكل وحلّها في Crashlytics والأسئلة الشائعة بشأنها
تقدّم هذه الصفحة مساعدة في تحديد المشاكل وحلّها وإجابات عن
الأسئلة الشائعة حول استخدام Crashlytics. إذا كنت
يتعذّر عليك العثور على ما تبحث عنه أو تحتاج إلى مزيد من المساعدة، يُرجى الاتصال
دعم Firebase:
الإجراءات العامّة لتحديد المشاكل وحلّها/الأسئلة الشائعة
ظهور تنسيقات مختلفة
(و"صيغ" في بعض الأحيان) لبعض المشاكل في جدول المشاكل
قد تلاحظ تنسيقَين مختلفَين للمشاكل المدرَجة في جدول المشاكل
في وحدة تحكّم Firebase. وقد تلاحظ أيضًا ميزة تُسمى
"الصيغ" ضمن بعض مشاكلك. إليك السبب.
في أوائل العام 2023، طرحنا محرّك تحليل محسّن لتجميع الأحداث
بالإضافة إلى تصميم محدّث وبعض الميزات المتقدمة للمشكلات الجديدة (مثل
من الأشكال المختلفة!). اطّلِع على أحدث فيديوهاتنا
مشاركة مدونة
عن جميع التفاصيل، ولكن يمكنك قراءة أدناه للحصول على النقاط البارزة.
يحلّل Crashlytics جميع الأحداث من تطبيقك (مثل الأعطال والأعطال غير المميتة
وأخطاء ANR) وينشئ مجموعات من الأحداث تُسمى المشاكل، وجميع الأحداث في مشكلة
معيّنة لها نقطة فشل مشتركة.
لتجميع الأحداث في هذه المشاكل، يختبر محرك التحليل المحسّن الآن
على العديد من جوانب الحدث، بما في ذلك الإطارات في تقرير تتبُّع تسلسل استدعاء الدوال البرمجية،
ورسالة الاستثناء ورمز الخطأ والنظام الأساسي أو نوع الخطأ الآخر
وسماتها الشخصية.
ومع ذلك، ضمن هذه المجموعة من الأحداث، قد تختلف قوائم تتبُّع تسلسل استدعاء الدوال البرمجية التي تؤدّي إلى حدوث الخطأ. قد يشير تتبُّع تسلسل استدعاء الدوال البرمجية المختلف إلى سبب أساسي مختلف.
لتمثيل هذا الاختلاف المحتمَل ضمن مشكلة، ننشئ الآن
متغيرات ضمن المشاكل، وكلّ متغير هو مجموعة فرعية من الأحداث في مشكلة
تتضمّن نقطة الفشل نفسها وتتبُّع تسلسل استدعاء الدوالّ المشابه. باستخدام الصيغ،
يمكنك تصحيح أخطاء أكثر عمليات تتبُّع تسلسل استدعاء الدوال البرمجية شيوعًا ضمن مشكلة معيّنة وتحديد ما إذا كانت هناك أسباب أساسية مختلفة تؤدي إلى حدوث الخطأ.
في ما يلي الميزات التي ستستفيد منها من خلال هذه التحسينات:
البيانات الوصفية التي تمّ تجديدها والمعروضة ضمن صفّ المشكلة أصبح من الأسهل الآن فهم المشاكل في تطبيقك وتحديد أولوياتها.
عدد أقل من المشاكل المكرّرة لا يؤدي تغيير رقم السطر إلى ظهور مشكلة جديدة.
تصحيح الأخطاء في المشاكل المعقّدة التي لها أسباب أساسية مختلفة بسهولة أكبر يمكنك استخدام الصيغ لتصحيح الأخطاء في عمليات تتبُّع تسلسل استدعاء الدوال البرمجية الأكثر شيوعًا ضمن مشكلة معيّنة.
تنبيهات وإشارات أكثر وضوحًا تشير المشكلة الجديدة إلى خطأ جديد.
بحث أكثر فعالية تحتوي كل مشكلة على بيانات وصفية أكثر قابلية للبحث
مثل نوع الاستثناء واسم الحزمة.
في ما يلي طريقة طرح هذه التحسينات:
عندما نتلقّى أحداثًا جديدة من تطبيقك، سنتحقق مما إذا كانت تتطابق مع
مشكلة حالية.
إذا لم يتم العثور على نتيجة مطابِقة، سنطبّق تلقائيًا طريقة التجميع الأذكى للأحداث إلى مجموعات
على الحدث وإنشاء مشكلة جديدة في البيانات الوصفية التي تم تجديدها
التصميم.
هذا هو التعديل الكبير الأول الذي نجريه على تجميع الأحداث. إذا كنت
إذا كانت لديك ملاحظات أو واجهت أي مشاكل، يُرجى إبلاغنا بها من خلال
تقديم بلاغ.
عدم ظهور
مقاييس عدم حدوث الأعطال و/أو تنبيهات السرعة
إذا لم تظهر لك مقاييس خالية من الأعطال (مثل الجلسات والمستخدمين الذين لم تواجههم أعطال)
و/أو تنبيهات السرعة، فتأكد من استخدام
حزمة تطوير البرامج (SDK) لـ Crashlytics الإصدار 18.6.0 أو الإصدارات الأحدث (أو Firebase BoM v32.6.0 أو الإصدارات الأحدث).
عدم ظهور سجلّات شريط التنقل
إذا كنت لا ترى
سجلات شريط التنقل
ننصحك بالتحقّق من إعدادات تطبيقك لـ Google Analytics.
يجب استيفاء المتطلبات التالية:
تأكَّد بشكل خاص من استخدام على الأقل الإصدار التالي من
حزمة تطوير البرامج (SDK) لبرنامج Google Analytics: Android: الإصدار 17.2.3 أو الإصدارات الأحدث(الإصدار 24.7.1 من BoM أو الإصدارات الأحدث)
لماذا يتم الإبلاغ عن أخطاء ANR
فقط في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث؟
تتيح ميزة "Crashlytics" إعداد تقارير أخطاء ANR لتطبيقات Android من الأجهزة التي يتم تشغيلها.
الإصدار 11 من نظام Android والإصدارات الأحدث إنّ واجهة برمجة التطبيقات الأساسية التي نستخدمها لجمع أخطاء ANR
(getHistoricalProcessExitReasons)
هي أكثر موثوقية من الأساليب المستندة إلى SIGQUIT أو أدوات المراقبة. لا تتوفّر واجهة برمجة التطبيقات هذه إلا على أجهزة Android 11 والإصدارات الأحدث.
سبب عدم ظهور بعض أخطاء ANR
BuildId؟
إذا كانت بعض أخطاء ANR لا تتضمّن BuildId، يمكنك تحديد المشاكل وحلّها على النحو التالي:
تأكَّد من استخدام أحدث حزمة تطوير برامج (SDK) لنظام التشغيل Crashlytics Android.
Crashlytics إصدار المكوّن الإضافي لنظام Gradle
إذا لم تتوفّر BuildId لنظام التشغيل Android 11 وبعض أخطاء ANR في Android 12،
من المحتمل أنّك تستخدم حزمة تطوير برامج (SDK) أو مكوّن إضافي لنظام Gradle أو كليهما قديماً.
لجمع أخطاء BuildId بشكل صحيح لأخطاء ANR هذه، عليك استخدام ما يلي:
الإصدارات:
Crashlytics الإصدار 18.3.5 من حزمة تطوير البرامج (SDK) لنظام التشغيل Android والإصدارات الأحدث (الإصدار 31.2.2 من Firebase BoM والإصدارات الأحدث)
Crashlytics الإصدار 2.9.4 من المكوّن الإضافي Gradle أو الإصدارات الأحدث
تحقّق مما إذا كنت تستخدم موقعًا جغرافيًا غير عادي لمكتباتك المشتركة.
إذا لم تكن لديك سوى BuildId للمكتبات المشتركة في تطبيقك، من المحتمل
أنّك لا تستخدم الموقع التلقائي العادي للمكتبات المشتركة. في هذه الحالة، قد لا يتمكّن Crashlytics من تحديد مكان
BuildId المرتبطة. ننصحك بالتفكير في استخدام المعيار
مكان المكتبات المشتركة.
تأكَّد من عدم إزالة BuildId أثناء عملية التصميم.
تجدر الإشارة إلى أنّ النصائح التالية لتحديد المشاكل وحلّها تنطبق على أخطاء ANR والأخطاء الأصلية
الأعطال.
تحقَّق من توفّر BuildId من خلال تشغيل readelf -n على الملفات الثنائية. في حال حذف
BuildId غير موجودة، ثم أضف -Wl,--build-id إلى علامات
نظام التصميم.
التأكد من عدم إزالة BuildId عن غير قصد جهدًا
لتقليل حجم APK.
إذا احتفظت بنسخ من المكتبة مقتطعة وغير مخططة، فاحرص على
يشير إلى الإصدار الصحيح في التعليمات البرمجية.
الاختلافات
بين تقارير أخطاء ANR في لوحة بيانات Crashlytics
وGoogle Play Console
قد يكون هناك عدم تطابق بين عدد أخطاء ANR بين Google Play
Crashlytics وهذا أمر متوقّع بسبب الاختلاف في آلية جمع بيانات ANR والإبلاغ عنها. يُبلغ Crashlytics عن أخطاء ANR عند بدء تشغيل التطبيق
next، في حين تُرسِل "مؤشرات Android الحيوية" بيانات أخطاء ANR بعد حدوثها.
بالإضافة إلى ذلك، لا يعرض تطبيق "Crashlytics" إلا أخطاء ANR التي تحدث على الأجهزة التي تعمل.
Android 11 والإصدارات الأحدث، مقارنةً بـ Google Play الذي يعرض أخطاء ANR من الأجهزة التي تحتوي على
تم قبول الموافقة على جمع البيانات و"خدمات Google Play".
الاختلافات
بين عمليات تتبُّع تسلسل استدعاء الدوال البرمجية في NDK في لوحة بيانات Crashlytics وlogcat
لكل من سلسلتَي أدوات LLVM وGNU إعدادات تلقائية ومعالجات مختلفة للقراءة فقط.
برامج ثنائية في تطبيقك، ما قد يؤدي إلى إنشاء عمليات تتبُّع تسلسل استدعاء الدوال البرمجية غير متسقة
في وحدة تحكّم Firebase. للحدّ من ذلك، أضِف علامات الربط التالية
إلى عملية الإنشاء:
إذا كنت تستخدم رابط lld من سلسلة أدوات LLVM، أضِف ما يلي:
-Wl,--no-rosegment
إذا كنت تستخدم رابط ld.gold من سلسلة أدوات GNU، أضِف ما يلي:
-Wl,--rosegment
إذا كنت لا تزال ترى عدم اتساق في تتبع تسلسل استدعاء الدوال البرمجية (أو إذا لم يكن أي من العلامتَين متعلقًا بمجموعة أدوات التطوير)، جرِّب إضافة ما يلي إلى عملية الإنشاء بدلاً من ذلك:
-fno-omit-frame-pointer
كيف يمكنني استخدام
ملف الترميز الثنائي الخاص بي لإنشاء ملف الترميز في Breakpad لـ NDK؟
يجمع المكوّن الإضافي Crashlyticsمنشئ ملفات رموز Breakpad المخصّص
إذا كنت تفضّل استخدام ملف ثنائي خاص بك لإنشاء ملفات رموز Breakpad (مثلاً، إذا كنت تفضّل إنشاء جميع الملفات التنفيذية الأصلية في سلسلة الإنشاء من المصدر)، استخدِم سمة الإضافة symbolGeneratorBinary الاختيارية لتحديد مسار الملف التنفيذي.
يمكنك تحديد مسار البرنامج الثنائي لمنشئ ملف رمز Breakpad في
بطريقتين:
الخيار 1: تحديد المسار من خلال إضافة امتداد firebaseCrashlytics
في ملف build.gradle
أضِف ما يلي إلى ملف build.gradle.kts على مستوى التطبيق:
الإصدار 3.0.0 من مكوّن 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")
}
}
}
}
}
الخيار 2: تحديد المسار من خلال سطر سمة في ملف Gradle
properties
يمكنك استخدام سمة com.google.firebase.crashlytics.breakpadBinary
لتحديد مسار الملف القابل للتنفيذ.
يمكنك تعديل ملف خصائص Gradle يدويًا أو تعديل الملف
من خلال سطر الأوامر. على سبيل المثال، لتحديد المسار عبر الأمر
سطر، استخدم أمرًا مثل ما يلي:
لماذا أرى أعطالًا
من .kt ملفًا مصنّفًا على أنّه يتضمن مشاكل .java؟
عندما يستخدم أحد التطبيقات أداة إخفاء مفاتيح فك التشفير لا تكشف امتداد الملف،
تنشئ الأداة Crashlytics كل مشكلة بامتداد الملف .java تلقائيًا.
لكي تتمكّن أداة Crashlytics من إنشاء مشاكل باستخدام إضافة الملف الصحيحة،
تأكّد من أنّ تطبيقك يستخدم الإعدادات التالية:
استخدام الإصدار 4.2.0 من Android Gradle أو إصدار أحدث
يستخدم R8 مع تفعيل التشويش. لتحديث تطبيقك إلى الإصدار R8، اتّبِع المستندات التالية.
يُرجى العِلم أنّه بعد التحديث إلى الإعداد الموضّح أعلاه، قد تبدأ في رؤية
مشاكل .kt جديدة هي نُسخ طبق الأصل من مشاكل .java الحالية. يمكنك الاطّلاع على الأسئلة الشائعة لمعرفة المزيد من المعلومات عن هذه الحالة.
لماذا أرى
.kt مشكلة مكرّرة لحالة
.java حالية؟
اعتبارًا من منتصف كانون الأول (ديسمبر) 2021، Crashlytics تحسين التوافق مع التطبيقات
التي تستخدم لغة Kotlin
حتى وقت قريب، لم تكشف أدوات التشويش المتاحة امتداد الملف، لذا
تم إنشاء كل مشكلة بامتداد الملف .java تلقائيًا من قِبل "Crashlytics".
ومع ذلك، اعتبارًا من الإصدار 4.2.0 من "نظام Gradle المتوافق مع Android"، يتيح R8 استخدام إضافات الملفات.
من خلال هذا التعديل، يستطيع "Crashlytics" الآن تحديد ما إذا تم استخدام كل صف ضمن
التطبيق مكتوب بلغة Kotlin ويتضمن اسم الملف الصحيح في المشكلة
التوقيع. يتم الآن تحديد مصدر الأعطال بشكل صحيح على أنّه ملفات .kt (حسب الاقتضاء)
إذا كان تطبيقك يتضمّن الإعدادات التالية:
يستخدم تطبيقك الإصدار 4.2.0 من Android Gradle أو إصدارًا أحدث.
يستخدم تطبيقك الإصدار R8 مع تفعيل ميزة إخفاء مفاتيح فك التشفير.
بما أنّ الأعطال الجديدة تتضمّن الآن امتداد الملف الصحيح في المشكلة
التوقيعات، قد تظهر لك مشاكل .kt جديدة هي في الواقع نُسخ مكررة من
المشاكل الحالية في التصنيف .java. في وحدة تحكّم Firebase، نحاول تحديد
وإبلاغك إذا كانت مشكلة .kt جديدة هي نسخة محتملة من
مشكلة حالية مصنّفة على أنّها .java.
مَن يمكنه عرض الملاحظات حول مشكلة معيّنة وكتابتها وحذفها؟
تتيح الملاحظات لأعضاء المشروع التعليق على مشاكل معيّنة من خلال طرح أسئلة أو إرسال رسائل بشأن الحالة
أو غيرها.
عندما ينشر أحد أعضاء المشروع ملاحظة، يتم تصنيفها بعنوان البريد الإلكتروني من Google
الحساب. يظهر عنوان البريد الإلكتروني هذا، بالإضافة إلى المذكرة، لجميع
أعضاء المشروع الذين لديهم إذن بالاطّلاع على المذكرة.
يوضِّح ما يلي الأذونات المطلوبة لعرض
الملاحظات وكتابتها وحذفها:
يمكن لأعضاء المشروع الذين لديهم أي من الأدوار التالية عرض القوائم الحالية وحذفها
الملاحظات وكتابة ملاحظات جديدة حول مشكلة ما.
مَن يمكنه عرض الملاحظات حول مشكلة معيّنة وكتابتها وحذفها؟
تتيح الملاحظات لأعضاء المشروع التعليق على مشاكل معيّنة من خلال طرح أسئلة أو إرسال رسائل بشأن الحالة
أو غيرها.
عندما ينشر أحد أعضاء المشروع ملاحظة، يتم تصنيفها بعنوان البريد الإلكتروني من Google
الحساب. يظهر عنوان البريد الإلكتروني هذا، بالإضافة إلى المذكرة، لجميع
أعضاء المشروع الذين لديهم إذن بالاطّلاع على المذكرة.
يوضِّح ما يلي الأذونات المطلوبة لعرض
الملاحظات وكتابتها وحذفها:
يمكن لأعضاء المشروع الذين لديهم أي من الأدوار التالية الاطّلاع على الملاحظات
الحالية وحذفها وكتابة ملاحظات جديدة حول مشكلة.
يستخدم التطبيق أيضًا
حزمة تطوير برامج (SDK) واحدة (Google Mobile Ads) لا تظهر أعطالاً
إذا كان مشروعك يستخدم Crashlytics إلى جانب حزمة SDK Google Mobile Ads،
من المحتمل أن يتداخل أدوات تسجيل الأعطال عند
تسجيل معالجات الاستثناءات. لحلّ المشكلة، أوقِف ميزة الإبلاغ عن الأعطال في
حزمة SDK الخاصة بمنصّة Mobile Ads من خلال الاتصال برقم disableSDKCrashReporting.
أين تقع مجموعة بياناتي على BigQuery؟
بعد ربط Crashlytics بأداة BigQuery، يتم حذف مجموعات البيانات الجديدة التي تنشئها.
تقع تلقائيًا في الولايات المتحدة، بغض النظر عن موقع
مشروع على Firebase.
دعم المنصة
هل يتيح Crashlytics استخدام armeabi؟
لا يتوافق NDK لنظام التشغيل Firebase Crashlytics مع ARMv5 (armeabi).
تم إيقاف واجهة برمجة التطبيقات هذه اعتبارًا من الإصدار r17 من NDK.
المشاكل التي تم التراجع عنها
ما معنى الانحدار
المشكلة؟
حدثت إعادة انحدار في مشكلة تم إغلاقها سابقًا، ولكن
Crashlytics تلقّى تقريرًا جديدًا يفيد بإعادة حدوث المشكلة.
تعيد خدمة Crashlytics تلقائيًا فتح هذه المشاكل التي تراجعت تراجعًا، بحيث يمكنك
ومعالجتها بالشكل المناسب لتطبيقك.
في ما يلي مثال على سيناريو يوضّح كيف يصنف Crashlytics
مشكلة على أنّها انحدار:
لأول مرة على الإطلاق، يتلقّى Crashlytics تقرير أعطال بشأن حوادث السير.
"A". يفتح Crashlytics مشكلة مقابلة لهذا العُطل (المشكلة "أ").
إصلاح هذا الخطأ بسرعة، وإغلاق المشكلة "أ"، ثم طرح إصدار جديد من
تطبيقك.
تلقّي تقرير آخر بشأن المشكلة "أ" في Crashlytics بعد إغلاق
المشكلة.
إذا كان التقرير واردًا من إصدار تطبيق كان فريق Crashlyticsعلى دراية به
عند إغلاق المشكلة (أي أنّ الإصدار أرسل تقرير تعطُّل
لأي تعطُّل على الإطلاق)، لن يعتبر فريق Crashlytics
أنّ المشكلة قد عادت للظهور. ستظلّ المشكلة مغلقة.
إذا كان التقرير من إصدار تطبيق Crashlyticsلم ليس
إلى معرفة عند إنهاء المشكلة (أي أنّ الإصدار احتوى على
لم يرسل أي تقرير أعطال على الإطلاق)، ثم
تعتبر الإضافة "Crashlytics" أنّ المشكلة قد تراجعت، وسيعيد فتح
المشكلة.
عندما تتراجع إحدى المشكلات، نرسل تنبيه كشف الانحدار ونضيف
إشارة تراجع إلى المشكلة، لإعلامك بأنّ Crashlytics
أعاد فتح المشكلة. إذا كنت لا تريد إعادة فتح مشكلة بسبب اتّباعنا لخوارزمية التراجُع، يمكنك "كتم صوت" المشكلة بدلاً من إغلاقها.
لماذا أرى تراجعًا
في إصدارات التطبيق القديمة؟
إذا كان التقرير من إصدار تطبيق قديم لم يسبق له إرسال أي تقارير أعطال في
كل ذلك عند إغلاق المشكلة، سينظر Crashlytics في المشكلة.
التراجع عنه وإعادة فتح المشكلة.
يمكن أن يحدث هذا الموقف في الموقف التالي: لقد أصلحت خطأً
بإصدار جديد من تطبيقك، ولكن لا يزال لديك مستخدمون تستخدم إصدارات قديمة
بدون إصلاح الخطأ. إذا حدث أنّ أحد هذه الإصدارات القديمة لم يرسل أبدًا
أي تقارير أعطال عند إغلاق المشكلة، وبدأ هؤلاء المستخدمون
بمواجهة الخطأ، ستؤدي تقارير الأعطال هذه إلى إعادة ظهور المشكلة.
إذا كنت لا تريد إعادة فتح مشكلة بسبب خوارزمية الانحدار، يمكنك "كتم صوت"
المشكلة بدلاً من إغلاقها.